diff options
author | Mark Shannon <mark@hotpy.org> | 2025-02-28 18:00:38 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-28 18:00:38 (GMT) |
commit | 54965f3fb25b381995a73b09d928c344bd2b86bd (patch) | |
tree | cf2f71ac2775a4cfec347a70fd123d176c353948 /Python/optimizer.c | |
parent | ab11c097052757b79060c75dd4835c2431e752b7 (diff) | |
download | cpython-54965f3fb25b381995a73b09d928c344bd2b86bd.zip cpython-54965f3fb25b381995a73b09d928c344bd2b86bd.tar.gz cpython-54965f3fb25b381995a73b09d928c344bd2b86bd.tar.bz2 |
GH-130296: Avoid stack transients in four instructions. (GH-130310)
* Combine _GUARD_GLOBALS_VERSION_PUSH_KEYS and _LOAD_GLOBAL_MODULE_FROM_KEYS into _LOAD_GLOBAL_MODULE
* Combine _GUARD_BUILTINS_VERSION_PUSH_KEYS and _LOAD_GLOBAL_BUILTINS_FROM_KEYS into _LOAD_GLOBAL_BUILTINS
* Combine _CHECK_ATTR_MODULE_PUSH_KEYS and _LOAD_ATTR_MODULE_FROM_KEYS into _LOAD_ATTR_MODULE
* Remove stack transient in LOAD_ATTR_WITH_HINT
Diffstat (limited to 'Python/optimizer.c')
-rw-r--r-- | Python/optimizer.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/Python/optimizer.c b/Python/optimizer.c index d86d58d..e055234 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -230,16 +230,18 @@ _PyUOpPrint(const _PyUOpInstruction *uop) } switch(uop->format) { case UOP_FORMAT_TARGET: - printf(" (%d, target=%d, operand=%#" PRIx64, + printf(" (%d, target=%d, operand0=%#" PRIx64 ", operand1=%#" PRIx64, uop->oparg, uop->target, - (uint64_t)uop->operand0); + (uint64_t)uop->operand0, + (uint64_t)uop->operand1); break; case UOP_FORMAT_JUMP: - printf(" (%d, jump_target=%d, operand=%#" PRIx64, + printf(" (%d, jump_target=%d, operand0=%#" PRIx64 ", operand1=%#" PRIx64, uop->oparg, uop->jump_target, - (uint64_t)uop->operand0); + (uint64_t)uop->operand0, + (uint64_t)uop->operand1); break; default: printf(" (%d, Unknown format)", uop->oparg); @@ -682,7 +684,7 @@ translate_bytecode_to_trace( // Add one to account for the actual opcode/oparg pair: int offset = expansion->uops[i].offset + 1; switch (expansion->uops[i].size) { - case OPARG_FULL: + case OPARG_SIMPLE: assert(opcode != JUMP_BACKWARD_NO_INTERRUPT && opcode != JUMP_BACKWARD); break; case OPARG_CACHE_1: @@ -716,6 +718,21 @@ translate_bytecode_to_trace( } #endif break; + case OPERAND1_1: + assert(trace[trace_length-1].opcode == uop); + operand = read_u16(&instr[offset].cache); + trace[trace_length-1].operand1 = operand; + continue; + case OPERAND1_2: + assert(trace[trace_length-1].opcode == uop); + operand = read_u32(&instr[offset].cache); + trace[trace_length-1].operand1 = operand; + continue; + case OPERAND1_4: + assert(trace[trace_length-1].opcode == uop); + operand = read_u64(&instr[offset].cache); + trace[trace_length-1].operand1 = operand; + continue; default: fprintf(stderr, "opcode=%d, oparg=%d; nuops=%d, i=%d; size=%d, offset=%d\n", |