summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis Sweeney <36520290+sweeneyde@users.noreply.github.com>2022-12-20 20:46:16 (GMT)
committerGitHub <noreply@github.com>2022-12-20 20:46:16 (GMT)
commitc18d83118881333b9a0afd0add83afb2ba7300f7 (patch)
tree58bdb847e50dcd0ccff6e9e0ed3a5378e6e7f674
parent44892d45b038f919b0378590a776580a9d73b291 (diff)
downloadcpython-c18d83118881333b9a0afd0add83afb2ba7300f7.zip
cpython-c18d83118881333b9a0afd0add83afb2ba7300f7.tar.gz
cpython-c18d83118881333b9a0afd0add83afb2ba7300f7.tar.bz2
gh-100188: Reduce misses in BINARY_SUBSCR_(LIST/TUPLE)_INT (#100189)
Don't specialize if the index is negative.
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2022-12-12-05-30-12.gh-issue-100188.sGCSMR.rst3
-rw-r--r--Python/specialize.c16
2 files changed, 15 insertions, 4 deletions
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
index 0000000..ec62fbd
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-12-12-05-30-12.gh-issue-100188.sGCSMR.rst
@@ -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.
diff --git a/Python/specialize.c b/Python/specialize.c
index a1666cc..c6c5027 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -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);