summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorKen Jin <kenjin@python.org>2024-02-23 07:42:03 (GMT)
committerGitHub <noreply@github.com>2024-02-23 07:42:03 (GMT)
commita33ffe4785f90f68227ddf2ec3e06d5ceaf76cec (patch)
tree941f62dd34527cf4208ad9c319cc8f2fd7582d9e /Python
parenta494a3dd8e0e74861972698c37b14a4087a4688c (diff)
downloadcpython-a33ffe4785f90f68227ddf2ec3e06d5ceaf76cec.zip
cpython-a33ffe4785f90f68227ddf2ec3e06d5ceaf76cec.tar.gz
cpython-a33ffe4785f90f68227ddf2ec3e06d5ceaf76cec.tar.bz2
gh-114058: More robust method handling in redundancy eliminator (GH-115779)
Diffstat (limited to 'Python')
-rw-r--r--Python/optimizer_analysis.c1
-rw-r--r--Python/tier2_redundancy_eliminator_bytecodes.c21
-rw-r--r--Python/tier2_redundancy_eliminator_cases.c.h35
3 files changed, 41 insertions, 16 deletions
diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c
index 68ef825..9503dcc 100644
--- a/Python/optimizer_analysis.c
+++ b/Python/optimizer_analysis.c
@@ -315,6 +315,7 @@ sym_new_known_notnull(_Py_UOpsAbstractInterpContext *ctx)
if (res == NULL) {
return NULL;
}
+ sym_set_flag(res, KNOWN);
sym_set_flag(res, NOT_NULL);
return res;
}
diff --git a/Python/tier2_redundancy_eliminator_bytecodes.c b/Python/tier2_redundancy_eliminator_bytecodes.c
index ff2b9a4..ef7b43d 100644
--- a/Python/tier2_redundancy_eliminator_bytecodes.c
+++ b/Python/tier2_redundancy_eliminator_bytecodes.c
@@ -295,6 +295,27 @@ dummy_func(void) {
(void)owner;
}
+ op(_LOAD_ATTR_METHOD_WITH_VALUES, (descr/4, owner -- attr, self if (1))) {
+ OUT_OF_SPACE_IF_NULL(attr = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
+ }
+
+ op(_LOAD_ATTR_METHOD_NO_DICT, (descr/4, owner -- attr, self if (1))) {
+ OUT_OF_SPACE_IF_NULL(attr = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
+ }
+
+ op(_LOAD_ATTR_METHOD_LAZY_DICT, (descr/4, owner -- attr, self if (1))) {
+ OUT_OF_SPACE_IF_NULL(attr = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
+ }
+
+ op(_INIT_CALL_BOUND_METHOD_EXACT_ARGS, (callable, unused, unused[oparg] -- func, self, unused[oparg])) {
+ OUT_OF_SPACE_IF_NULL(func = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
+ }
+
+
op(_CHECK_FUNCTION_EXACT_ARGS, (func_version/2, callable, self_or_null, unused[oparg] -- callable, self_or_null, unused[oparg])) {
sym_set_type(callable, &PyFunction_Type);
(void)self_or_null;
diff --git a/Python/tier2_redundancy_eliminator_cases.c.h b/Python/tier2_redundancy_eliminator_cases.c.h
index 58c11b7..ca9b595 100644
--- a/Python/tier2_redundancy_eliminator_cases.c.h
+++ b/Python/tier2_redundancy_eliminator_cases.c.h
@@ -1300,12 +1300,13 @@
}
case _LOAD_ATTR_METHOD_WITH_VALUES: {
+ _Py_UOpsSymType *owner;
_Py_UOpsSymType *attr;
_Py_UOpsSymType *self = NULL;
- attr = sym_new_unknown(ctx);
- if (attr == NULL) goto out_of_space;
- self = sym_new_unknown(ctx);
- if (self == NULL) goto out_of_space;
+ owner = stack_pointer[-1];
+ PyObject *descr = (PyObject *)this_instr->operand;
+ OUT_OF_SPACE_IF_NULL(attr = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
stack_pointer[-1] = attr;
stack_pointer[0] = self;
stack_pointer += 1;
@@ -1313,12 +1314,13 @@
}
case _LOAD_ATTR_METHOD_NO_DICT: {
+ _Py_UOpsSymType *owner;
_Py_UOpsSymType *attr;
_Py_UOpsSymType *self = NULL;
- attr = sym_new_unknown(ctx);
- if (attr == NULL) goto out_of_space;
- self = sym_new_unknown(ctx);
- if (self == NULL) goto out_of_space;
+ owner = stack_pointer[-1];
+ PyObject *descr = (PyObject *)this_instr->operand;
+ OUT_OF_SPACE_IF_NULL(attr = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
stack_pointer[-1] = attr;
stack_pointer[0] = self;
stack_pointer += 1;
@@ -1346,12 +1348,13 @@
}
case _LOAD_ATTR_METHOD_LAZY_DICT: {
+ _Py_UOpsSymType *owner;
_Py_UOpsSymType *attr;
_Py_UOpsSymType *self = NULL;
- attr = sym_new_unknown(ctx);
- if (attr == NULL) goto out_of_space;
- self = sym_new_unknown(ctx);
- if (self == NULL) goto out_of_space;
+ owner = stack_pointer[-1];
+ PyObject *descr = (PyObject *)this_instr->operand;
+ OUT_OF_SPACE_IF_NULL(attr = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
stack_pointer[-1] = attr;
stack_pointer[0] = self;
stack_pointer += 1;
@@ -1373,12 +1376,12 @@
}
case _INIT_CALL_BOUND_METHOD_EXACT_ARGS: {
+ _Py_UOpsSymType *callable;
_Py_UOpsSymType *func;
_Py_UOpsSymType *self;
- func = sym_new_unknown(ctx);
- if (func == NULL) goto out_of_space;
- self = sym_new_unknown(ctx);
- if (self == NULL) goto out_of_space;
+ callable = stack_pointer[-2 - oparg];
+ OUT_OF_SPACE_IF_NULL(func = sym_new_known_notnull(ctx));
+ OUT_OF_SPACE_IF_NULL(self = sym_new_known_notnull(ctx));
stack_pointer[-2 - oparg] = func;
stack_pointer[-1 - oparg] = self;
break;