aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/optimizer_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/optimizer_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/optimizer_cases.c.h')
-rw-r--r--Python/optimizer_cases.c.h89
1 files changed, 21 insertions, 68 deletions
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index a1119171fa4..106e7e38b99 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -276,16 +276,14 @@
{
assert(PyLong_CheckExact(sym_get_const(ctx, left)));
assert(PyLong_CheckExact(sym_get_const(ctx, right)));
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
PyObject *temp = _PyLong_Multiply((PyLongObject *)sym_get_const(ctx, left),
(PyLongObject *)sym_get_const(ctx, right));
if (temp == NULL) {
goto error;
}
res = sym_new_const(ctx, temp);
- stack_pointer[0] = res;
- stack_pointer += 1;
+ stack_pointer[-2] = res;
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
Py_DECREF(temp);
// TODO gh-115506:
@@ -311,16 +309,14 @@
{
assert(PyLong_CheckExact(sym_get_const(ctx, left)));
assert(PyLong_CheckExact(sym_get_const(ctx, right)));
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
PyObject *temp = _PyLong_Add((PyLongObject *)sym_get_const(ctx, left),
(PyLongObject *)sym_get_const(ctx, right));
if (temp == NULL) {
goto error;
}
res = sym_new_const(ctx, temp);
- stack_pointer[0] = res;
- stack_pointer += 1;
+ stack_pointer[-2] = res;
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
Py_DECREF(temp);
// TODO gh-115506:
@@ -346,16 +342,14 @@
{
assert(PyLong_CheckExact(sym_get_const(ctx, left)));
assert(PyLong_CheckExact(sym_get_const(ctx, right)));
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
PyObject *temp = _PyLong_Subtract((PyLongObject *)sym_get_const(ctx, left),
(PyLongObject *)sym_get_const(ctx, right));
if (temp == NULL) {
goto error;
}
res = sym_new_const(ctx, temp);
- stack_pointer[0] = res;
- stack_pointer += 1;
+ stack_pointer[-2] = res;
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
Py_DECREF(temp);
// TODO gh-115506:
@@ -557,17 +551,15 @@
goto error;
}
res = sym_new_const(ctx, temp);
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
Py_DECREF(temp);
}
else {
res = sym_new_type(ctx, &PyUnicode_Type);
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
}
// _STORE_FAST:
GETLOCAL(this_instr->operand0) = res;
+ stack_pointer += -2;
+ assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -710,6 +702,7 @@
JitOptSymbol *retval;
JitOptSymbol *res;
retval = stack_pointer[-1];
+ JitOptSymbol *temp = retval;
stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
ctx->frame->stack_pointer = stack_pointer;
@@ -727,7 +720,7 @@
// might be impossible, but bailing is still safe
ctx->done = true;
}
- res = retval;
+ res = temp;
stack_pointer[0] = res;
stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
@@ -1259,11 +1252,7 @@
res = sym_new_type(ctx, &PyBool_Type);
}
else {
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
res = _Py_uop_sym_new_not_null(ctx);
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
}
stack_pointer[-2] = res;
stack_pointer += -1;
@@ -1290,8 +1279,6 @@
{
assert(PyLong_CheckExact(sym_get_const(ctx, left)));
assert(PyLong_CheckExact(sym_get_const(ctx, right)));
- stack_pointer += -2;
- assert(WITHIN_STACK_BOUNDS());
PyObject *tmp = PyObject_RichCompare(sym_get_const(ctx, left),
sym_get_const(ctx, right),
oparg >> 5);
@@ -1302,8 +1289,8 @@
assert(_Py_IsImmortal(tmp));
REPLACE_OP(this_instr, _POP_TWO_LOAD_CONST_INLINE_BORROW, 0, (uintptr_t)tmp);
res = sym_new_const(ctx, tmp);
- stack_pointer[0] = res;
- stack_pointer += 1;
+ stack_pointer[-2] = res;
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
Py_DECREF(tmp);
}
@@ -1673,16 +1660,14 @@
_Py_UOpsAbstractFrame *new_frame;
PyCodeObject *co = NULL;
assert((this_instr + 2)->opcode == _PUSH_FRAME);
- stack_pointer += -2 - oparg;
- assert(WITHIN_STACK_BOUNDS());
co = get_code_with_logging((this_instr + 2));
if (co == NULL) {
ctx->done = true;
break;
}
new_frame = frame_new(ctx, co, 0, NULL, 0);
- stack_pointer[0] = (JitOptSymbol *)new_frame;
- stack_pointer += 1;
+ stack_pointer[-2 - oparg] = (JitOptSymbol *)new_frame;
+ stack_pointer += -1 - oparg;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1787,8 +1772,6 @@
int argcount = oparg;
PyCodeObject *co = NULL;
assert((this_instr + 2)->opcode == _PUSH_FRAME);
- stack_pointer += -2 - oparg;
- assert(WITHIN_STACK_BOUNDS());
co = get_code_with_logging((this_instr + 2));
if (co == NULL) {
ctx->done = true;
@@ -1806,8 +1789,8 @@
} else {
new_frame = frame_new(ctx, co, 0, NULL, 0);
}
- stack_pointer[0] = (JitOptSymbol *)new_frame;
- stack_pointer += 1;
+ stack_pointer[-2 - oparg] = (JitOptSymbol *)new_frame;
+ stack_pointer += -1 - oparg;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2008,18 +1991,7 @@
/* _MONITOR_CALL_KW is not a viable micro-op for tier 2 */
case _MAYBE_EXPAND_METHOD_KW: {
- JitOptSymbol **func;
- JitOptSymbol **maybe_self;
- JitOptSymbol **args;
JitOptSymbol *kwnames_out;
- func = &stack_pointer[-3 - oparg];
- maybe_self = &stack_pointer[-2 - oparg];
- args = &stack_pointer[-1 - oparg];
- func[0] = sym_new_not_null(ctx);
- maybe_self[0] = sym_new_not_null(ctx);
- for (int _i = oparg; --_i >= 0;) {
- args[_i] = sym_new_not_null(ctx);
- }
kwnames_out = sym_new_not_null(ctx);
stack_pointer[-1] = kwnames_out;
break;
@@ -2111,6 +2083,7 @@
// might be impossible, but bailing is still safe
ctx->done = true;
}
+ stack_pointer[-1] = res;
break;
}
@@ -2269,11 +2242,7 @@
if (sym_is_const(ctx, flag)) {
PyObject *value = sym_get_const(ctx, flag);
assert(value != NULL);
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
eliminate_pop_guard(this_instr, value != Py_True);
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
}
sym_set_const(flag, Py_True);
stack_pointer += -1;
@@ -2287,11 +2256,7 @@
if (sym_is_const(ctx, flag)) {
PyObject *value = sym_get_const(ctx, flag);
assert(value != NULL);
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
eliminate_pop_guard(this_instr, value != Py_False);
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
}
sym_set_const(flag, Py_False);
stack_pointer += -1;
@@ -2305,23 +2270,17 @@
if (sym_is_const(ctx, flag)) {
PyObject *value = sym_get_const(ctx, flag);
assert(value != NULL);
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
eliminate_pop_guard(this_instr, !Py_IsNone(value));
}
else {
if (sym_has_type(flag)) {
assert(!sym_matches_type(flag, &_PyNone_Type));
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
eliminate_pop_guard(this_instr, true);
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
}
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
}
sym_set_const(flag, Py_None);
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2331,22 +2290,16 @@
if (sym_is_const(ctx, flag)) {
PyObject *value = sym_get_const(ctx, flag);
assert(value != NULL);
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
eliminate_pop_guard(this_instr, Py_IsNone(value));
}
else {
if (sym_has_type(flag)) {
assert(!sym_matches_type(flag, &_PyNone_Type));
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
eliminate_pop_guard(this_instr, false);
- stack_pointer += 1;
- assert(WITHIN_STACK_BOUNDS());
}
- stack_pointer += -1;
- assert(WITHIN_STACK_BOUNDS());
}
+ stack_pointer += -1;
+ assert(WITHIN_STACK_BOUNDS());
break;
}