A smattering of cleanups in uop debug output and lltrace (#112980)

* Include destination T1 opcode in Error debug message
* Include destination T1 opcode in DEOPT debug message
* Remove obsolete comment from remove_unneeded_uops
* Change lltrace_instruction() to print caller's opcode/oparg
This commit is contained in:
Guido van Rossum 2023-12-11 16:42:30 -08:00 committed by GitHub
parent fdee7b7b3e
commit 5b86644338
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 10 deletions

View file

@ -135,14 +135,14 @@ dump_stack(_PyInterpreterFrame *frame, PyObject **stack_pointer)
static void static void
lltrace_instruction(_PyInterpreterFrame *frame, lltrace_instruction(_PyInterpreterFrame *frame,
PyObject **stack_pointer, PyObject **stack_pointer,
_Py_CODEUNIT *next_instr) _Py_CODEUNIT *next_instr,
int opcode,
int oparg)
{ {
if (frame->owner == FRAME_OWNED_BY_CSTACK) { if (frame->owner == FRAME_OWNED_BY_CSTACK) {
return; return;
} }
dump_stack(frame, stack_pointer); dump_stack(frame, stack_pointer);
int oparg = next_instr->op.arg;
int opcode = next_instr->op.code;
const char *opname = _PyOpcode_OpName[opcode]; const char *opname = _PyOpcode_OpName[opcode];
assert(opname != NULL); assert(opname != NULL);
int offset = (int)(next_instr - _PyCode_CODE(_PyFrame_GetCode(frame))); int offset = (int)(next_instr - _PyCode_CODE(_PyFrame_GetCode(frame)));
@ -1051,9 +1051,10 @@ pop_2_error_tier_two:
pop_1_error_tier_two: pop_1_error_tier_two:
STACK_SHRINK(1); STACK_SHRINK(1);
error_tier_two: error_tier_two:
DPRINTF(2, "Error: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d]\n", DPRINTF(2, "Error: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d -> %s]\n",
uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target, uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target,
(int)(next_uop - current_executor->trace - 1)); (int)(next_uop - current_executor->trace - 1),
_PyOpcode_OpName[frame->instr_ptr->op.code]);
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist); OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
frame->return_offset = 0; // Don't leave this random frame->return_offset = 0; // Don't leave this random
_PyFrame_SetStackPointer(frame, stack_pointer); _PyFrame_SetStackPointer(frame, stack_pointer);
@ -1064,14 +1065,15 @@ error_tier_two:
deoptimize: deoptimize:
// On DEOPT_IF we just repeat the last instruction. // On DEOPT_IF we just repeat the last instruction.
// This presumes nothing was popped from the stack (nor pushed). // This presumes nothing was popped from the stack (nor pushed).
DPRINTF(2, "DEOPT: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d]\n", frame->instr_ptr = next_uop[-1].target + _PyCode_CODE(_PyFrame_GetCode(frame));
DPRINTF(2, "DEOPT: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d -> %s]\n",
uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target, uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target,
(int)(next_uop - current_executor->trace - 1)); (int)(next_uop - current_executor->trace - 1),
_PyOpcode_OpName[frame->instr_ptr->op.code]);
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist); OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
UOP_STAT_INC(uopcode, miss); UOP_STAT_INC(uopcode, miss);
frame->return_offset = 0; // Dispatch to frame->instr_ptr frame->return_offset = 0; // Dispatch to frame->instr_ptr
_PyFrame_SetStackPointer(frame, stack_pointer); _PyFrame_SetStackPointer(frame, stack_pointer);
frame->instr_ptr = next_uop[-1].target + _PyCode_CODE(_PyFrame_GetCode(frame));
Py_DECREF(current_executor); Py_DECREF(current_executor);
// Fall through // Fall through
// Jump here from ENTER_EXECUTOR // Jump here from ENTER_EXECUTOR

View file

@ -81,7 +81,7 @@
/* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */ /* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */
#ifdef LLTRACE #ifdef LLTRACE
#define PRE_DISPATCH_GOTO() if (lltrace >= 5) { \ #define PRE_DISPATCH_GOTO() if (lltrace >= 5) { \
lltrace_instruction(frame, stack_pointer, next_instr); } lltrace_instruction(frame, stack_pointer, next_instr, opcode, oparg); }
#else #else
#define PRE_DISPATCH_GOTO() ((void)0) #define PRE_DISPATCH_GOTO() ((void)0)
#endif #endif

View file

@ -15,7 +15,6 @@
static void static void
remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size) remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
{ {
// Note that we don't enter stubs, those SET_IPs are needed.
int last_set_ip = -1; int last_set_ip = -1;
bool maybe_invalid = false; bool maybe_invalid = false;
for (int pc = 0; pc < buffer_size; pc++) { for (int pc = 0; pc < buffer_size; pc++) {