]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109979: Unify _GUARD_TYPE_VERSION{,_STORE} (#110301)
authorGuido van Rossum <guido@python.org>
Tue, 3 Oct 2023 22:37:21 +0000 (15:37 -0700)
committerGitHub <noreply@github.com>
Tue, 3 Oct 2023 22:37:21 +0000 (22:37 +0000)
Now the target for `DEOPT_IF()` is auto-filled,
we don't need a separate `_GUARD_TYPE_VERSION_STORE` uop.

Include/internal/pycore_opcode_metadata.h
Python/abstract_interp_cases.c.h
Python/bytecodes.c
Python/executor_cases.c.h
Python/generated_cases.c.h

index 16c1637e4960330ab196847d329b3e2989a82940..431a914d26e6851794beea112ab771c256b70849 100644 (file)
 #define _LOAD_ATTR_SLOT 321
 #define _GUARD_DORV_VALUES 322
 #define _STORE_ATTR_INSTANCE_VALUE 323
-#define _GUARD_TYPE_VERSION_STORE 324
-#define _STORE_ATTR_SLOT 325
-#define _IS_NONE 326
-#define _ITER_CHECK_LIST 327
-#define _ITER_JUMP_LIST 328
-#define _IS_ITER_EXHAUSTED_LIST 329
-#define _ITER_NEXT_LIST 330
-#define _ITER_CHECK_TUPLE 331
-#define _ITER_JUMP_TUPLE 332
-#define _IS_ITER_EXHAUSTED_TUPLE 333
-#define _ITER_NEXT_TUPLE 334
-#define _ITER_CHECK_RANGE 335
-#define _ITER_JUMP_RANGE 336
-#define _IS_ITER_EXHAUSTED_RANGE 337
-#define _ITER_NEXT_RANGE 338
-#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 339
-#define _GUARD_KEYS_VERSION 340
-#define _LOAD_ATTR_METHOD_WITH_VALUES 341
-#define _LOAD_ATTR_METHOD_NO_DICT 342
-#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 343
-#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 344
-#define _CHECK_PEP_523 345
-#define _CHECK_FUNCTION_EXACT_ARGS 346
-#define _CHECK_STACK_SPACE 347
-#define _INIT_CALL_PY_EXACT_ARGS 348
-#define _PUSH_FRAME 349
-#define _POP_JUMP_IF_FALSE 350
-#define _POP_JUMP_IF_TRUE 351
-#define _JUMP_TO_TOP 352
-#define _SAVE_CURRENT_IP 353
-#define _INSERT 354
+#define _STORE_ATTR_SLOT 324
+#define _IS_NONE 325
+#define _ITER_CHECK_LIST 326
+#define _ITER_JUMP_LIST 327
+#define _IS_ITER_EXHAUSTED_LIST 328
+#define _ITER_NEXT_LIST 329
+#define _ITER_CHECK_TUPLE 330
+#define _ITER_JUMP_TUPLE 331
+#define _IS_ITER_EXHAUSTED_TUPLE 332
+#define _ITER_NEXT_TUPLE 333
+#define _ITER_CHECK_RANGE 334
+#define _ITER_JUMP_RANGE 335
+#define _IS_ITER_EXHAUSTED_RANGE 336
+#define _ITER_NEXT_RANGE 337
+#define _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT 338
+#define _GUARD_KEYS_VERSION 339
+#define _LOAD_ATTR_METHOD_WITH_VALUES 340
+#define _LOAD_ATTR_METHOD_NO_DICT 341
+#define _CHECK_CALL_BOUND_METHOD_EXACT_ARGS 342
+#define _INIT_CALL_BOUND_METHOD_EXACT_ARGS 343
+#define _CHECK_PEP_523 344
+#define _CHECK_FUNCTION_EXACT_ARGS 345
+#define _CHECK_STACK_SPACE 346
+#define _INIT_CALL_PY_EXACT_ARGS 347
+#define _PUSH_FRAME 348
+#define _POP_JUMP_IF_FALSE 349
+#define _POP_JUMP_IF_TRUE 350
+#define _JUMP_TO_TOP 351
+#define _SAVE_CURRENT_IP 352
+#define _INSERT 353
 
 extern int _PyOpcode_num_popped(int opcode, int oparg, bool jump);
 #ifdef NEED_OPCODE_METADATA
@@ -383,8 +382,6 @@ int _PyOpcode_num_popped(int opcode, int oparg, bool jump)  {
             return 2;
         case STORE_ATTR_WITH_HINT:
             return 2;
-        case _GUARD_TYPE_VERSION_STORE:
-            return 1;
         case _STORE_ATTR_SLOT:
             return 2;
         case STORE_ATTR_SLOT:
@@ -941,8 +938,6 @@ int _PyOpcode_num_pushed(int opcode, int oparg, bool jump)  {
             return 0;
         case STORE_ATTR_WITH_HINT:
             return 0;
-        case _GUARD_TYPE_VERSION_STORE:
-            return 1;
         case _STORE_ATTR_SLOT:
             return 0;
         case STORE_ATTR_SLOT:
@@ -1413,7 +1408,6 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[OPCODE_METADATA_SIZE] = {
     [_STORE_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IXC, 0 },
     [STORE_ATTR_INSTANCE_VALUE] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG },
     [STORE_ATTR_WITH_HINT] = { true, INSTR_FMT_IBC000, HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG },
-    [_GUARD_TYPE_VERSION_STORE] = { true, INSTR_FMT_IXC0, HAS_DEOPT_FLAG },
     [_STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC, 0 },
     [STORE_ATTR_SLOT] = { true, INSTR_FMT_IXC000, HAS_DEOPT_FLAG },
     [COMPARE_OP] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_ERROR_FLAG },
@@ -1638,8 +1632,8 @@ const struct opcode_macro_expansion _PyOpcode_macro_expansion[OPCODE_MACRO_EXPAN
     [LOAD_ATTR] = { .nuops = 1, .uops = { { LOAD_ATTR, 0, 0 } } },
     [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, 0, 0 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 } } },
     [LOAD_ATTR_SLOT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 } } },
-    [STORE_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION_STORE, 2, 1 }, { _GUARD_DORV_VALUES, 0, 0 }, { _STORE_ATTR_INSTANCE_VALUE, 1, 3 } } },
-    [STORE_ATTR_SLOT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION_STORE, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 } } },
+    [STORE_ATTR_INSTANCE_VALUE] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES, 0, 0 }, { _STORE_ATTR_INSTANCE_VALUE, 1, 3 } } },
+    [STORE_ATTR_SLOT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _STORE_ATTR_SLOT, 1, 3 } } },
     [COMPARE_OP] = { .nuops = 1, .uops = { { COMPARE_OP, 0, 0 } } },
     [COMPARE_OP_FLOAT] = { .nuops = 1, .uops = { { COMPARE_OP_FLOAT, 0, 0 } } },
     [COMPARE_OP_INT] = { .nuops = 1, .uops = { { COMPARE_OP_INT, 0, 0 } } },
@@ -1714,7 +1708,6 @@ const char * const _PyOpcode_uop_name[OPCODE_UOP_NAME_SIZE] = {
     [_LOAD_ATTR_SLOT] = "_LOAD_ATTR_SLOT",
     [_GUARD_DORV_VALUES] = "_GUARD_DORV_VALUES",
     [_STORE_ATTR_INSTANCE_VALUE] = "_STORE_ATTR_INSTANCE_VALUE",
-    [_GUARD_TYPE_VERSION_STORE] = "_GUARD_TYPE_VERSION_STORE",
     [_STORE_ATTR_SLOT] = "_STORE_ATTR_SLOT",
     [_IS_NONE] = "_IS_NONE",
     [_ITER_CHECK_LIST] = "_ITER_CHECK_LIST",
index 61b1db9e5a154318783b24b7bc741bf35a3dff2d..e98f7642542d8d5bc64b189fba94a5e376b5cee3 100644 (file)
             break;
         }
 
-        case _GUARD_TYPE_VERSION_STORE: {
-            break;
-        }
-
         case _STORE_ATTR_SLOT: {
             STACK_SHRINK(2);
             break;
index 035629dda6e7db18471c40b766560af56df7ac25..08f80810d5a3402dcfe8fa3ff7ace0cbc6f668da 100644 (file)
@@ -2038,7 +2038,7 @@ dummy_func(
 
         macro(STORE_ATTR_INSTANCE_VALUE) =
             unused/1 +
-            _GUARD_TYPE_VERSION_STORE +
+            _GUARD_TYPE_VERSION +
             _GUARD_DORV_VALUES +
             _STORE_ATTR_INSTANCE_VALUE;
 
@@ -2083,12 +2083,6 @@ dummy_func(
             Py_DECREF(owner);
         }
 
-        op(_GUARD_TYPE_VERSION_STORE, (type_version/2, owner -- owner)) {
-            PyTypeObject *tp = Py_TYPE(owner);
-            assert(type_version != 0);
-            DEOPT_IF(tp->tp_version_tag != type_version);
-        }
-
         op(_STORE_ATTR_SLOT, (index/1, value, owner --)) {
             char *addr = (char *)owner + index;
             STAT_INC(STORE_ATTR, hit);
@@ -2100,7 +2094,7 @@ dummy_func(
 
         macro(STORE_ATTR_SLOT) =
             unused/1 +
-            _GUARD_TYPE_VERSION_STORE +
+            _GUARD_TYPE_VERSION +
             _STORE_ATTR_SLOT;
 
         family(COMPARE_OP, INLINE_CACHE_ENTRIES_COMPARE_OP) = {
index 662de57553fb4723abfd8bbdbfb74d6153b2c1e5..bbdc508a0366571e6a72ee5b9a68ad1cb8739592 100644 (file)
             break;
         }
 
-        case _GUARD_TYPE_VERSION_STORE: {
-            PyObject *owner;
-            owner = stack_pointer[-1];
-            uint32_t type_version = (uint32_t)operand;
-            PyTypeObject *tp = Py_TYPE(owner);
-            assert(type_version != 0);
-            DEOPT_IF(tp->tp_version_tag != type_version, _GUARD_TYPE_VERSION_STORE);
-            break;
-        }
-
         case _STORE_ATTR_SLOT: {
             PyObject *owner;
             PyObject *value;
index 96d9d9db9c7928044d2a7e5c77d423892a51f3f0..c616d03b352fbda2ec1ec4d8bb663754a0c15c9e 100644 (file)
         TARGET(STORE_ATTR_INSTANCE_VALUE) {
             PyObject *owner;
             PyObject *value;
-            // _GUARD_TYPE_VERSION_STORE
+            // _GUARD_TYPE_VERSION
             owner = stack_pointer[-1];
             {
                 uint32_t type_version = read_u32(&next_instr[1].cache);
         TARGET(STORE_ATTR_SLOT) {
             PyObject *owner;
             PyObject *value;
-            // _GUARD_TYPE_VERSION_STORE
+            // _GUARD_TYPE_VERSION
             owner = stack_pointer[-1];
             {
                 uint32_t type_version = read_u32(&next_instr[1].cache);