aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/executor_cases.c.h
diff options
context:
space:
mode:
authorKen Jin <kenjin@python.org>2024-11-09 11:35:33 +0800
committerGitHub <noreply@github.com>2024-11-09 11:35:33 +0800
commit6293d00e7201f3f28b1f4512e57dc4f03855cabd (patch)
tree4baee70137f279c2e1f1a35159a806c67a7f9dff /Python/executor_cases.c.h
parentf8276bf5f37ef12aa0033634151fa33a6f7bd4f2 (diff)
downloadcpython-6293d00e7201f3f28b1f4512e57dc4f03855cabd.tar.gz
cpython-6293d00e7201f3f28b1f4512e57dc4f03855cabd.zip
gh-120619: Strength reduce function guards, support 2-operand uop forms (GH-124846)
Co-authored-by: Brandt Bucher <brandtbucher@gmail.com>
Diffstat (limited to 'Python/executor_cases.c.h')
-rw-r--r--Python/executor_cases.c.h108
1 files changed, 60 insertions, 48 deletions
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 1d63402214d..494ace1bd85 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -831,7 +831,7 @@
assert(next_instr->op.code == STORE_FAST);
next_oparg = next_instr->op.arg;
#else
- next_oparg = CURRENT_OPERAND();
+ next_oparg = CURRENT_OPERAND0();
#endif
_PyStackRef *target_local = &GETLOCAL(next_oparg);
if (!PyStackRef_Is(*target_local, left)) {
@@ -1864,7 +1864,7 @@
}
case _GUARD_GLOBALS_VERSION: {
- uint16_t version = (uint16_t)CURRENT_OPERAND();
+ uint16_t version = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)GLOBALS();
if (!PyDict_CheckExact(dict)) {
UOP_STAT_INC(uopcode, miss);
@@ -1880,7 +1880,7 @@
case _GUARD_GLOBALS_VERSION_PUSH_KEYS: {
PyDictKeysObject *globals_keys;
- uint16_t version = (uint16_t)CURRENT_OPERAND();
+ uint16_t version = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)GLOBALS();
if (!PyDict_CheckExact(dict)) {
UOP_STAT_INC(uopcode, miss);
@@ -1900,7 +1900,7 @@
case _GUARD_BUILTINS_VERSION_PUSH_KEYS: {
PyDictKeysObject *builtins_keys;
- uint16_t version = (uint16_t)CURRENT_OPERAND();
+ uint16_t version = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)BUILTINS();
if (!PyDict_CheckExact(dict)) {
UOP_STAT_INC(uopcode, miss);
@@ -1924,7 +1924,7 @@
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
globals_keys = (PyDictKeysObject *)stack_pointer[-1].bits;
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(globals_keys);
PyObject *res_o = entries[index].me_value;
stack_pointer += -1;
@@ -1950,7 +1950,7 @@
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
builtins_keys = (PyDictKeysObject *)stack_pointer[-1].bits;
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(builtins_keys);
PyObject *res_o = entries[index].me_value;
stack_pointer += -1;
@@ -2523,7 +2523,7 @@
case _GUARD_TYPE_VERSION: {
_PyStackRef owner;
owner = stack_pointer[-1];
- uint32_t type_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t type_version = (uint32_t)CURRENT_OPERAND0();
PyTypeObject *tp = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
assert(type_version != 0);
if (tp->tp_version_tag != type_version) {
@@ -2552,7 +2552,7 @@
_PyStackRef null = PyStackRef_NULL;
(void)null;
owner = stack_pointer[-1];
- uint16_t offset = (uint16_t)CURRENT_OPERAND();
+ uint16_t offset = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
PyObject *attr_o = *value_ptr;
@@ -2575,7 +2575,7 @@
_PyStackRef null = PyStackRef_NULL;
(void)null;
owner = stack_pointer[-1];
- uint16_t offset = (uint16_t)CURRENT_OPERAND();
+ uint16_t offset = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
PyObject *attr_o = *value_ptr;
@@ -2600,7 +2600,7 @@
case _CHECK_ATTR_MODULE: {
_PyStackRef owner;
owner = stack_pointer[-1];
- uint32_t dict_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t dict_version = (uint32_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
if (!PyModule_CheckExact(owner_o)) {
UOP_STAT_INC(uopcode, miss);
@@ -2621,7 +2621,7 @@
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyDictObject *dict = (PyDictObject *)((PyModuleObject *)owner_o)->md_dict;
assert(dict->ma_keys->dk_kind == DICT_KEYS_UNICODE);
@@ -2664,7 +2664,7 @@
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- uint16_t hint = (uint16_t)CURRENT_OPERAND();
+ uint16_t hint = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject *attr_o;
PyDictObject *dict = _PyObject_GetManagedDict(owner_o);
@@ -2705,7 +2705,7 @@
_PyStackRef null = PyStackRef_NULL;
(void)null;
owner = stack_pointer[-1];
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
char *addr = (char *)owner_o + index;
PyObject *attr_o = *(PyObject **)addr;
@@ -2727,7 +2727,7 @@
_PyStackRef null = PyStackRef_NULL;
(void)null;
owner = stack_pointer[-1];
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
char *addr = (char *)owner_o + index;
PyObject *attr_o = *(PyObject **)addr;
@@ -2751,7 +2751,7 @@
case _CHECK_ATTR_CLASS: {
_PyStackRef owner;
owner = stack_pointer[-1];
- uint32_t type_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t type_version = (uint32_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
if (!PyType_Check(owner_o)) {
UOP_STAT_INC(uopcode, miss);
@@ -2771,7 +2771,7 @@
_PyStackRef null = PyStackRef_NULL;
(void)null;
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
@@ -2787,7 +2787,7 @@
_PyStackRef null = PyStackRef_NULL;
(void)null;
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
attr = PyStackRef_FromPyObjectNew(descr);
@@ -2807,7 +2807,7 @@
_PyInterpreterFrame *new_frame;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- PyObject *fget = (PyObject *)CURRENT_OPERAND();
+ PyObject *fget = (PyObject *)CURRENT_OPERAND0();
assert((oparg & 1) == 0);
assert(Py_IS_TYPE(fget, &PyFunction_Type));
PyFunctionObject *f = (PyFunctionObject *)fget;
@@ -2859,7 +2859,7 @@
_PyStackRef value;
owner = stack_pointer[-1];
value = stack_pointer[-2];
- uint16_t offset = (uint16_t)CURRENT_OPERAND();
+ uint16_t offset = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
STAT_INC(STORE_ATTR, hit);
assert(_PyObject_GetManagedDict(owner_o) == NULL);
@@ -2886,7 +2886,7 @@
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
value = stack_pointer[-2];
- uint16_t hint = (uint16_t)CURRENT_OPERAND();
+ uint16_t hint = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
assert(Py_TYPE(owner_o)->tp_flags & Py_TPFLAGS_MANAGED_DICT);
PyDictObject *dict = _PyObject_GetManagedDict(owner_o);
@@ -2937,7 +2937,7 @@
_PyStackRef value;
owner = stack_pointer[-1];
value = stack_pointer[-2];
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
char *addr = (char *)owner_o + index;
STAT_INC(STORE_ATTR, hit);
@@ -3780,7 +3780,7 @@
case _GUARD_KEYS_VERSION: {
_PyStackRef owner;
owner = stack_pointer[-1];
- uint32_t keys_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t keys_version = (uint32_t)CURRENT_OPERAND0();
PyTypeObject *owner_cls = Py_TYPE(PyStackRef_AsPyObjectBorrow(owner));
PyHeapTypeObject *owner_heap_type = (PyHeapTypeObject *)owner_cls;
if (owner_heap_type->ht_cached_keys->dk_version != keys_version) {
@@ -3796,7 +3796,7 @@
_PyStackRef self = PyStackRef_NULL;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
assert(oparg & 1);
/* Cached method object */
STAT_INC(LOAD_ATTR, hit);
@@ -3817,7 +3817,7 @@
_PyStackRef self = PyStackRef_NULL;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
assert(oparg & 1);
assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
STAT_INC(LOAD_ATTR, hit);
@@ -3837,7 +3837,7 @@
_PyStackRef attr;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
assert((oparg & 1) == 0);
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
@@ -3852,7 +3852,7 @@
_PyStackRef attr;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
assert((oparg & 1) == 0);
assert(Py_TYPE(PyStackRef_AsPyObjectBorrow(owner))->tp_dictoffset == 0);
STAT_INC(LOAD_ATTR, hit);
@@ -3866,7 +3866,7 @@
case _CHECK_ATTR_METHOD_LAZY_DICT: {
_PyStackRef owner;
owner = stack_pointer[-1];
- uint16_t dictoffset = (uint16_t)CURRENT_OPERAND();
+ uint16_t dictoffset = (uint16_t)CURRENT_OPERAND0();
char *ptr = ((char *)PyStackRef_AsPyObjectBorrow(owner)) + MANAGED_DICT_OFFSET + dictoffset;
PyObject *dict = *(PyObject **)ptr;
/* This object has a __dict__, just not yet created */
@@ -3883,7 +3883,7 @@
_PyStackRef self = PyStackRef_NULL;
oparg = CURRENT_OPARG();
owner = stack_pointer[-1];
- PyObject *descr = (PyObject *)CURRENT_OPERAND();
+ PyObject *descr = (PyObject *)CURRENT_OPERAND0();
assert(oparg & 1);
STAT_INC(LOAD_ATTR, hit);
assert(descr != NULL);
@@ -3967,7 +3967,7 @@
_PyStackRef *callable;
oparg = CURRENT_OPARG();
callable = &stack_pointer[-2 - oparg];
- uint32_t func_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (!PyFunction_Check(callable_o)) {
UOP_STAT_INC(uopcode, miss);
@@ -3981,13 +3981,25 @@
break;
}
+ case _CHECK_FUNCTION_VERSION_INLINE: {
+ uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
+ PyObject *callable_o = (PyObject *)CURRENT_OPERAND1();
+ assert(PyFunction_Check(callable_o));
+ PyFunctionObject *func = (PyFunctionObject *)callable_o;
+ if (func->func_version != func_version) {
+ UOP_STAT_INC(uopcode, miss);
+ JUMP_TO_JUMP_TARGET();
+ }
+ break;
+ }
+
case _CHECK_METHOD_VERSION: {
_PyStackRef *null;
_PyStackRef *callable;
oparg = CURRENT_OPARG();
null = &stack_pointer[-1 - oparg];
callable = &stack_pointer[-2 - oparg];
- uint32_t func_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (Py_TYPE(callable_o) != &PyMethod_Type) {
UOP_STAT_INC(uopcode, miss);
@@ -4443,7 +4455,7 @@
callable = &stack_pointer[-2 - oparg];
init = &stack_pointer[-2 - oparg];
self = &stack_pointer[-1 - oparg];
- uint32_t type_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t type_version = (uint32_t)CURRENT_OPERAND0();
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (!PyStackRef_IsNull(null[0])) {
UOP_STAT_INC(uopcode, miss);
@@ -5201,7 +5213,7 @@
_PyStackRef *callable;
oparg = CURRENT_OPARG();
callable = &stack_pointer[-3 - oparg];
- uint32_t func_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (!PyFunction_Check(callable_o)) {
UOP_STAT_INC(uopcode, miss);
@@ -5221,7 +5233,7 @@
oparg = CURRENT_OPARG();
null = &stack_pointer[-2 - oparg];
callable = &stack_pointer[-3 - oparg];
- uint32_t func_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable[0]);
if (Py_TYPE(callable_o) != &PyMethod_Type) {
UOP_STAT_INC(uopcode, miss);
@@ -5659,13 +5671,13 @@
}
case _SET_IP: {
- PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND0();
frame->instr_ptr = (_Py_CODEUNIT *)instr_ptr;
break;
}
case _CHECK_STACK_SPACE_OPERAND: {
- uint32_t framesize = (uint32_t)CURRENT_OPERAND();
+ uint32_t framesize = (uint32_t)CURRENT_OPERAND0();
assert(framesize <= INT_MAX);
if (!_PyThreadState_HasStackSpace(tstate, framesize)) {
UOP_STAT_INC(uopcode, miss);
@@ -5690,7 +5702,7 @@
}
case _EXIT_TRACE: {
- PyObject *exit_p = (PyObject *)CURRENT_OPERAND();
+ PyObject *exit_p = (PyObject *)CURRENT_OPERAND0();
_PyExitData *exit = (_PyExitData *)exit_p;
PyCodeObject *code = _PyFrame_GetCode(frame);
_PyFrame_SetStackPointer(frame, stack_pointer);
@@ -5757,7 +5769,7 @@
case _LOAD_CONST_INLINE: {
_PyStackRef value;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
value = PyStackRef_FromPyObjectNew(ptr);
stack_pointer[0] = value;
stack_pointer += 1;
@@ -5767,7 +5779,7 @@
case _LOAD_CONST_INLINE_BORROW: {
_PyStackRef value;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
value = PyStackRef_FromPyObjectImmortal(ptr);
stack_pointer[0] = value;
stack_pointer += 1;
@@ -5779,7 +5791,7 @@
_PyStackRef pop;
_PyStackRef value;
pop = stack_pointer[-1];
- PyObject *ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
PyStackRef_CLOSE(pop);
value = PyStackRef_FromPyObjectImmortal(ptr);
stack_pointer[-1] = value;
@@ -5789,7 +5801,7 @@
case _LOAD_CONST_INLINE_WITH_NULL: {
_PyStackRef value;
_PyStackRef null;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
value = PyStackRef_FromPyObjectNew(ptr);
null = PyStackRef_NULL;
stack_pointer[0] = value;
@@ -5802,7 +5814,7 @@
case _LOAD_CONST_INLINE_BORROW_WITH_NULL: {
_PyStackRef value;
_PyStackRef null;
- PyObject *ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *ptr = (PyObject *)CURRENT_OPERAND0();
value = PyStackRef_FromPyObjectImmortal(ptr);
null = PyStackRef_NULL;
stack_pointer[0] = value;
@@ -5813,7 +5825,7 @@
}
case _CHECK_FUNCTION: {
- uint32_t func_version = (uint32_t)CURRENT_OPERAND();
+ uint32_t func_version = (uint32_t)CURRENT_OPERAND0();
assert(PyStackRef_FunctionCheck(frame->f_funcobj));
PyFunctionObject *func = (PyFunctionObject *)PyStackRef_AsPyObjectBorrow(frame->f_funcobj);
if (func->func_version != func_version) {
@@ -5827,7 +5839,7 @@
_PyStackRef res;
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)GLOBALS();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
PyObject *res_o = entries[index].me_value;
@@ -5849,7 +5861,7 @@
_PyStackRef res;
_PyStackRef null = PyStackRef_NULL;
oparg = CURRENT_OPARG();
- uint16_t index = (uint16_t)CURRENT_OPERAND();
+ uint16_t index = (uint16_t)CURRENT_OPERAND0();
PyDictObject *dict = (PyDictObject *)BUILTINS();
PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(dict->ma_keys);
PyObject *res_o = entries[index].me_value;
@@ -5878,7 +5890,7 @@
}
case _DYNAMIC_EXIT: {
- PyObject *exit_p = (PyObject *)CURRENT_OPERAND();
+ PyObject *exit_p = (PyObject *)CURRENT_OPERAND0();
tstate->previous_executor = (PyObject *)current_executor;
_PyExitData *exit = (_PyExitData *)exit_p;
_Py_CODEUNIT *target = frame->instr_ptr;
@@ -5925,7 +5937,7 @@
}
case _START_EXECUTOR: {
- PyObject *executor = (PyObject *)CURRENT_OPERAND();
+ PyObject *executor = (PyObject *)CURRENT_OPERAND0();
Py_DECREF(tstate->previous_executor);
tstate->previous_executor = NULL;
#ifndef _Py_JIT
@@ -5951,7 +5963,7 @@
}
case _CHECK_VALIDITY_AND_SET_IP: {
- PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND();
+ PyObject *instr_ptr = (PyObject *)CURRENT_OPERAND0();
if (!current_executor->vm_data.valid) {
UOP_STAT_INC(uopcode, miss);
JUMP_TO_JUMP_TARGET();
@@ -5967,7 +5979,7 @@
case _ERROR_POP_N: {
oparg = CURRENT_OPARG();
- uint32_t target = (uint32_t)CURRENT_OPERAND();
+ uint32_t target = (uint32_t)CURRENT_OPERAND0();
stack_pointer += -oparg;
assert(WITHIN_STACK_BOUNDS());
_PyFrame_SetStackPointer(frame, stack_pointer);