From a3d8c0542ea093c0e3e12b2839371cfc07463376 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 22 Aug 2024 14:17:10 +0100 Subject: GH-123197: Only count an instruction as deferred if it hasn't deopted first. (GH-123222) Only count an instruction as deferred if hasn't deopted first. --- Include/internal/pycore_code.h | 2 ++ Python/bytecodes.c | 30 +++++++++++++++--------------- Python/generated_cases.c.h | 30 +++++++++++++++--------------- Python/specialize.c | 1 + 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index a722a2e..112e880 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -384,6 +384,7 @@ extern void _Py_Specialize_ContainsOp(_PyStackRef value, _Py_CODEUNIT *instr); } \ } while (0) #define RARE_EVENT_STAT_INC(name) do { if (_Py_stats) _Py_stats->rare_event_stats.name++; } while (0) +#define OPCODE_DEFERRED_INC(opname) do { if (_Py_stats && opcode == opname) _Py_stats->opcode_stats[opname].specialization.deferred++; } while (0) // Export for '_opcode' shared extension PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); @@ -405,6 +406,7 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void); #define OPT_ERROR_IN_OPCODE(opname) ((void)0) #define OPT_HIST(length, name) ((void)0) #define RARE_EVENT_STAT_INC(name) ((void)0) +#define OPCODE_DEFERRED_INC(opname) ((void)0) #endif // !Py_STATS // Utility functions for reading/writing 32/64-bit values in the inline caches. diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 250e2d1..838af3e 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -350,7 +350,7 @@ dummy_func( _Py_Specialize_ToBool(value, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(TO_BOOL, deferred); + OPCODE_DEFERRED_INC(TO_BOOL); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -651,7 +651,7 @@ dummy_func( _Py_Specialize_BinarySubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(BINARY_SUBSCR, deferred); + OPCODE_DEFERRED_INC(BINARY_SUBSCR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -835,7 +835,7 @@ dummy_func( _Py_Specialize_StoreSubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(STORE_SUBSCR, deferred); + OPCODE_DEFERRED_INC(STORE_SUBSCR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -1048,7 +1048,7 @@ dummy_func( _Py_Specialize_Send(receiver, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(SEND, deferred); + OPCODE_DEFERRED_INC(SEND); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -1314,7 +1314,7 @@ dummy_func( _Py_Specialize_UnpackSequence(seq, next_instr, oparg); DISPATCH_SAME_OPARG(); } - STAT_INC(UNPACK_SEQUENCE, deferred); + OPCODE_DEFERRED_INC(UNPACK_SEQUENCE); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ (void)seq; @@ -1386,7 +1386,7 @@ dummy_func( _Py_Specialize_StoreAttr(owner, next_instr, name); DISPATCH_SAME_OPARG(); } - STAT_INC(STORE_ATTR, deferred); + OPCODE_DEFERRED_INC(STORE_ATTR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -1503,7 +1503,7 @@ dummy_func( _Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name); DISPATCH_SAME_OPARG(); } - STAT_INC(LOAD_GLOBAL, deferred); + OPCODE_DEFERRED_INC(LOAD_GLOBAL); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -1836,7 +1836,7 @@ dummy_func( _Py_Specialize_LoadSuperAttr(global_super_st, class_st, next_instr, load_method); DISPATCH_SAME_OPARG(); } - STAT_INC(LOAD_SUPER_ATTR, deferred); + OPCODE_DEFERRED_INC(LOAD_SUPER_ATTR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -1953,7 +1953,7 @@ dummy_func( _Py_Specialize_LoadAttr(owner, next_instr, name); DISPATCH_SAME_OPARG(); } - STAT_INC(LOAD_ATTR, deferred); + OPCODE_DEFERRED_INC(LOAD_ATTR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -2284,7 +2284,7 @@ dummy_func( _Py_Specialize_CompareOp(left, right, next_instr, oparg); DISPATCH_SAME_OPARG(); } - STAT_INC(COMPARE_OP, deferred); + OPCODE_DEFERRED_INC(COMPARE_OP); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -2405,7 +2405,7 @@ dummy_func( _Py_Specialize_ContainsOp(right, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(CONTAINS_OP, deferred); + OPCODE_DEFERRED_INC(CONTAINS_OP); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -2720,7 +2720,7 @@ dummy_func( _Py_Specialize_ForIter(iter, next_instr, oparg); DISPATCH_SAME_OPARG(); } - STAT_INC(FOR_ITER, deferred); + OPCODE_DEFERRED_INC(FOR_ITER); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -3189,7 +3189,7 @@ dummy_func( _Py_Specialize_Call(callable, next_instr, oparg + !PyStackRef_IsNull(self_or_null)); DISPATCH_SAME_OPARG(); } - STAT_INC(CALL, deferred); + OPCODE_DEFERRED_INC(CALL); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -4196,7 +4196,7 @@ dummy_func( _Py_Specialize_CallKw(callable, next_instr, oparg + !PyStackRef_IsNull(self_or_null)); DISPATCH_SAME_OPARG(); } - STAT_INC(CALL_KW, deferred); + OPCODE_DEFERRED_INC(CALL_KW); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -4471,7 +4471,7 @@ dummy_func( _Py_Specialize_BinaryOp(lhs, rhs, next_instr, oparg, LOCALS_ARRAY); DISPATCH_SAME_OPARG(); } - STAT_INC(BINARY_OP, deferred); + OPCODE_DEFERRED_INC(BINARY_OP); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ assert(NB_ADD <= oparg); diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 13bbff2..67bde83 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -31,7 +31,7 @@ _Py_Specialize_BinaryOp(lhs, rhs, next_instr, oparg, LOCALS_ARRAY); DISPATCH_SAME_OPARG(); } - STAT_INC(BINARY_OP, deferred); + OPCODE_DEFERRED_INC(BINARY_OP); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ assert(NB_ADD <= oparg); @@ -417,7 +417,7 @@ _Py_Specialize_BinarySubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(BINARY_SUBSCR, deferred); + OPCODE_DEFERRED_INC(BINARY_SUBSCR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -841,7 +841,7 @@ _Py_Specialize_Call(callable, next_instr, oparg + !PyStackRef_IsNull(self_or_null)); DISPATCH_SAME_OPARG(); } - STAT_INC(CALL, deferred); + OPCODE_DEFERRED_INC(CALL); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -1761,7 +1761,7 @@ _Py_Specialize_CallKw(callable, next_instr, oparg + !PyStackRef_IsNull(self_or_null)); DISPATCH_SAME_OPARG(); } - STAT_INC(CALL_KW, deferred); + OPCODE_DEFERRED_INC(CALL_KW); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -2994,7 +2994,7 @@ _Py_Specialize_CompareOp(left, right, next_instr, oparg); DISPATCH_SAME_OPARG(); } - STAT_INC(COMPARE_OP, deferred); + OPCODE_DEFERRED_INC(COMPARE_OP); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -3163,7 +3163,7 @@ _Py_Specialize_ContainsOp(right, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(CONTAINS_OP, deferred); + OPCODE_DEFERRED_INC(CONTAINS_OP); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -3624,7 +3624,7 @@ _Py_Specialize_ForIter(iter, next_instr, oparg); DISPATCH_SAME_OPARG(); } - STAT_INC(FOR_ITER, deferred); + OPCODE_DEFERRED_INC(FOR_ITER); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -4854,7 +4854,7 @@ _Py_Specialize_LoadAttr(owner, next_instr, name); DISPATCH_SAME_OPARG(); } - STAT_INC(LOAD_ATTR, deferred); + OPCODE_DEFERRED_INC(LOAD_ATTR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -5653,7 +5653,7 @@ _Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name); DISPATCH_SAME_OPARG(); } - STAT_INC(LOAD_GLOBAL, deferred); + OPCODE_DEFERRED_INC(LOAD_GLOBAL); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -5841,7 +5841,7 @@ _Py_Specialize_LoadSuperAttr(global_super_st, class_st, next_instr, load_method); DISPATCH_SAME_OPARG(); } - STAT_INC(LOAD_SUPER_ATTR, deferred); + OPCODE_DEFERRED_INC(LOAD_SUPER_ATTR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -6549,7 +6549,7 @@ _Py_Specialize_Send(receiver, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(SEND, deferred); + OPCODE_DEFERRED_INC(SEND); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -6783,7 +6783,7 @@ _Py_Specialize_StoreAttr(owner, next_instr, name); DISPATCH_SAME_OPARG(); } - STAT_INC(STORE_ATTR, deferred); + OPCODE_DEFERRED_INC(STORE_ATTR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -7086,7 +7086,7 @@ _Py_Specialize_StoreSubscr(container, sub, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(STORE_SUBSCR, deferred); + OPCODE_DEFERRED_INC(STORE_SUBSCR); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -7197,7 +7197,7 @@ _Py_Specialize_ToBool(value, next_instr); DISPATCH_SAME_OPARG(); } - STAT_INC(TO_BOOL, deferred); + OPCODE_DEFERRED_INC(TO_BOOL); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ } @@ -7423,7 +7423,7 @@ _Py_Specialize_UnpackSequence(seq, next_instr, oparg); DISPATCH_SAME_OPARG(); } - STAT_INC(UNPACK_SEQUENCE, deferred); + OPCODE_DEFERRED_INC(UNPACK_SEQUENCE); ADVANCE_ADAPTIVE_COUNTER(this_instr[1].counter); #endif /* ENABLE_SPECIALIZATION */ (void)seq; diff --git a/Python/specialize.c b/Python/specialize.c index 26965fe..82f1a88 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -116,6 +116,7 @@ _Py_GetSpecializationStats(void) { err += add_stat_dict(stats, STORE_SUBSCR, "store_subscr"); err += add_stat_dict(stats, STORE_ATTR, "store_attr"); err += add_stat_dict(stats, CALL, "call"); + err += add_stat_dict(stats, CALL_KW, "call_kw"); err += add_stat_dict(stats, BINARY_OP, "binary_op"); err += add_stat_dict(stats, COMPARE_OP, "compare_op"); err += add_stat_dict(stats, UNPACK_SEQUENCE, "unpack_sequence"); -- cgit v0.12