mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
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
This commit is contained in:
parent
b9ca438daa
commit
1b8bb1ed0c
12 changed files with 344 additions and 399 deletions
93
Python/executor_cases.c.h
generated
93
Python/executor_cases.c.h
generated
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue