diff options
author | Mark Shannon <mark@hotpy.org> | 2025-03-26 15:21:35 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-26 15:21:35 +0000 |
commit | 1b8bb1ed0c4243796af531a35de982bc4f028215 (patch) | |
tree | 830d0586e0c7b5e65b03b40979794b0ecd99cfe5 /Python/executor_cases.c.h | |
parent | b9ca438daab6a4e2513ab38171e94c75da03d6e3 (diff) | |
download | cpython-1b8bb1ed0c4243796af531a35de982bc4f028215.tar.gz cpython-1b8bb1ed0c4243796af531a35de982bc4f028215.zip |
GH-131729: Code-gen better liveness analysis (GH-131732)
* Rename 'defined' attribute to 'in_local' to more accurately reflect how it is used
* Make death of variables explicit even for array variables.
* Convert in_memory from boolean to stack offset
* Don't apply liveness analysis to optimizer generated code
* Fix RETURN_VALUE in optimizer
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r-- | Python/executor_cases.c.h | 93 |
1 files changed, 33 insertions, 60 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 2942680a222..43f9a81d2c7 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -635,7 +635,6 @@ stack_pointer[-1] = value; PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = res; break; } @@ -1259,13 +1258,13 @@ list_st = res; stack_pointer[-2] = list_st; PyStackRef_CLOSE(tmp); + tmp = sub_st; + sub_st = PyStackRef_NULL; + stack_pointer[-1] = sub_st; + PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -1; assert(WITHIN_STACK_BOUNDS()); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(sub_st); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = res; break; } @@ -1354,7 +1353,6 @@ stack_pointer[-1] = tuple_st; PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = res; break; } @@ -2054,6 +2052,7 @@ _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(seq); stack_pointer = _PyFrame_GetStackPointer(frame); + stack_pointer[-1] = val0; break; } @@ -2077,13 +2076,11 @@ for (int i = oparg; --i >= 0; ) { *values++ = PyStackRef_FromPyObjectNew(items[i]); } - stack_pointer += -1; + stack_pointer += -1 + oparg; assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(seq); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += oparg; - assert(WITHIN_STACK_BOUNDS()); break; } @@ -2115,13 +2112,11 @@ *values++ = PyStackRef_FromPyObjectNew(items[i]); } UNLOCK_OBJECT(seq_o); - stack_pointer += -1; + stack_pointer += -1 + oparg; assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(seq); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += oparg; - assert(WITHIN_STACK_BOUNDS()); break; } @@ -2701,11 +2696,11 @@ } } if (err) { + stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); Py_DECREF(set_o); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -oparg; - assert(WITHIN_STACK_BOUNDS()); JUMP_TO_ERROR(); } set = PyStackRef_FromPyObjectStealMortal(set_o); @@ -3002,13 +2997,12 @@ global_super_st = self_or_null; stack_pointer[-2] = global_super_st; PyStackRef_CLOSE(tmp); + tmp = class_st; + class_st = PyStackRef_NULL; + stack_pointer[-1] = class_st; + PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; - assert(WITHIN_STACK_BOUNDS()); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(class_st); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; + stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); attr = PyStackRef_FromPyObjectSteal(attr_o); stack_pointer[0] = attr; @@ -3296,7 +3290,6 @@ stack_pointer[-1] = owner; PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = attr; break; } @@ -3331,7 +3324,6 @@ stack_pointer[-1] = owner; PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = attr; break; } @@ -3936,9 +3928,7 @@ stack_pointer[-1] = value; PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = b; } - stack_pointer[-1] = b; break; } @@ -4120,10 +4110,8 @@ stack_pointer[-1] = iterable; PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = iter; } } - stack_pointer[-1] = iter; break; } @@ -4667,23 +4655,18 @@ _PyStackRef *args; _PyStackRef *self_or_null; _PyStackRef *callable; - _PyStackRef *func; - _PyStackRef *maybe_self; oparg = CURRENT_OPARG(); args = &stack_pointer[-oparg]; self_or_null = &stack_pointer[-1 - oparg]; callable = &stack_pointer[-2 - oparg]; - func = &stack_pointer[-2 - oparg]; - maybe_self = &stack_pointer[-1 - oparg]; - args = &stack_pointer[-oparg]; (void)args; if (PyStackRef_TYPE(callable[0]) == &PyMethod_Type && PyStackRef_IsNull(self_or_null[0])) { PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]); PyObject *self = ((PyMethodObject *)callable_o)->im_self; - maybe_self[0] = PyStackRef_FromPyObjectNew(self); + self_or_null[0] = PyStackRef_FromPyObjectNew(self); PyObject *method = ((PyMethodObject *)callable_o)->im_func; _PyStackRef temp = callable[0]; - func[0] = PyStackRef_FromPyObjectNew(method); + callable[0] = PyStackRef_FromPyObjectNew(method); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(temp); stack_pointer = _PyFrame_GetStackPointer(frame); @@ -5252,21 +5235,16 @@ case _CHECK_AND_ALLOCATE_OBJECT: { _PyStackRef *args; - _PyStackRef *null; + _PyStackRef *self_or_null; _PyStackRef *callable; - _PyStackRef *init; - _PyStackRef *self; oparg = CURRENT_OPARG(); args = &stack_pointer[-oparg]; - null = &stack_pointer[-1 - oparg]; + self_or_null = &stack_pointer[-1 - oparg]; callable = &stack_pointer[-2 - oparg]; - init = &stack_pointer[-2 - oparg]; - self = &stack_pointer[-1 - oparg]; - args = &stack_pointer[-oparg]; uint32_t type_version = (uint32_t)CURRENT_OPERAND0(); (void)args; PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]); - if (!PyStackRef_IsNull(null[0])) { + if (!PyStackRef_IsNull(self_or_null[0])) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); } @@ -5296,9 +5274,9 @@ if (self_o == NULL) { JUMP_TO_ERROR(); } - self[0] = PyStackRef_FromPyObjectSteal(self_o); + self_or_null[0] = PyStackRef_FromPyObjectSteal(self_o); _PyStackRef temp = callable[0]; - init[0] = PyStackRef_FromPyObjectNew(init_func); + callable[0] = PyStackRef_FromPyObjectNew(init_func); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(temp); stack_pointer = _PyFrame_GetStackPointer(frame); @@ -5720,14 +5698,14 @@ case _CALL_ISINSTANCE: { _PyStackRef *args; _PyStackRef *self_or_null; - _PyStackRef *callable; + _PyStackRef callable; _PyStackRef res; oparg = CURRENT_OPARG(); args = &stack_pointer[-oparg]; self_or_null = &stack_pointer[-1 - oparg]; - callable = &stack_pointer[-2 - oparg]; + callable = stack_pointer[-2 - oparg]; /* isinstance(o, o2) */ - PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]); + PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable); int total_args = oparg; _PyStackRef *arguments = args; if (!PyStackRef_IsNull(self_or_null[0])) { @@ -5755,8 +5733,9 @@ res = retval ? PyStackRef_True : PyStackRef_False; assert((!PyStackRef_IsNull(res)) ^ (_PyErr_Occurred(tstate) != NULL)); _PyFrame_SetStackPointer(frame, stack_pointer); - _PyStackRef tmp = callable[0]; - callable[0] = res; + _PyStackRef tmp = callable; + callable = res; + stack_pointer[-2 - oparg] = callable; PyStackRef_CLOSE(tmp); for (int _i = oparg; --_i >= 0;) { tmp = args[_i]; @@ -5767,7 +5746,6 @@ self_or_null[0] = PyStackRef_NULL; PyStackRef_XCLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; assert(WITHIN_STACK_BOUNDS()); break; @@ -6147,25 +6125,20 @@ _PyStackRef *args; _PyStackRef *self_or_null; _PyStackRef *callable; - _PyStackRef *func; - _PyStackRef *maybe_self; _PyStackRef kwnames_out; oparg = CURRENT_OPARG(); kwnames_in = stack_pointer[-1]; args = &stack_pointer[-1 - oparg]; self_or_null = &stack_pointer[-2 - oparg]; callable = &stack_pointer[-3 - oparg]; - func = &stack_pointer[-3 - oparg]; - maybe_self = &stack_pointer[-2 - oparg]; - args = &stack_pointer[-1 - oparg]; (void)args; if (PyStackRef_TYPE(callable[0]) == &PyMethod_Type && PyStackRef_IsNull(self_or_null[0])) { PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]); PyObject *self = ((PyMethodObject *)callable_o)->im_self; - maybe_self[0] = PyStackRef_FromPyObjectNew(self); + self_or_null[0] = PyStackRef_FromPyObjectNew(self); PyObject *method = ((PyMethodObject *)callable_o)->im_func; _PyStackRef temp = callable[0]; - func[0] = PyStackRef_FromPyObjectNew(method); + callable[0] = PyStackRef_FromPyObjectNew(method); _PyFrame_SetStackPointer(frame, stack_pointer); PyStackRef_CLOSE(temp); stack_pointer = _PyFrame_GetStackPointer(frame); @@ -6668,13 +6641,13 @@ lhs = res; stack_pointer[-2] = lhs; PyStackRef_CLOSE(tmp); + tmp = rhs; + rhs = PyStackRef_NULL; + stack_pointer[-1] = rhs; + PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); stack_pointer += -1; assert(WITHIN_STACK_BOUNDS()); - _PyFrame_SetStackPointer(frame, stack_pointer); - PyStackRef_CLOSE(rhs); - stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer[-1] = res; break; } |