mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
GH-130415: Narrow str to "" based on boolean tests (GH-130476)
This commit is contained in:
parent
b6769e9404
commit
691354ccb0
6 changed files with 40 additions and 2 deletions
|
@ -1531,6 +1531,39 @@ class TestUopsOptimization(unittest.TestCase):
|
||||||
# But all of the appends we care about are still there:
|
# But all of the appends we care about are still there:
|
||||||
self.assertEqual(uops.count("_CALL_LIST_APPEND"), len("ABCDEFG"))
|
self.assertEqual(uops.count("_CALL_LIST_APPEND"), len("ABCDEFG"))
|
||||||
|
|
||||||
|
def test_narrow_type_to_constant_str_empty(self):
|
||||||
|
def f(n):
|
||||||
|
trace = []
|
||||||
|
for i in range(n):
|
||||||
|
# Hopefully the optimizer can't guess what the value is.
|
||||||
|
# empty is always "", but we can only prove that it's a string:
|
||||||
|
false = i == TIER2_THRESHOLD
|
||||||
|
empty = "X"[:false]
|
||||||
|
trace.append("A")
|
||||||
|
if not empty: # Kept.
|
||||||
|
trace.append("B")
|
||||||
|
if not empty: # Removed!
|
||||||
|
trace.append("C")
|
||||||
|
trace.append("D")
|
||||||
|
if empty: # Removed!
|
||||||
|
trace.append("X")
|
||||||
|
trace.append("E")
|
||||||
|
trace.append("F")
|
||||||
|
if empty: # Removed!
|
||||||
|
trace.append("X")
|
||||||
|
trace.append("G")
|
||||||
|
return trace
|
||||||
|
|
||||||
|
trace, ex = self._run_with_optimizer(f, TIER2_THRESHOLD)
|
||||||
|
self.assertEqual(trace, list("ABCDEFG") * TIER2_THRESHOLD)
|
||||||
|
self.assertIsNotNone(ex)
|
||||||
|
uops = get_opnames(ex)
|
||||||
|
# Only one guard remains:
|
||||||
|
self.assertEqual(uops.count("_GUARD_IS_FALSE_POP"), 1)
|
||||||
|
self.assertEqual(uops.count("_GUARD_IS_TRUE_POP"), 0)
|
||||||
|
# But all of the appends we care about are still there:
|
||||||
|
self.assertEqual(uops.count("_CALL_LIST_APPEND"), len("ABCDEFG"))
|
||||||
|
|
||||||
def global_identity(x):
|
def global_identity(x):
|
||||||
return x
|
return x
|
||||||
|
|
||||||
|
|
|
@ -1065,6 +1065,7 @@ Keenan Lau
|
||||||
Piers Lauder
|
Piers Lauder
|
||||||
Ben Laurie
|
Ben Laurie
|
||||||
Yoni Lavi
|
Yoni Lavi
|
||||||
|
Amit Lavon
|
||||||
Simon Law
|
Simon Law
|
||||||
Julia Lawall
|
Julia Lawall
|
||||||
Chris Lawrence
|
Chris Lawrence
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Improve JIT's ability to optimize strings in boolean contexts.
|
|
@ -426,7 +426,7 @@ dummy_func(void) {
|
||||||
|
|
||||||
op(_TO_BOOL_STR, (value -- res)) {
|
op(_TO_BOOL_STR, (value -- res)) {
|
||||||
if (!optimize_to_bool(this_instr, ctx, value, &res)) {
|
if (!optimize_to_bool(this_instr, ctx, value, &res)) {
|
||||||
res = sym_new_type(ctx, &PyBool_Type);
|
res = sym_new_truthiness(ctx, value, true);
|
||||||
sym_set_type(value, &PyUnicode_Type);
|
sym_set_type(value, &PyUnicode_Type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
Python/optimizer_cases.c.h
generated
2
Python/optimizer_cases.c.h
generated
|
@ -213,7 +213,7 @@
|
||||||
JitOptSymbol *res;
|
JitOptSymbol *res;
|
||||||
value = stack_pointer[-1];
|
value = stack_pointer[-1];
|
||||||
if (!optimize_to_bool(this_instr, ctx, value, &res)) {
|
if (!optimize_to_bool(this_instr, ctx, value, &res)) {
|
||||||
res = sym_new_type(ctx, &PyBool_Type);
|
res = sym_new_truthiness(ctx, value, true);
|
||||||
sym_set_type(value, &PyUnicode_Type);
|
sym_set_type(value, &PyUnicode_Type);
|
||||||
}
|
}
|
||||||
stack_pointer[-1] = res;
|
stack_pointer[-1] = res;
|
||||||
|
|
|
@ -302,6 +302,9 @@ _Py_uop_sym_set_const(JitOptContext *ctx, JitOptSymbol *sym, PyObject *const_val
|
||||||
else if (type == &PyLong_Type) {
|
else if (type == &PyLong_Type) {
|
||||||
_Py_uop_sym_set_const(ctx, value, Py_GetConstant(Py_CONSTANT_ZERO));
|
_Py_uop_sym_set_const(ctx, value, Py_GetConstant(Py_CONSTANT_ZERO));
|
||||||
}
|
}
|
||||||
|
else if (type == &PyUnicode_Type) {
|
||||||
|
_Py_uop_sym_set_const(ctx, value, Py_GetConstant(Py_CONSTANT_EMPTY_STR));
|
||||||
|
}
|
||||||
// TODO: More types (GH-130415)!
|
// TODO: More types (GH-130415)!
|
||||||
make_const(sym, const_val);
|
make_const(sym, const_val);
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue