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/optimizer_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/optimizer_cases.c.h')
-rw-r--r-- | Python/optimizer_cases.c.h | 89 |
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; } |