]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-117121: Add pystats to JIT builds (GH-117346)
authorMichael Droettboom <mdboom@gmail.com>
Thu, 28 Mar 2024 22:23:08 +0000 (18:23 -0400)
committerGitHub <noreply@github.com>
Thu, 28 Mar 2024 22:23:08 +0000 (15:23 -0700)
Python/ceval.c
Python/ceval_macros.h
Tools/jit/template.c

index cd51011450c3d5eb10f476bca9dce566aa8f8431..d34db61eecbae21263f8171ab8d270cc063d677c 100644 (file)
@@ -990,7 +990,7 @@ enter_tier_two:
     #define DPRINTF(level, ...)
 #endif
 
-    OPT_STAT_INC(traces_executed);
+    ; // dummy statement after a label, before a declaration
     uint16_t uopcode;
 #ifdef Py_STATS
     uint64_t trace_uop_execution_counter = 0;
index f2536ed3602c69f31c11965b9133d52f2bfe43c1..1194c11f8ba6070b949e82a55d66d8bf057fbd7a 100644 (file)
@@ -392,6 +392,7 @@ stack_pointer = _PyFrame_GetStackPointer(frame);
 #ifdef _Py_JIT
 #define GOTO_TIER_TWO(EXECUTOR)                        \
 do {                                                   \
+    OPT_STAT_INC(traces_executed);                     \
     jit_func jitted = (EXECUTOR)->jit_code;            \
     next_instr = jitted(frame, stack_pointer, tstate); \
     Py_DECREF(tstate->previous_executor);              \
@@ -406,6 +407,7 @@ do {                                                   \
 #else
 #define GOTO_TIER_TWO(EXECUTOR) \
 do { \
+    OPT_STAT_INC(traces_executed); \
     next_uop = (EXECUTOR)->trace; \
     assert(next_uop->opcode == _START_EXECUTOR || next_uop->opcode == _COLD_EXIT); \
     goto enter_tier_two; \
index 9b4fc2af9671eb126b71e84f42d89b49b40d69dc..f8be4d7f78facd3373c261853be77e1d4d8fda4d 100644 (file)
@@ -43,6 +43,7 @@
 #undef GOTO_TIER_TWO
 #define GOTO_TIER_TWO(EXECUTOR) \
 do {  \
+    OPT_STAT_INC(traces_executed);                \
     __attribute__((musttail))                     \
     return ((jit_func)((EXECUTOR)->jit_code))(frame, stack_pointer, tstate); \
 } while (0)
@@ -88,6 +89,10 @@ _JIT_ENTRY(_PyInterpreterFrame *frame, PyObject **stack_pointer, PyThreadState *
     PATCH_VALUE(uint64_t, _operand, _JIT_OPERAND)
     PATCH_VALUE(uint32_t, _target, _JIT_TARGET)
     PATCH_VALUE(uint16_t, _exit_index, _JIT_EXIT_INDEX)
+
+    OPT_STAT_INC(uops_executed);
+    UOP_STAT_INC(opcode, execution_count);
+
     // The actual instruction definitions (only one will be used):
     if (opcode == _JUMP_TO_TOP) {
         CHECK_EVAL_BREAKER();
@@ -106,9 +111,11 @@ error_tier_two:
     GOTO_TIER_ONE(NULL);
 exit_to_tier1:
     tstate->previous_executor = (PyObject *)current_executor;
+    UOP_STAT_INC(opcode, miss);
     GOTO_TIER_ONE(_PyCode_CODE(_PyFrame_GetCode(frame)) + _target);
 exit_to_trace:
     {
+        UOP_STAT_INC(opcode, miss);
         _PyExitData *exit = &current_executor->exits[_exit_index];
         Py_INCREF(exit->executor);
         tstate->previous_executor = (PyObject *)current_executor;