aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/optimizer.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-07-11 11:08:10 -0700
committerGitHub <noreply@github.com>2023-07-11 18:08:10 +0000
commitcabd6e8a107127ff02f0b514148f648fb2472a58 (patch)
tree503576bebc0f89d59bc198bb7d54f6284737b5b9 /Python/optimizer.c
parent292ac4bfe92768140c2d383fd329cfa1949869b2 (diff)
downloadcpython-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.c15
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];