mirror of
https://github.com/python/cpython.git
synced 2026-04-15 08:11:10 +00:00
gh-148083: Prevent constant folding when lhs is container types (gh-148090)
This commit is contained in:
parent
c398490fbf
commit
853dafe23a
5 changed files with 24 additions and 4 deletions
|
|
@ -252,6 +252,7 @@ add_op(JitOptContext *ctx, _PyUOpInstruction *this_instr,
|
|||
#define sym_is_not_null _Py_uop_sym_is_not_null
|
||||
#define sym_is_const _Py_uop_sym_is_const
|
||||
#define sym_is_safe_const _Py_uop_sym_is_safe_const
|
||||
#define sym_is_not_container _Py_uop_sym_is_not_container
|
||||
#define sym_get_const _Py_uop_sym_get_const
|
||||
#define sym_new_const_steal _Py_uop_sym_new_const_steal
|
||||
#define sym_get_const_as_stackref _Py_uop_sym_get_const_as_stackref
|
||||
|
|
|
|||
|
|
@ -515,7 +515,8 @@ dummy_func(void) {
|
|||
res = sym_new_not_null(ctx);
|
||||
ds = dict_st;
|
||||
ss = sub_st;
|
||||
if (sym_matches_type(dict_st, &PyFrozenDict_Type)) {
|
||||
if (sym_is_not_container(sub_st) &&
|
||||
sym_matches_type(dict_st, &PyFrozenDict_Type)) {
|
||||
REPLACE_OPCODE_IF_EVALUATES_PURE(dict_st, sub_st, res);
|
||||
}
|
||||
}
|
||||
|
|
@ -706,7 +707,8 @@ dummy_func(void) {
|
|||
b = sym_new_type(ctx, &PyBool_Type);
|
||||
l = left;
|
||||
r = right;
|
||||
if (sym_matches_type(right, &PyFrozenSet_Type)) {
|
||||
if (sym_is_not_container(left) &&
|
||||
sym_matches_type(right, &PyFrozenSet_Type)) {
|
||||
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, b);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
6
Python/optimizer_cases.c.h
generated
6
Python/optimizer_cases.c.h
generated
|
|
@ -1462,7 +1462,8 @@
|
|||
res = sym_new_not_null(ctx);
|
||||
ds = dict_st;
|
||||
ss = sub_st;
|
||||
if (sym_matches_type(dict_st, &PyFrozenDict_Type)) {
|
||||
if (sym_is_not_container(sub_st) &&
|
||||
sym_matches_type(dict_st, &PyFrozenDict_Type)) {
|
||||
if (
|
||||
sym_is_safe_const(ctx, dict_st) &&
|
||||
sym_is_safe_const(ctx, sub_st)
|
||||
|
|
@ -2993,7 +2994,8 @@
|
|||
b = sym_new_type(ctx, &PyBool_Type);
|
||||
l = left;
|
||||
r = right;
|
||||
if (sym_matches_type(right, &PyFrozenSet_Type)) {
|
||||
if (sym_is_not_container(left) &&
|
||||
sym_matches_type(right, &PyFrozenSet_Type)) {
|
||||
if (
|
||||
sym_is_safe_const(ctx, left) &&
|
||||
sym_is_safe_const(ctx, right)
|
||||
|
|
|
|||
|
|
@ -287,6 +287,20 @@ _Py_uop_sym_is_safe_const(JitOptContext *ctx, JitOptRef sym)
|
|||
(typ == &PyFrozenSet_Type);
|
||||
}
|
||||
|
||||
bool
|
||||
_Py_uop_sym_is_not_container(JitOptRef sym)
|
||||
{
|
||||
PyTypeObject *typ = _Py_uop_sym_get_type(sym);
|
||||
if (typ == NULL) {
|
||||
return false;
|
||||
}
|
||||
return (typ == &PyLong_Type) ||
|
||||
(typ == &PyFloat_Type) ||
|
||||
(typ == &PyUnicode_Type) ||
|
||||
(typ == &_PyNone_Type) ||
|
||||
(typ == &PyBool_Type);
|
||||
}
|
||||
|
||||
void
|
||||
_Py_uop_sym_set_type(JitOptContext *ctx, JitOptRef ref, PyTypeObject *typ)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue