aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/optimizer_cases.c.h
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2025-01-27 16:24:48 +0000
committerGitHub <noreply@github.com>2025-01-27 16:24:48 +0000
commit75b49621578a45415bfeedd6cc68d50e821d8281 (patch)
tree907f5c0765dc65e5f0eaa81ef9f80589623e0361 /Python/optimizer_cases.c.h
parent8ec76d90340287eb3587f0ae388bbfe158fb28d8 (diff)
downloadcpython-75b49621578a45415bfeedd6cc68d50e821d8281.tar.gz
cpython-75b49621578a45415bfeedd6cc68d50e821d8281.zip
GH-128914: Remove all but one conditional stack effects (GH-129226)
* Remove all 'if (0)' and 'if (1)' conditional stack effects * Use array instead of conditional for BUILD_SLICE args * Refactor LOAD_GLOBAL to use a common conditional uop * Remove conditional stack effects from LOAD_ATTR specializations * Replace conditional stack effects in LOAD_ATTR with a 0 or 1 sized array. * Remove conditional stack effects from CALL_FUNCTION_EX
Diffstat (limited to 'Python/optimizer_cases.c.h')
-rw-r--r--Python/optimizer_cases.c.h121
1 files changed, 31 insertions, 90 deletions
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index fa0b4ed4345..2497754745c 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -928,12 +928,20 @@
case _LOAD_GLOBAL: {
JitOptSymbol **res;
- JitOptSymbol *null = NULL;
res = &stack_pointer[0];
res[0] = sym_new_not_null(ctx);
+ stack_pointer += 1;
+ assert(WITHIN_STACK_BOUNDS());
+ break;
+ }
+
+ case _PUSH_NULL_CONDITIONAL: {
+ JitOptSymbol *null = NULL;
+ int opcode = (oparg & 1) ? _PUSH_NULL : _NOP;
+ REPLACE_OP(this_instr, opcode, 0, 0);
null = sym_new_null(ctx);
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ if (oparg & 1) stack_pointer[0] = null;
+ stack_pointer += (oparg & 1);
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -966,25 +974,15 @@
case _LOAD_GLOBAL_MODULE_FROM_KEYS: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[-1] = res;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_GLOBAL_BUILTINS_FROM_KEYS: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[-1] = res;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1133,14 +1131,16 @@
case _LOAD_ATTR: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self_or_null = NULL;
+ JitOptSymbol **self_or_null;
owner = stack_pointer[-1];
+ self_or_null = &stack_pointer[0];
(void)owner;
attr = sym_new_not_null(ctx);
- self_or_null = sym_new_unknown(ctx);
+ if (oparg &1) {
+ self_or_null[0] = sym_new_unknown(ctx);
+ }
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = self_or_null;
- stack_pointer += (oparg & 1);
+ stack_pointer += (oparg&1);
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1182,17 +1182,12 @@
case _LOAD_ATTR_INSTANCE_VALUE: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-1];
uint16_t offset = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)offset;
(void)owner;
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1230,11 +1225,9 @@
case _LOAD_ATTR_MODULE_FROM_KEYS: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-2];
uint16_t index = (uint16_t)this_instr->operand0;
(void)index;
- null = sym_new_null(ctx);
attr = NULL;
if (this_instr[-1].opcode == _NOP) {
// Preceding _CHECK_ATTR_MODULE_PUSH_KEYS was removed: mod is const and dict is watched.
@@ -1243,8 +1236,7 @@
assert(PyModule_CheckExact(mod));
PyObject *dict = mod->md_dict;
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
PyObject *res = convert_global_to_const(this_instr, dict);
if (res != NULL) {
@@ -1254,7 +1246,7 @@
else {
this_instr->opcode = _LOAD_ATTR_MODULE;
}
- stack_pointer += 1 - (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
}
if (attr == NULL) {
@@ -1262,8 +1254,7 @@
attr = sym_new_not_null(ctx);
}
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1284,18 +1275,15 @@
JitOptSymbol *dict;
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
dict = stack_pointer[-1];
owner = stack_pointer[-2];
uint16_t hint = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)hint;
(void)owner;
(void)dict;
stack_pointer[-2] = attr;
- if (oparg & 1) stack_pointer[-1] = null;
- stack_pointer += -1 + (oparg & 1);
+ stack_pointer += -1;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1303,17 +1291,12 @@
case _LOAD_ATTR_SLOT: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-1];
uint16_t index = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)index;
(void)owner;
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1324,17 +1307,12 @@
case _LOAD_ATTR_CLASS: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
(void)descr;
(void)owner;
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -1723,7 +1701,7 @@
case _LOAD_ATTR_METHOD_WITH_VALUES: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self = NULL;
+ JitOptSymbol *self;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
(void)descr;
@@ -1739,7 +1717,7 @@
case _LOAD_ATTR_METHOD_NO_DICT: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self = NULL;
+ JitOptSymbol *self;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
(void)descr;
@@ -1773,7 +1751,7 @@
case _LOAD_ATTR_METHOD_LAZY_DICT: {
JitOptSymbol *owner;
JitOptSymbol *attr;
- JitOptSymbol *self = NULL;
+ JitOptSymbol *self;
owner = stack_pointer[-1];
PyObject *descr = (PyObject *)this_instr->operand0;
(void)descr;
@@ -2262,11 +2240,11 @@
case _MAKE_CALLARGS_A_TUPLE: {
JitOptSymbol *tuple;
- JitOptSymbol *kwargs_out = NULL;
+ JitOptSymbol *kwargs_out;
tuple = sym_new_not_null(ctx);
kwargs_out = sym_new_not_null(ctx);
- stack_pointer[-1 - (oparg & 1)] = tuple;
- if (oparg & 1) stack_pointer[-(oparg & 1)] = kwargs_out;
+ stack_pointer[-2] = tuple;
+ stack_pointer[-1] = kwargs_out;
break;
}
@@ -2315,8 +2293,8 @@
case _BUILD_SLICE: {
JitOptSymbol *slice;
slice = sym_new_not_null(ctx);
- stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice;
- stack_pointer += -1 - ((oparg == 3) ? 1 : 0);
+ stack_pointer[-oparg] = slice;
+ stack_pointer += 1 - oparg;
assert(WITHIN_STACK_BOUNDS());
break;
}
@@ -2607,69 +2585,32 @@
break;
}
- case _LOAD_CONST_INLINE_WITH_NULL: {
- JitOptSymbol *value;
- JitOptSymbol *null;
- PyObject *ptr = (PyObject *)this_instr->operand0;
- value = sym_new_const(ctx, ptr);
- null = sym_new_null(ctx);
- stack_pointer[0] = value;
- stack_pointer[1] = null;
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
- case _LOAD_CONST_INLINE_BORROW_WITH_NULL: {
- JitOptSymbol *value;
- JitOptSymbol *null;
- PyObject *ptr = (PyObject *)this_instr->operand0;
- value = sym_new_const(ctx, ptr);
- null = sym_new_null(ctx);
- stack_pointer[0] = value;
- stack_pointer[1] = null;
- stack_pointer += 2;
- assert(WITHIN_STACK_BOUNDS());
- break;
- }
-
case _CHECK_FUNCTION: {
break;
}
case _LOAD_GLOBAL_MODULE: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_GLOBAL_BUILTINS: {
JitOptSymbol *res;
- JitOptSymbol *null = NULL;
res = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[0] = res;
- if (oparg & 1) stack_pointer[1] = null;
- stack_pointer += 1 + (oparg & 1);
+ stack_pointer += 1;
assert(WITHIN_STACK_BOUNDS());
break;
}
case _LOAD_ATTR_MODULE: {
JitOptSymbol *attr;
- JitOptSymbol *null = NULL;
attr = sym_new_not_null(ctx);
- null = sym_new_null(ctx);
stack_pointer[-1] = attr;
- if (oparg & 1) stack_pointer[0] = null;
- stack_pointer += (oparg & 1);
- assert(WITHIN_STACK_BOUNDS());
break;
}