]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-108488: Initialize JUMP_BACKWARD cache to 0, not 17 (#108591)
authorGuido van Rossum <guido@python.org>
Tue, 29 Aug 2023 18:14:56 +0000 (11:14 -0700)
committerGitHub <noreply@github.com>
Tue, 29 Aug 2023 18:14:56 +0000 (18:14 +0000)
This mis-initialization caused the executor optimization to kick in sooner than intended. It also set the lower 4 bits of the counter to `1` -- those bits are supposed to be reserved (the actual counter is in the upper 12 bits).

Lib/test/test_capi/test_misc.py
Misc/NEWS.d/next/Core and Builtins/2023-08-28-22-22-15.gh-issue-108488.e8-fxg.rst [new file with mode: 0644]
Python/specialize.c

index 1cd4c56b49bba5f73232e6521bb78c8b1328562f..4148f15b2aa662460046e020ce093429d56a4360 100644 (file)
@@ -2478,7 +2478,7 @@ class TestUops(unittest.TestCase):
 
         opt = _testinternalcapi.get_uop_optimizer()
         with temporary_optimizer(opt):
-            testfunc([1, 2, 3])
+            testfunc(range(10))
 
         ex = get_first_executor(testfunc)
         self.assertIsNotNone(ex)
@@ -2493,7 +2493,7 @@ class TestUops(unittest.TestCase):
 
         opt = _testinternalcapi.get_uop_optimizer()
         with temporary_optimizer(opt):
-            testfunc([1, 2, 3])
+            testfunc(range(10))
 
         ex = get_first_executor(testfunc)
         self.assertIsNotNone(ex)
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-08-28-22-22-15.gh-issue-108488.e8-fxg.rst b/Misc/NEWS.d/next/Core and Builtins/2023-08-28-22-22-15.gh-issue-108488.e8-fxg.rst
new file mode 100644 (file)
index 0000000..f9d6f59
--- /dev/null
@@ -0,0 +1 @@
+Change the initialization of inline cache entries so that the cache entry for ``JUMP_BACKWARD`` is initialized to zero, instead of the ``adaptive_counter_warmup()`` value used for all other instructions. This counter, unique among instructions, counts up from zero.
index a467f163f2ca9d2b850b2320db7f62b6bbae528c..a794f146c188ecdba1da5c81ab8fcc1e2e34fabd 100644 (file)
@@ -302,7 +302,9 @@ _PyCode_Quicken(PyCodeObject *code)
         assert(opcode < MIN_INSTRUMENTED_OPCODE);
         int caches = _PyOpcode_Caches[opcode];
         if (caches) {
-            instructions[i + 1].cache = adaptive_counter_warmup();
+            // JUMP_BACKWARD counter counts up from 0 until it is > backedge_threshold
+            instructions[i + 1].cache =
+                opcode == JUMP_BACKWARD ? 0 : adaptive_counter_warmup();
             i += caches;
         }
     }