[Python-checkins] gh-104584: Change DEOPT_IF in uops executor (#106146)

gvanrossum webhook-mailer at python.org
Tue Jun 27 17:17:45 EDT 2023


https://github.com/python/cpython/commit/6b5166fb12c4744544da4ee26ef437d025eb762a
commit: 6b5166fb12c4744544da4ee26ef437d025eb762a
branch: main
author: Guido van Rossum <guido at python.org>
committer: gvanrossum <gvanrossum at gmail.com>
date: 2023-06-27T14:17:41-07:00
summary:

gh-104584: Change DEOPT_IF in uops executor (#106146)

This effectively reverts bb578a0, restoring the original DEOPT_IF() macro in ceval_macros.h, and redefining it in the Tier 2 interpreter. We can get rid of the PREDICTED() macros there as well!

files:
M Python/ceval.c
M Python/ceval_macros.h

diff --git a/Python/ceval.c b/Python/ceval.c
index 3e0dcf8c8629..e19860d04a79 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -2767,10 +2767,11 @@ void Py_LeaveRecursiveCall(void)
 
 ///////////////////// Experimental UOp Interpreter /////////////////////
 
-// UPDATE_MISS_STATS (called by DEOPT_IF) uses next_instr
-// TODO: Make it do something useful
-#undef UPDATE_MISS_STATS
-#define UPDATE_MISS_STATS(INSTNAME) ((void)0)
+#undef DEOPT_IF
+#define DEOPT_IF(COND, INSTNAME) \
+    if ((COND)) {                \
+        goto deoptimize;         \
+    }
 
 _PyInterpreterFrame *
 _PyUopExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject **stack_pointer)
@@ -2875,12 +2876,7 @@ _PyUopExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject
     Py_DECREF(self);
     return NULL;
 
-PREDICTED(UNPACK_SEQUENCE)
-PREDICTED(COMPARE_OP)
-PREDICTED(LOAD_SUPER_ATTR)
-PREDICTED(STORE_SUBSCR)
-PREDICTED(BINARY_SUBSCR)
-PREDICTED(BINARY_OP)
+deoptimize:
     // On DEOPT_IF we just repeat the last instruction.
     // This presumes nothing was popped from the stack (nor pushed).
 #ifdef LLTRACE
diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h
index f5c78fc65e17..0d41ef5a14ce 100644
--- a/Python/ceval_macros.h
+++ b/Python/ceval_macros.h
@@ -264,12 +264,11 @@ GETITEM(PyObject *v, Py_ssize_t i) {
 #define UPDATE_MISS_STATS(INSTNAME) ((void)0)
 #endif
 
-// NOTE: in the uops version, opcode may be > 255
 #define DEOPT_IF(COND, INSTNAME)                            \
     if ((COND)) {                                           \
         /* This is only a single jump on release builds! */ \
         UPDATE_MISS_STATS((INSTNAME));                      \
-        assert(opcode >= 256 || _PyOpcode_Deopt[opcode] == (INSTNAME)); \
+        assert(_PyOpcode_Deopt[opcode] == (INSTNAME));      \
         GO_TO_INSTRUCTION(INSTNAME);                        \
     }
 



More information about the Python-checkins mailing list