diff options
author | Guido van Rossum <guido@python.org> | 2023-07-11 11:08:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-11 18:08:10 +0000 |
commit | cabd6e8a107127ff02f0b514148f648fb2472a58 (patch) | |
tree | 503576bebc0f89d59bc198bb7d54f6284737b5b9 /Python/optimizer.c | |
parent | 292ac4bfe92768140c2d383fd329cfa1949869b2 (diff) | |
download | cpython-cabd6e8a107127ff02f0b514148f648fb2472a58.tar.gz cpython-cabd6e8a107127ff02f0b514148f648fb2472a58.zip |
gh-106529: Support JUMP_BACKWARD in Tier 2 (uops) (#106543)
During superblock generation, a JUMP_BACKWARD instruction is translated to either a JUMP_TO_TOP micro-op (when the target of the jump is exactly the beginning of the superblock, closing the loop), or a SAVE_IP + EXIT_TRACE pair, when the jump goes elsewhere.
The new JUMP_TO_TOP instruction includes a CHECK_EVAL_BREAKER() call, so a closed loop can still be interrupted.
Diffstat (limited to 'Python/optimizer.c')
-rw-r--r-- | Python/optimizer.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/Python/optimizer.c b/Python/optimizer.c index 08073193c02..8d4162b44c2 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -372,9 +372,7 @@ translate_bytecode_to_trace( _PyUOpInstruction *trace, int buffer_size) { -#ifdef Py_DEBUG _Py_CODEUNIT *initial_instr = instr; -#endif int trace_length = 0; int max_length = buffer_size; @@ -456,6 +454,19 @@ translate_bytecode_to_trace( break; } + case JUMP_BACKWARD: + { + if (instr + 2 - oparg == initial_instr + && trace_length + 3 <= max_length) + { + ADD_TO_TRACE(JUMP_TO_TOP, 0); + } + else { + DPRINTF(2, "JUMP_BACKWARD not to top ends trace\n"); + } + goto done; + } + default: { const struct opcode_macro_expansion *expansion = &_PyOpcode_macro_expansion[opcode]; |