diff options
author | Ken Jin <kenjin@python.org> | 2024-02-23 07:42:03 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-23 07:42:03 (GMT) |
commit | a33ffe4785f90f68227ddf2ec3e06d5ceaf76cec (patch) | |
tree | 941f62dd34527cf4208ad9c319cc8f2fd7582d9e /Python | |
parent | a494a3dd8e0e74861972698c37b14a4087a4688c (diff) | |
download | cpython-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.c | 1 | ||||
-rw-r--r-- | Python/tier2_redundancy_eliminator_bytecodes.c | 21 | ||||
-rw-r--r-- | Python/tier2_redundancy_eliminator_cases.c.h | 35 |
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; |