aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2025-03-26 15:21:35 +0000
committerGitHub <noreply@github.com>2025-03-26 15:21:35 +0000
commit1b8bb1ed0c4243796af531a35de982bc4f028215 (patch)
tree830d0586e0c7b5e65b03b40979794b0ecd99cfe5 /Python/executor_cases.c.h
parentb9ca438daab6a4e2513ab38171e94c75da03d6e3 (diff)
downloadcpython-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.h93
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;
}