https://github.com/python/cpython/commit/df59226997e067adcfa1bc8d045b7cc1de08906c
commit: df59226997e067adcfa1bc8d045b7cc1de08906c
branch: main
author: Irit Katriel <[email protected]>
committer: iritkatriel <[email protected]>
date: 2025-04-04T15:33:31+01:00
summary:
gh-100239: more refined specialisation stats for BINARY_OP/SUBSCR (#132068)
files:
M Include/cpython/pystats.h
M Python/specialize.c
M Tools/scripts/summarize_stats.py
diff --git a/Include/cpython/pystats.h b/Include/cpython/pystats.h
index 4421b4d6e91dad..f16391f8437ec1 100644
--- a/Include/cpython/pystats.h
+++ b/Include/cpython/pystats.h
@@ -31,7 +31,7 @@
#define PYSTATS_MAX_UOP_ID 512
-#define SPECIALIZATION_FAILURE_KINDS 37
+#define SPECIALIZATION_FAILURE_KINDS 44
/* Stats for determining who is calling PyEval_EvalFrame */
#define EVAL_CALL_TOTAL 0
diff --git a/Python/specialize.c b/Python/specialize.c
index ac847b7c752b28..e7924aa711efa3 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -597,6 +597,13 @@ _PyCode_Quicken(_Py_CODEUNIT *instructions, Py_ssize_t
size, int enable_counters
#define SPEC_FAIL_BINARY_OP_SUBSCR_TUPLE_SLICE 35
#define SPEC_FAIL_BINARY_OP_SUBSCR_STRING_SLICE 36
#define SPEC_FAIL_BINARY_OP_SUBSCR_NOT_HEAP_TYPE 37
+#define SPEC_FAIL_BINARY_OP_SUBSCR_OTHER_SLICE 38
+#define SPEC_FAIL_BINARY_OP_SUBSCR_MAPPINGPROXY 39
+#define SPEC_FAIL_BINARY_OP_SUBSCR_RE_MATCH 40
+#define SPEC_FAIL_BINARY_OP_SUBSCR_ARRAY 41
+#define SPEC_FAIL_BINARY_OP_SUBSCR_DEQUE 42
+#define SPEC_FAIL_BINARY_OP_SUBSCR_ENUMDICT 43
+#define SPEC_FAIL_BINARY_OP_SUBSCR_STACKSUMMARY 44
/* Calls */
@@ -2358,6 +2365,34 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject
*rhs)
}
}
Py_XDECREF(descriptor);
+
+ if (PyObject_TypeCheck(lhs, &PyDictProxy_Type)) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_MAPPINGPROXY;
+ }
+
+ if (strcmp(container_type->tp_name, "array.array") == 0) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_ARRAY;
+ }
+
+ if (strcmp(container_type->tp_name, "re.Match") == 0) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_RE_MATCH;
+ }
+
+ if (strcmp(container_type->tp_name, "collections.deque") == 0) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_DEQUE;
+ }
+
+ if (strcmp(_PyType_Name(container_type), "EnumDict") != 0) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_ENUMDICT;
+ }
+
+ if (strcmp(container_type->tp_name, "StackSummary") != 0) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_STACKSUMMARY;
+ }
+
+ if (PySlice_Check(rhs)) {
+ return SPEC_FAIL_BINARY_OP_SUBSCR_OTHER_SLICE;
+ }
return SPEC_FAIL_BINARY_OP_SUBSCR;
}
Py_UNREACHABLE();
diff --git a/Tools/scripts/summarize_stats.py b/Tools/scripts/summarize_stats.py
index 4243b53850b3de..eb54b8dd115c94 100644
--- a/Tools/scripts/summarize_stats.py
+++ b/Tools/scripts/summarize_stats.py
@@ -298,12 +298,20 @@ def kind_to_text(kind: int, opcode: str):
return "kind " + str(kind)
family_stats = self._get_stats_for_opcode(opcode)
- failure_kinds = [0] * 40
+
+ def key_to_index(key):
+ return int(key[:-1].split("[")[1])
+
+ max_index = 0
+ for key in family_stats:
+ if key.startswith("specialization.failure_kind"):
+ max_index = max(max_index, key_to_index(key))
+
+ failure_kinds = [0] * (max_index + 1)
for key in family_stats:
if not key.startswith("specialization.failure_kind"):
continue
- index = int(key[:-1].split("[")[1])
- failure_kinds[index] = family_stats[key]
+ failure_kinds[key_to_index(key)] = family_stats[key]
return {
kind_to_text(index, opcode): value
for (index, value) in enumerate(failure_kinds)
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]