gh-142764: Restore REPLACE_OPCODE_IF_EVALUATES_PURE optimization for some ops (GH-143335)

This commit is contained in:
Ken Jin 2026-01-10 07:18:22 +08:00 committed by GitHub
parent e0fb278064
commit 95259116ec
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 1554 additions and 994 deletions

View file

@ -211,7 +211,7 @@ dummy_func(void) {
}
op(_BINARY_OP, (lhs, rhs -- res)) {
REPLACE_OPCODE_IF_EVALUATES_PURE(lhs, rhs);
REPLACE_OPCODE_IF_EVALUATES_PURE(lhs, rhs, res);
bool lhs_int = sym_matches_type(lhs, &PyLong_Type);
bool rhs_int = sym_matches_type(rhs, &PyLong_Type);
bool lhs_float = sym_matches_type(lhs, &PyFloat_Type);
@ -269,18 +269,21 @@ dummy_func(void) {
res = sym_new_compact_int(ctx);
l = left;
r = right;
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
}
op(_BINARY_OP_SUBTRACT_INT, (left, right -- res, l, r)) {
res = sym_new_compact_int(ctx);
l = left;
r = right;
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
}
op(_BINARY_OP_MULTIPLY_INT, (left, right -- res, l, r)) {
res = sym_new_compact_int(ctx);
l = left;
r = right;
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
}
op(_BINARY_OP_ADD_FLOAT, (left, right -- res, l, r)) {
@ -441,13 +444,13 @@ dummy_func(void) {
}
op(_UNARY_NOT, (value -- res)) {
REPLACE_OPCODE_IF_EVALUATES_PURE(value);
REPLACE_OPCODE_IF_EVALUATES_PURE(value, res);
sym_set_type(value, &PyBool_Type);
res = sym_new_truthiness(ctx, value, false);
}
op(_UNARY_NEGATIVE, (value -- res)) {
REPLACE_OPCODE_IF_EVALUATES_PURE(value);
REPLACE_OPCODE_IF_EVALUATES_PURE(value, res);
if (sym_is_compact_int(value)) {
res = sym_new_compact_int(ctx);
}
@ -465,7 +468,7 @@ dummy_func(void) {
op(_UNARY_INVERT, (value -- res)) {
// Required to avoid a warning due to the deprecation of bitwise inversion of bools
if (!sym_matches_type(value, &PyBool_Type)) {
REPLACE_OPCODE_IF_EVALUATES_PURE(value);
REPLACE_OPCODE_IF_EVALUATES_PURE(value, res);
}
if (sym_matches_type(value, &PyLong_Type)) {
res = sym_new_type(ctx, &PyLong_Type);
@ -478,7 +481,7 @@ dummy_func(void) {
op(_COMPARE_OP, (left, right -- res)) {
// Comparison between bytes and str or int is not impacted by this optimization as bytes
// is not a safe type (due to its ability to raise a warning during comparisons).
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right);
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
if (oparg & 16) {
res = sym_new_type(ctx, &PyBool_Type);
}
@ -491,18 +494,21 @@ dummy_func(void) {
res = sym_new_type(ctx, &PyBool_Type);
l = left;
r = right;
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
}
op(_COMPARE_OP_FLOAT, (left, right -- res, l, r)) {
res = sym_new_type(ctx, &PyBool_Type);
l = left;
r = right;
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
}
op(_COMPARE_OP_STR, (left, right -- res, l, r)) {
res = sym_new_type(ctx, &PyBool_Type);
l = left;
r = right;
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, res);
}
op(_IS_OP, (left, right -- b, l, r)) {
@ -512,7 +518,7 @@ dummy_func(void) {
}
op(_CONTAINS_OP, (left, right -- b)) {
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right);
REPLACE_OPCODE_IF_EVALUATES_PURE(left, right, b);
b = sym_new_type(ctx, &PyBool_Type);
}