From 59e46932c8d2dc6fe84a8cf144dde962838c0204 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 29 Aug 2023 11:14:56 -0700 Subject: [PATCH] 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). --- Lib/test/test_capi/test_misc.py | 4 ++-- .../2023-08-28-22-22-15.gh-issue-108488.e8-fxg.rst | 1 + Python/specialize.c | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2023-08-28-22-22-15.gh-issue-108488.e8-fxg.rst diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py index 1cd4c56b49b..4148f15b2aa 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 00000000000..f9d6f593b8e --- /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 a467f163f2c..a794f146c18 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; } }