From: Guido van Rossum Date: Tue, 29 Aug 2023 18:14:56 +0000 (-0700) Subject: gh-108488: Initialize JUMP_BACKWARD cache to 0, not 17 (#108591) X-Git-Tag: v3.13.0a1~705 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=59e46932c8d2dc6fe84a8cf144dde962838c0204;p=thirdparty%2FPython%2Fcpython.git gh-108488: Initialize JUMP_BACKWARD cache to 0, not 17 (#108591) 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). --- diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index 1cd4c56b49bb..4148f15b2aa6 100644 --- a/Lib/test/test_capi/test_misc.py +++ b/Lib/test/test_capi/test_misc.py @@ -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 index 000000000000..f9d6f593b8eb --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-08-28-22-22-15.gh-issue-108488.e8-fxg.rst @@ -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. diff --git a/Python/specialize.c b/Python/specialize.c index a467f163f2ca..a794f146c188 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -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; } }