]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-100188: Reduce misses in BINARY_SUBSCR_(LIST/TUPLE)_INT (#100189)
authorDennis Sweeney <36520290+sweeneyde@users.noreply.github.com>
Tue, 20 Dec 2022 20:46:16 +0000 (15:46 -0500)
committerGitHub <noreply@github.com>
Tue, 20 Dec 2022 20:46:16 +0000 (15:46 -0500)
Don't specialize if the index is negative.

Misc/NEWS.d/next/Core and Builtins/2022-12-12-05-30-12.gh-issue-100188.sGCSMR.rst [new file with mode: 0644]
Python/specialize.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-12-12-05-30-12.gh-issue-100188.sGCSMR.rst b/Misc/NEWS.d/next/Core and Builtins/2022-12-12-05-30-12.gh-issue-100188.sGCSMR.rst
new file mode 100644 (file)
index 0000000..ec62fbd
--- /dev/null
@@ -0,0 +1,3 @@
+The ``BINARY_SUBSCR_LIST_INT`` and ``BINARY_SUBSCR_TUPLE_INT``
+instructions are no longer used for negative integers because
+those instructions always miss when encountering negative integers.
index a1666ccc91594be8f7e9475122865a2122e2d606..c6c502716478918a369ceb32bfcce5d39ddd01a9 100644 (file)
@@ -1302,8 +1302,12 @@ _Py_Specialize_BinarySubscr(
     PyTypeObject *container_type = Py_TYPE(container);
     if (container_type == &PyList_Type) {
         if (PyLong_CheckExact(sub)) {
-            _py_set_opcode(instr, BINARY_SUBSCR_LIST_INT);
-            goto success;
+            if (Py_SIZE(sub) == 0 || Py_SIZE(sub) == 1) {
+                _py_set_opcode(instr, BINARY_SUBSCR_LIST_INT);
+                goto success;
+            }
+            SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE);
+            goto fail;
         }
         SPECIALIZATION_FAIL(BINARY_SUBSCR,
             PySlice_Check(sub) ? SPEC_FAIL_SUBSCR_LIST_SLICE : SPEC_FAIL_OTHER);
@@ -1311,8 +1315,12 @@ _Py_Specialize_BinarySubscr(
     }
     if (container_type == &PyTuple_Type) {
         if (PyLong_CheckExact(sub)) {
-            _py_set_opcode(instr, BINARY_SUBSCR_TUPLE_INT);
-            goto success;
+            if (Py_SIZE(sub) == 0 || Py_SIZE(sub) == 1) {
+                _py_set_opcode(instr, BINARY_SUBSCR_TUPLE_INT);
+                goto success;
+            }
+            SPECIALIZATION_FAIL(BINARY_SUBSCR, SPEC_FAIL_OUT_OF_RANGE);
+            goto fail;
         }
         SPECIALIZATION_FAIL(BINARY_SUBSCR,
             PySlice_Check(sub) ? SPEC_FAIL_SUBSCR_TUPLE_SLICE : SPEC_FAIL_OTHER);