gh-134584: JIT: Borrow references for immortal promoted globals (GH-142921)

JIT: Borrow references for immortal promoted globals
This commit is contained in:
Ken Jin 2025-12-20 03:06:34 +08:00 committed by GitHub
parent 6a4f10325d
commit 6b4bc6e6a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 62 additions and 4 deletions

View File

@ -3008,6 +3008,44 @@ class TestUopsOptimization(unittest.TestCase):
for _ in range(TIER2_THRESHOLD+1):
obj.attr = EvilAttr(obj.__dict__)
def test_promoted_global_refcount_eliminated(self):
result = script_helper.run_python_until_end('-c', textwrap.dedent("""
import _testinternalcapi
import opcode
import _opcode
def get_first_executor(func):
code = func.__code__
co_code = code.co_code
for i in range(0, len(co_code), 2):
try:
return _opcode.get_executor(code, i)
except ValueError:
pass
return None
def get_opnames(ex):
return {item[0] for item in ex}
def testfunc(n):
y = []
for i in range(n):
x = tuple(y)
return x
testfunc(_testinternalcapi.TIER2_THRESHOLD)
ex = get_first_executor(testfunc)
assert ex is not None
uops = get_opnames(ex)
assert "_LOAD_GLOBAL_BUILTIN" not in uops
assert "_LOAD_CONST_INLINE_BORROW" in uops
assert "_POP_TOP_NOP" in uops
assert "_POP_TOP" not in uops
"""), PYTHON_JIT="1")
self.assertEqual(result[0].rc, 0, result)
def test_constant_fold_tuple(self):
def testfunc(n):
for _ in range(n):

View File

@ -1376,7 +1376,12 @@ dummy_func(void) {
res = sym_new_not_null(ctx);
}
else {
res = sym_new_const(ctx, cnst);
if (_Py_IsImmortal(cnst)) {
res = PyJitRef_Borrow(sym_new_const(ctx, cnst));
}
else {
res = sym_new_const(ctx, cnst);
}
}
}
@ -1411,7 +1416,12 @@ dummy_func(void) {
res = sym_new_not_null(ctx);
}
else {
res = sym_new_const(ctx, cnst);
if (_Py_IsImmortal(cnst)) {
res = PyJitRef_Borrow(sym_new_const(ctx, cnst));
}
else {
res = sym_new_const(ctx, cnst);
}
}
}

View File

@ -1330,7 +1330,12 @@
res = sym_new_not_null(ctx);
}
else {
res = sym_new_const(ctx, cnst);
if (_Py_IsImmortal(cnst)) {
res = PyJitRef_Borrow(sym_new_const(ctx, cnst));
}
else {
res = sym_new_const(ctx, cnst);
}
}
CHECK_STACK_BOUNDS(1);
stack_pointer[0] = res;
@ -1367,7 +1372,12 @@
res = sym_new_not_null(ctx);
}
else {
res = sym_new_const(ctx, cnst);
if (_Py_IsImmortal(cnst)) {
res = PyJitRef_Borrow(sym_new_const(ctx, cnst));
}
else {
res = sym_new_const(ctx, cnst);
}
}
CHECK_STACK_BOUNDS(1);
stack_pointer[0] = res;