summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorMichael Droettboom <mdboom@gmail.com>2023-10-31 00:02:45 (GMT)
committerGitHub <noreply@github.com>2023-10-31 00:02:45 (GMT)
commit84b4533e8446cbff3325fffe939c87f7120a3ffd (patch)
treedd06a187031f6929c5bf4ba0e49ccac87e5b8ed8 /Include
parentc6fe0869ab1d91525f88279f8567461082c0d3ce (diff)
downloadcpython-84b4533e8446cbff3325fffe939c87f7120a3ffd.zip
cpython-84b4533e8446cbff3325fffe939c87f7120a3ffd.tar.gz
cpython-84b4533e8446cbff3325fffe939c87f7120a3ffd.tar.bz2
gh-109329: Count tier2 opcode misses (#110561)
This keeps a separate 'miss' counter for each micro-opcode, incremented whenever a guard uop takes a deoptimization side exit.
Diffstat (limited to 'Include')
-rw-r--r--Include/cpython/pystats.h1
-rw-r--r--Include/internal/pycore_code.h4
2 files changed, 3 insertions, 2 deletions
diff --git a/Include/cpython/pystats.h b/Include/cpython/pystats.h
index 4988caa..294bf15 100644
--- a/Include/cpython/pystats.h
+++ b/Include/cpython/pystats.h
@@ -98,6 +98,7 @@ typedef struct _gc_stats {
typedef struct _uop_stats {
uint64_t execution_count;
+ uint64_t miss;
} UOpStats;
#define _Py_UOP_HIST_SIZE 32
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index d31d836..4f126ab 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -283,7 +283,7 @@ extern int _PyStaticCode_Init(PyCodeObject *co);
do { if (_Py_stats && PyFunction_Check(callable)) _Py_stats->call_stats.eval_calls[name]++; } while (0)
#define GC_STAT_ADD(gen, name, n) do { if (_Py_stats) _Py_stats->gc_stats[(gen)].name += (n); } while (0)
#define OPT_STAT_INC(name) do { if (_Py_stats) _Py_stats->optimization_stats.name++; } while (0)
-#define UOP_EXE_INC(opname) do { if (_Py_stats) _Py_stats->optimization_stats.opcode[opname].execution_count++; } while (0)
+#define UOP_STAT_INC(opname, name) do { if (_Py_stats) { assert(opname < 512); _Py_stats->optimization_stats.opcode[opname].name++; } } while (0)
#define OPT_UNSUPPORTED_OPCODE(opname) do { if (_Py_stats) _Py_stats->optimization_stats.unsupported_opcode[opname]++; } while (0)
#define OPT_HIST(length, name) \
do { \
@@ -308,7 +308,7 @@ PyAPI_FUNC(PyObject*) _Py_GetSpecializationStats(void);
#define EVAL_CALL_STAT_INC_IF_FUNCTION(name, callable) ((void)0)
#define GC_STAT_ADD(gen, name, n) ((void)0)
#define OPT_STAT_INC(name) ((void)0)
-#define UOP_EXE_INC(opname) ((void)0)
+#define UOP_STAT_INC(opname, name) ((void)0)
#define OPT_UNSUPPORTED_OPCODE(opname) ((void)0)
#define OPT_HIST(length, name) ((void)0)
#endif // !Py_STATS