From 32428cf9ea03bce6d64c7acd28e0b7d92774eb53 Mon Sep 17 00:00:00 2001 From: mpage Date: Wed, 20 Nov 2024 14:54:48 -0800 Subject: [PATCH] gh-115999: Don't take a reason in unspecialize (#127030) Don't take a reason in unspecialize We only want to compute the reason if stats are enabled. Optimizing compilers should optimize this away for us (gcc and clang do), but it's better to be safe than sorry. --- Python/specialize.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Python/specialize.c b/Python/specialize.c index 4c8cf8534b3..ad41dfc39c0 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -719,7 +719,7 @@ specialize(_Py_CODEUNIT *instr, uint8_t specialized_opcode) } static inline void -unspecialize(_Py_CODEUNIT *instr, int reason) +unspecialize(_Py_CODEUNIT *instr) { assert(!PyErr_Occurred()); uint8_t opcode = FT_ATOMIC_LOAD_UINT8_RELAXED(instr->op.code); @@ -729,7 +729,6 @@ unspecialize(_Py_CODEUNIT *instr, int reason) SPECIALIZATION_FAIL(generic_opcode, SPEC_FAIL_OTHER); return; } - SPECIALIZATION_FAIL(generic_opcode, reason); _Py_BackoffCounter *counter = (_Py_BackoffCounter *)instr + 1; _Py_BackoffCounter cur = load_counter(counter); set_counter(counter, adaptive_counter_backoff(cur)); @@ -2243,6 +2242,7 @@ _Py_Specialize_CallKw(_PyStackRef callable_st, _Py_CODEUNIT *instr, int nargs) } } +#ifdef Py_STATS static int binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs) { @@ -2310,6 +2310,7 @@ binary_op_fail_kind(int oparg, PyObject *lhs, PyObject *rhs) } Py_UNREACHABLE(); } +#endif void _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *instr, @@ -2373,7 +2374,8 @@ _Py_Specialize_BinaryOp(_PyStackRef lhs_st, _PyStackRef rhs_st, _Py_CODEUNIT *in } break; } - unspecialize(instr, binary_op_fail_kind(oparg, lhs, rhs)); + SPECIALIZATION_FAIL(BINARY_OP, binary_op_fail_kind(oparg, lhs, rhs)); + unspecialize(instr); } @@ -2760,6 +2762,7 @@ _Py_Specialize_ToBool(_PyStackRef value_o, _Py_CODEUNIT *instr) cache->counter = adaptive_counter_cooldown(); } +#ifdef Py_STATS static int containsop_fail_kind(PyObject *value) { if (PyUnicode_CheckExact(value)) { @@ -2776,6 +2779,7 @@ containsop_fail_kind(PyObject *value) { } return SPEC_FAIL_OTHER; } +#endif void _Py_Specialize_ContainsOp(_PyStackRef value_st, _Py_CODEUNIT *instr) @@ -2793,7 +2797,8 @@ _Py_Specialize_ContainsOp(_PyStackRef value_st, _Py_CODEUNIT *instr) return; } - unspecialize(instr, containsop_fail_kind(value)); + SPECIALIZATION_FAIL(CONTAINS_OP, containsop_fail_kind(value)); + unspecialize(instr); return; }