https://github.com/python/cpython/commit/df59226997e067adcfa1bc8d045b7cc1de08906c commit: df59226997e067adcfa1bc8d045b7cc1de08906c branch: main author: Irit Katriel <1055913+iritkatr...@users.noreply.github.com> committer: iritkatriel <1055913+iritkatr...@users.noreply.github.com> 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 -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com