From 2589eb019052dd7caa471b411a8b996ead8fb324 Mon Sep 17 00:00:00 2001 From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 17 Oct 2025 18:09:25 +0100 Subject: [PATCH] Re-enable the optimizer --- Include/internal/pycore_optimizer.h | 3 +- Lib/test/test_capi/test_opt.py | 72 +---- Python/optimizer.c | 11 +- Python/optimizer_analysis.c | 16 +- Python/optimizer_bytecodes.c | 8 +- Python/optimizer_cases.c.h | 8 +- Python/optimizer_symbols.c | 13 +- hello.gvz | 472 ---------------------------- 8 files changed, 50 insertions(+), 553 deletions(-) diff --git a/Include/internal/pycore_optimizer.h b/Include/internal/pycore_optimizer.h index c7c304943bf8..748bf854768c 100644 --- a/Include/internal/pycore_optimizer.h +++ b/Include/internal/pycore_optimizer.h @@ -88,7 +88,8 @@ PyAPI_FUNC(void) _Py_Executors_InvalidateCold(PyInterpreterState *interp); #define TRACE_STACK_SIZE 5 -int _Py_uop_analyze_and_optimize(_PyInterpreterFrame *frame, +int _Py_uop_analyze_and_optimize( + PyFunctionObject *initial_func, _PyUOpInstruction *trace, int trace_len, int curr_stackentries, _PyBloomFilter *dependencies); diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index c3fed50cee97..3cc8fbe0de0a 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -17,6 +17,8 @@ _testinternalcapi = import_helper.import_module("_testinternalcapi") from _testinternalcapi import TIER2_THRESHOLD +# We need one more iteration as one iteration is spent on tracing. +TIER2_THRESHOLD = TIER2_THRESHOLD + 1 #For test of issue 136154 GLOBAL_136154 = 42 @@ -139,6 +141,7 @@ class TestUops(unittest.TestCase): self.assertIn("_JUMP_TO_TOP", uops) self.assertIn("_LOAD_FAST_BORROW_0", uops) + @unittest.skip("gh-139109 WIP") def test_extended_arg(self): "Check EXTENDED_ARG handling in superblock creation" ns = {} @@ -422,32 +425,6 @@ class TestUops(unittest.TestCase): uops = get_opnames(ex) self.assertIn("_FOR_ITER_TIER_TWO", uops) - def test_confidence_score(self): - def testfunc(n): - bits = 0 - for i in range(n): - if i & 0x01: - bits += 1 - if i & 0x02: - bits += 1 - if i&0x04: - bits += 1 - if i&0x08: - bits += 1 - if i&0x10: - bits += 1 - return bits - - x = testfunc(TIER2_THRESHOLD * 2) - - self.assertEqual(x, TIER2_THRESHOLD * 5) - ex = get_first_executor(testfunc) - self.assertIsNotNone(ex) - ops = list(iter_opnames(ex)) - #Since branch is 50/50 the trace could go either way. - count = ops.count("_GUARD_IS_TRUE_POP") + ops.count("_GUARD_IS_FALSE_POP") - self.assertLessEqual(count, 2) - @requires_specialization @unittest.skipIf(Py_GIL_DISABLED, "optimizer not yet supported in free-threaded builds") @@ -651,7 +628,7 @@ class TestUopsOptimization(unittest.TestCase): x = range(i) return x - testfunc(_testinternalcapi.TIER2_THRESHOLD) + testfunc(_testinternalcapi.TIER2_THRESHOLD + 1) ex = get_first_executor(testfunc) assert ex is not None @@ -847,38 +824,7 @@ class TestUopsOptimization(unittest.TestCase): self.assertLessEqual(len(guard_nos_unicode_count), 1) self.assertIn("_COMPARE_OP_STR", uops) - def test_type_inconsistency(self): - ns = {} - src = textwrap.dedent(""" - def testfunc(n): - for i in range(n): - x = _test_global + _test_global - """) - exec(src, ns, ns) - testfunc = ns['testfunc'] - ns['_test_global'] = 0 - _, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD - 1) - self.assertIsNone(ex) - ns['_test_global'] = 1 - _, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD - 1) - self.assertIsNotNone(ex) - uops = get_opnames(ex) - self.assertNotIn("_GUARD_TOS_INT", uops) - self.assertNotIn("_GUARD_NOS_INT", uops) - self.assertNotIn("_BINARY_OP_ADD_INT", uops) - self.assertNotIn("_POP_TWO_LOAD_CONST_INLINE_BORROW", uops) - # Try again, but between the runs, set the global to a float. - # This should result in no executor the second time. - ns = {} - exec(src, ns, ns) - testfunc = ns['testfunc'] - ns['_test_global'] = 0 - _, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD - 1) - self.assertIsNone(ex) - ns['_test_global'] = 3.14 - _, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD - 1) - self.assertIsNone(ex) - + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_checks_sequential(self): def dummy12(x): return x - 1 @@ -907,6 +853,7 @@ class TestUopsOptimization(unittest.TestCase): largest_stack = _testinternalcapi.get_co_framesize(dummy13.__code__) self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands) + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_checks_nested(self): def dummy12(x): return x + 3 @@ -937,6 +884,7 @@ class TestUopsOptimization(unittest.TestCase): ) self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands) + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_checks_several_calls(self): def dummy12(x): return x + 3 @@ -972,6 +920,7 @@ class TestUopsOptimization(unittest.TestCase): ) self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands) + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_checks_several_calls_different_order(self): # same as `several_calls` but with top-level calls reversed def dummy12(x): @@ -1008,6 +957,7 @@ class TestUopsOptimization(unittest.TestCase): ) self.assertIn(("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands) + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_complex(self): def dummy0(x): return x @@ -1057,6 +1007,7 @@ class TestUopsOptimization(unittest.TestCase): ("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands ) + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_checks_large_framesize(self): # Create a function with a large framesize. This ensures _CHECK_STACK_SPACE is # actually doing its job. Note that the resulting trace hits @@ -1118,6 +1069,7 @@ class TestUopsOptimization(unittest.TestCase): ("_CHECK_STACK_SPACE_OPERAND", largest_stack), uops_and_operands ) + @unittest.skip("gh-139109 WIP") def test_combine_stack_space_checks_recursion(self): def dummy15(x): while x > 0: @@ -2511,7 +2463,7 @@ class TestUopsOptimization(unittest.TestCase): del email.jit_testing - testfunc(_testinternalcapi.TIER2_THRESHOLD) + testfunc(_testinternalcapi.TIER2_THRESHOLD + 1) ex = get_first_executor(testfunc) assert ex is not None """)) diff --git a/Python/optimizer.c b/Python/optimizer.c index 67368fefa345..98ac04574776 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -854,7 +854,7 @@ _PyJIT_InitializeTracing(PyThreadState *tstate, _PyInterpreterFrame *frame, _Py_ tstate->interp->jit_tracer_initial_code = (PyCodeObject *)Py_NewRef(code); tstate->interp->jit_tracer_initial_func = (PyFunctionObject *)Py_NewRef(_PyFrame_GetFunction(frame)); tstate->interp->jit_tracer_previous_exit = exit; - memset(&tstate->interp->jit_tracer_dependencies.bits, 0, sizeof(tstate->interp->jit_tracer_dependencies.bits)); + _Py_BloomFilter_Init(&tstate->interp->jit_tracer_dependencies); tstate->interp->jit_tracer_initial_stack_depth = curr_stackdepth; tstate->interp->jit_tracer_initial_chain_depth = chain_depth; tstate->interp->jit_tracer_current_frame = frame; @@ -1177,8 +1177,7 @@ uop_optimize( _PyExecutorObject **exec_ptr, bool progress_needed) { - _PyBloomFilter dependencies; - _Py_BloomFilter_Init(&dependencies); + _PyBloomFilter *dependencies = &tstate->interp->jit_tracer_dependencies; PyInterpreterState *interp = _PyInterpreterState_GET(); if (interp->jit_uop_buffer == NULL) { interp->jit_uop_buffer = (_PyUOpInstruction *)_PyObject_VirtualAlloc(UOP_BUFFER_SIZE); @@ -1203,9 +1202,9 @@ uop_optimize( assert(length < UOP_MAX_TRACE_LENGTH); OPT_STAT_INC(traces_created); if (!is_noopt) { - length = _Py_uop_analyze_and_optimize(frame, buffer, + length = _Py_uop_analyze_and_optimize(tstate->interp->jit_tracer_initial_func, buffer, length, - curr_stackentries, &dependencies); + curr_stackentries, dependencies); if (length <= 0) { return length; } @@ -1228,7 +1227,7 @@ uop_optimize( OPT_HIST(effective_trace_length(buffer, length), optimized_trace_length_hist); length = prepare_for_execution(buffer, length); assert(length <= UOP_MAX_TRACE_LENGTH); - _PyExecutorObject *executor = make_executor_from_uops(buffer, length, &dependencies, tstate->interp->jit_tracer_initial_chain_depth); + _PyExecutorObject *executor = make_executor_from_uops(buffer, length, dependencies, tstate->interp->jit_tracer_initial_chain_depth); if (executor == NULL) { return -1; } diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c index b90575abf51c..814575e50978 100644 --- a/Python/optimizer_analysis.c +++ b/Python/optimizer_analysis.c @@ -519,7 +519,7 @@ remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size) // > 0 - length of optimized trace int _Py_uop_analyze_and_optimize( - _PyInterpreterFrame *frame, + PyFunctionObject *initial_func, _PyUOpInstruction *buffer, int length, int curr_stacklen, @@ -528,13 +528,13 @@ _Py_uop_analyze_and_optimize( { OPT_STAT_INC(optimizer_attempts); - // int err = optimize_uops( - // _PyFrame_GetFunction(frame), buffer, - // length, curr_stacklen, dependencies); - // - // if (err == 0) { - // return err; - // } + int err = optimize_uops( + initial_func, buffer, + length, curr_stacklen, dependencies); + + if (err == 0) { + return err; + } assert(length > 0); diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index da3d3c96bc1d..f9f8c15ab964 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -775,7 +775,9 @@ dummy_func(void) { SAVE_STACK(); PyCodeObject *co = get_current_code_object(ctx); ctx->frame->stack_pointer = stack_pointer; - frame_pop(ctx); + if (frame_pop(ctx)) { + break; + } stack_pointer = ctx->frame->stack_pointer; /* Stack space handling */ @@ -794,7 +796,9 @@ dummy_func(void) { SYNC_SP(); PyCodeObject *co = get_current_code_object(ctx); ctx->frame->stack_pointer = stack_pointer; - frame_pop(ctx); + if (frame_pop(ctx)) { + break; + } stack_pointer = ctx->frame->stack_pointer; res = sym_new_unknown(ctx); diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index ef76374d244f..3d31c7f04dad 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1118,7 +1118,9 @@ assert(WITHIN_STACK_BOUNDS()); PyCodeObject *co = get_current_code_object(ctx); ctx->frame->stack_pointer = stack_pointer; - frame_pop(ctx); + if (frame_pop(ctx)) { + break; + } stack_pointer = ctx->frame->stack_pointer; assert(corresponding_check_stack == NULL); assert(co != NULL); @@ -3011,7 +3013,9 @@ JitOptRef res; PyCodeObject *co = get_current_code_object(ctx); ctx->frame->stack_pointer = stack_pointer; - frame_pop(ctx); + if (frame_pop(ctx)) { + break; + } stack_pointer = ctx->frame->stack_pointer; res = sym_new_unknown(ctx); assert(corresponding_check_stack == NULL); diff --git a/Python/optimizer_symbols.c b/Python/optimizer_symbols.c index 0e6884b99232..e0563122e018 100644 --- a/Python/optimizer_symbols.c +++ b/Python/optimizer_symbols.c @@ -818,7 +818,11 @@ _Py_uop_frame_new( JitOptRef *args, int arg_len) { - assert(ctx->curr_frame_depth < MAX_ABSTRACT_FRAME_DEPTH); + if (ctx->curr_frame_depth >= MAX_ABSTRACT_FRAME_DEPTH) { + ctx->done = true; + ctx->out_of_space = true; + return NULL; + } _Py_UOpsAbstractFrame *frame = &ctx->frames[ctx->curr_frame_depth]; frame->stack_len = co->co_stacksize; @@ -907,7 +911,12 @@ _Py_uop_frame_pop(JitOptContext *ctx) _Py_UOpsAbstractFrame *frame = ctx->frame; ctx->n_consumed = frame->locals; ctx->curr_frame_depth--; - assert(ctx->curr_frame_depth >= 1); + // TODO gh-139109: Handle trace recording underflow + if (ctx->curr_frame_depth == 0) { + ctx->done = true; + ctx->out_of_space = true; + return 1; + } ctx->frame = &ctx->frames[ctx->curr_frame_depth - 1]; return 0; diff --git a/hello.gvz b/hello.gvz index 4260bf1631ac..9448c085123d 100644 --- a/hello.gvz +++ b/hello.gvz @@ -2,477 +2,5 @@ digraph ideal { rankdir = "LR" -executor_0x65462fd7c7c0 [ - shape = none - label = < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Executor
No code object
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_CHECK_PEP_523
_CHECK_FUNCTION_VERSION
_CHECK_FUNCTION_EXACT_ARGS
_CHECK_STACK_SPACE
_CHECK_RECURSION_REMAINING
_INIT_CALL_PY_EXACT_ARGS_1
_SAVE_RETURN_OFFSET
_PUSH_FRAME
_GUARD_IP
_TIER2_RESUME_CHECK
_LOAD_FAST_BORROW_0
_SET_IP
_GUARD_TOS_TUPLE
_UNPACK_SEQUENCE_TWO_TUPLE
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_1
_STORE_FAST_2
_CHECK_VALIDITY
_LOAD_SMALL_INT_0
_SET_IP
_STORE_FAST_3
_CHECK_VALIDITY
_GUARD_GLOBALS_VERSION
_LOAD_GLOBAL_BUILTINS
_PUSH_NULL_CONDITIONAL
_LOAD_FAST_BORROW_2
_SET_IP
_CALL_BUILTIN_CLASS
_TIER2_RESUME_CHECK
_CHECK_VALIDITY
_SET_IP
_GET_ITER
_CHECK_VALIDITY
_SET_IP
_FOR_ITER_TIER_TWO
_GUARD_IP
_CHECK_VALIDITY
_SET_IP
_GUARD_TOS_TUPLE
_UNPACK_SEQUENCE_TWO_TUPLE
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_4
_STORE_FAST_5
_CHECK_VALIDITY
_LOAD_FAST_BORROW_3
_LOAD_GLOBAL_MODULE
_PUSH_NULL_CONDITIONAL
_LOAD_FAST_BORROW_1
_LOAD_FAST_BORROW_4
_SET_IP
_CHECK_PEP_523
_CHECK_FUNCTION_VERSION
_CHECK_FUNCTION_EXACT_ARGS
_CHECK_STACK_SPACE
_CHECK_RECURSION_REMAINING
_INIT_CALL_PY_EXACT_ARGS_2
_SAVE_RETURN_OFFSET
_PUSH_FRAME
_GUARD_IP
_TIER2_RESUME_CHECK
_LOAD_CONST
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_MULTIPLY_INT
_LOAD_SMALL_INT_2
_SET_IP
_BINARY_OP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_0
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_SET_IP
_GUARD_BINARY_OP_EXTEND
_BINARY_OP_EXTEND
_CHECK_VALIDITY
_SET_IP
_RETURN_VALUE
_GUARD_IP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_5
_GUARD_TOS_FLOAT
_GUARD_NOS_FLOAT
_BINARY_OP_MULTIPLY_FLOAT
_SET_IP
_BINARY_OP
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_3
_EXIT_TRACE
> -] - -executor_0x65462fd7c7c0:i112 -> executor_0x65462fd78530:start -executor_0x65462fd738f0 [ - shape = none - label = < - - - - - - - - - - - - - - -
Executor
part_At_times_u: 44
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_POP_ITER
_CHECK_VALIDITY
_LOAD_FAST_BORROW_3
_SET_IP
_RETURN_VALUE
_GUARD_IP
_CHECK_VALIDITY
_LIST_APPEND
_EXIT_TRACE
> -] - -executor_0x65462fd738f0:i11 -> executor_0x65462fd7b4e0:start -executor_0x65462fcca340 [ - shape = none - label = < - - - - - - - - - - - - - - -
Executor
part_A_times_u: 36
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_POP_ITER
_CHECK_VALIDITY
_LOAD_FAST_BORROW_3
_SET_IP
_RETURN_VALUE
_GUARD_IP
_CHECK_VALIDITY
_LIST_APPEND
_EXIT_TRACE
> -] - -executor_0x65462fcca340:i11 -> executor_0x65462fd7b4e0:start -executor_0x65462fd7b4e0 [ - shape = none - label = < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Executor
eval_times_u: 26
_START_EXECUTOR
_MAKE_WARM
_ITER_CHECK_RANGE
_GUARD_NOT_EXHAUSTED_RANGE
_ITER_NEXT_RANGE
_SET_IP
_STORE_FAST_2
_LOAD_FAST_0
_CHECK_VALIDITY
_PUSH_NULL
_LOAD_FAST_BORROW_2
_LOAD_FAST_BORROW_1
_BUILD_TUPLE
_SET_IP
_CHECK_PEP_523
_CHECK_FUNCTION_VERSION
_CHECK_FUNCTION_EXACT_ARGS
_CHECK_STACK_SPACE
_CHECK_RECURSION_REMAINING
_INIT_CALL_PY_EXACT_ARGS_1
_SAVE_RETURN_OFFSET
_PUSH_FRAME
_GUARD_IP
_TIER2_RESUME_CHECK
_LOAD_FAST_BORROW_0
_SET_IP
_GUARD_TOS_TUPLE
_UNPACK_SEQUENCE_TWO_TUPLE
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_1
_STORE_FAST_2
_CHECK_VALIDITY
_LOAD_SMALL_INT_0
_SET_IP
_STORE_FAST_3
_CHECK_VALIDITY
_GUARD_GLOBALS_VERSION
_LOAD_GLOBAL_BUILTINS
_PUSH_NULL_CONDITIONAL
_LOAD_FAST_BORROW_2
_SET_IP
_CALL_BUILTIN_CLASS
_TIER2_RESUME_CHECK
_CHECK_VALIDITY
_SET_IP
_GET_ITER
_CHECK_VALIDITY
_SET_IP
_FOR_ITER_TIER_TWO
_GUARD_IP
_CHECK_VALIDITY
_SET_IP
_GUARD_TOS_TUPLE
_UNPACK_SEQUENCE_TWO_TUPLE
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_4
_STORE_FAST_5
_CHECK_VALIDITY
_LOAD_FAST_BORROW_3
_LOAD_GLOBAL_MODULE
_PUSH_NULL_CONDITIONAL
_LOAD_FAST_BORROW_4
_LOAD_FAST_BORROW_1
_SET_IP
_CHECK_PEP_523
_CHECK_FUNCTION_VERSION
_CHECK_FUNCTION_EXACT_ARGS
_CHECK_STACK_SPACE
_CHECK_RECURSION_REMAINING
_INIT_CALL_PY_EXACT_ARGS_2
_SAVE_RETURN_OFFSET
_PUSH_FRAME
_GUARD_IP
_TIER2_RESUME_CHECK
_LOAD_CONST
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_MULTIPLY_INT
_LOAD_SMALL_INT_2
_SET_IP
_BINARY_OP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_0
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_SET_IP
_GUARD_BINARY_OP_EXTEND
_BINARY_OP_EXTEND
_CHECK_VALIDITY
_SET_IP
_RETURN_VALUE
_GUARD_IP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_5
_GUARD_TOS_FLOAT
_GUARD_NOS_FLOAT
_BINARY_OP_MULTIPLY_FLOAT
_SET_IP
_BINARY_OP
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_3
_EXIT_TRACE
> -] - -executor_0x65462fd7b4e0:i15 -> executor_0x65462fd7c7c0:start -executor_0x65462fd7b4e0:i16 -> executor_0x65462fd7c7c0:start -executor_0x65462fd7b4e0:i123 -> executor_0x65462fd79600:start -executor_0x65462fd79600 [ - shape = none - label = < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Executor
part_At_times_u: 45
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_FOR_ITER_TIER_TWO
_GUARD_IP
_CHECK_VALIDITY
_SET_IP
_GUARD_TOS_TUPLE
_UNPACK_SEQUENCE_TWO_TUPLE
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_4
_STORE_FAST_5
_CHECK_VALIDITY
_LOAD_FAST_BORROW_3
_LOAD_GLOBAL_MODULE
_PUSH_NULL_CONDITIONAL
_LOAD_FAST_BORROW_4
_LOAD_FAST_BORROW_1
_SET_IP
_CHECK_PEP_523
_CHECK_FUNCTION_VERSION
_CHECK_FUNCTION_EXACT_ARGS
_CHECK_STACK_SPACE
_CHECK_RECURSION_REMAINING
_INIT_CALL_PY_EXACT_ARGS_2
_SAVE_RETURN_OFFSET
_PUSH_FRAME
_GUARD_IP
_TIER2_RESUME_CHECK
_LOAD_CONST
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_MULTIPLY_INT
_LOAD_SMALL_INT_2
_SET_IP
_BINARY_OP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_0
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_SET_IP
_GUARD_BINARY_OP_EXTEND
_BINARY_OP_EXTEND
_CHECK_VALIDITY
_SET_IP
_RETURN_VALUE
_GUARD_IP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_5
_GUARD_TOS_FLOAT
_GUARD_NOS_FLOAT
_BINARY_OP_MULTIPLY_FLOAT
_GUARD_TOS_FLOAT
_GUARD_NOS_FLOAT
_BINARY_OP_ADD_FLOAT
_SET_IP
_STORE_FAST_3
_JUMP_TO_TOP
> -] - -executor_0x65462fd78530 [ - shape = none - label = < - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Executor
part_A_times_u: 37
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_FOR_ITER_TIER_TWO
_GUARD_IP
_CHECK_VALIDITY
_SET_IP
_GUARD_TOS_TUPLE
_UNPACK_SEQUENCE_TWO_TUPLE
_CHECK_VALIDITY
_SET_IP
_STORE_FAST_4
_STORE_FAST_5
_CHECK_VALIDITY
_LOAD_FAST_BORROW_3
_LOAD_GLOBAL_MODULE
_PUSH_NULL_CONDITIONAL
_LOAD_FAST_BORROW_1
_LOAD_FAST_BORROW_4
_SET_IP
_CHECK_PEP_523
_CHECK_FUNCTION_VERSION
_CHECK_FUNCTION_EXACT_ARGS
_CHECK_STACK_SPACE
_CHECK_RECURSION_REMAINING
_INIT_CALL_PY_EXACT_ARGS_2
_SAVE_RETURN_OFFSET
_PUSH_FRAME
_GUARD_IP
_TIER2_RESUME_CHECK
_LOAD_CONST
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_FAST_BORROW_0
_LOAD_FAST_BORROW_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_MULTIPLY_INT
_LOAD_SMALL_INT_2
_SET_IP
_BINARY_OP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_0
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_LOAD_SMALL_INT_1
_GUARD_TOS_INT
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_SET_IP
_GUARD_BINARY_OP_EXTEND
_BINARY_OP_EXTEND
_CHECK_VALIDITY
_SET_IP
_RETURN_VALUE
_GUARD_IP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_5
_SET_IP
_GUARD_BINARY_OP_EXTEND
_BINARY_OP_EXTEND
_CHECK_VALIDITY
_GUARD_TOS_FLOAT
_GUARD_NOS_FLOAT
_BINARY_OP_ADD_FLOAT
_SET_IP
_STORE_FAST_3
_JUMP_TO_TOP
> -] - } -- 2.47.3