]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-GH-131798: optimize jit attribute loads on immutable types (#146449)
authorKumar Aditya <kumaraditya@python.org>
Thu, 26 Mar 2026 10:12:10 +0000 (15:42 +0530)
committerGitHub <noreply@github.com>
Thu, 26 Mar 2026 10:12:10 +0000 (10:12 +0000)
Lib/test/test_capi/test_opt.py
Python/optimizer_analysis.c

index 3217db192803d1be248cb21726b2a08ec9f83fcc..a451fb2850d70daa5b50e6322f665ebdeabcb430 100644 (file)
@@ -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):
index 520420e9878575277cdf6962f1e94d9b1fb7090b..0c25c0c9bc0d1cf659dcedf88de65ffdac45b1fe 100644 (file)
@@ -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);