From: Kumar Aditya Date: Thu, 26 Mar 2026 10:12:10 +0000 (+0530) Subject: gh-GH-131798: optimize jit attribute loads on immutable types (#146449) X-Git-Tag: v3.15.0a8~171 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fc1f6b176e2053c792cc40b39be44c6918bb0460;p=thirdparty%2FPython%2Fcpython.git gh-GH-131798: optimize jit attribute loads on immutable types (#146449) --- diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 3217db192803..a451fb2850d7 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -2808,9 +2808,6 @@ class TestUopsOptimization(unittest.TestCase): self.assertEqual(res, sum(range(TIER2_THRESHOLD))) uops = get_opnames(ex) self.assertIn("_CALL_LIST_APPEND", uops) - # We should remove these in the future - self.assertIn("_GUARD_NOS_LIST", uops) - self.assertIn("_GUARD_CALLABLE_LIST_APPEND", uops) def test_call_list_append_pop_top(self): def testfunc(n): @@ -3046,6 +3043,8 @@ class TestUopsOptimization(unittest.TestCase): self.assertEqual(res, TIER2_THRESHOLD) uops = get_opnames(ex) self.assertNotIn("_LOAD_ATTR_METHOD_NO_DICT", uops) + self.assertNotIn("_LOAD_CONST_UNDER_INLINE", uops) + self.assertIn("_LOAD_CONST_UNDER_INLINE_BORROW", uops) def test_store_fast_refcount_elimination(self): def foo(x): diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c index 520420e98785..0c25c0c9bc0d 100644 --- a/Python/optimizer_analysis.c +++ b/Python/optimizer_analysis.c @@ -367,7 +367,11 @@ lookup_attr(JitOptContext *ctx, _PyBloomFilter *dependencies, _PyUOpInstruction if (type && PyType_Check(type)) { PyObject *lookup = _PyType_Lookup(type, name); if (lookup) { - int opcode = _Py_IsImmortal(lookup) ? immortal : mortal; + int opcode = mortal; + // if the object is immortal or the type is immutable, borrowing is safe + if (_Py_IsImmortal(lookup) || (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE)) { + opcode = immortal; + } ADD_OP(opcode, 0, (uintptr_t)lookup); PyType_Watch(TYPE_WATCHER_ID, (PyObject *)type); _Py_BloomFilter_Add(dependencies, type);