mirror of
https://github.com/python/cpython.git
synced 2026-04-14 07:41:00 +00:00
gh-131798: Optimize _ITER_CHECK_RANGE and _ITER_CHECK_LIST in the JIT (GH-144583)
This commit is contained in:
parent
9d7621b75b
commit
1efd9939c8
4 changed files with 51 additions and 0 deletions
|
|
@ -3981,6 +3981,22 @@ def testfunc(n):
|
|||
self.assertIn("_POP_TOP_NOP", uops)
|
||||
self.assertLessEqual(count_ops(ex, "_POP_TOP"), 2)
|
||||
|
||||
def test_iter_check_list(self):
|
||||
def testfunc(n):
|
||||
x = 0
|
||||
for _ in range(n):
|
||||
l = [1]
|
||||
for num in l: # unguarded
|
||||
x += num
|
||||
return x
|
||||
|
||||
res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
|
||||
self.assertEqual(res, TIER2_THRESHOLD)
|
||||
uops = get_opnames(ex)
|
||||
|
||||
self.assertIn("_BUILD_LIST", uops)
|
||||
self.assertNotIn("_ITER_CHECK_LIST", uops)
|
||||
|
||||
def test_match_class(self):
|
||||
def testfunc(n):
|
||||
class A:
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
Optimize ``_ITER_CHECK_RANGE`` and ``_ITER_CHECK_LIST`` in the JIT
|
||||
|
|
@ -1091,6 +1091,24 @@ dummy_func(void) {
|
|||
sym_set_type(iter, &PyTuple_Type);
|
||||
}
|
||||
|
||||
op(_ITER_CHECK_LIST, (iter, null_or_index -- iter, null_or_index)) {
|
||||
if (sym_matches_type(iter, &PyList_Type)) {
|
||||
ADD_OP(_NOP, 0, 0);
|
||||
}
|
||||
else {
|
||||
sym_set_type(iter, &PyList_Type);
|
||||
}
|
||||
}
|
||||
|
||||
op(_ITER_CHECK_RANGE, (iter, null_or_index -- iter, null_or_index)) {
|
||||
if (sym_matches_type(iter, &PyRange_Type)) {
|
||||
ADD_OP(_NOP, 0, 0);
|
||||
}
|
||||
else {
|
||||
sym_set_type(iter, &PyRange_Type);
|
||||
}
|
||||
}
|
||||
|
||||
op(_ITER_NEXT_RANGE, (iter, null_or_index -- iter, null_or_index, next)) {
|
||||
next = sym_new_type(ctx, &PyLong_Type);
|
||||
}
|
||||
|
|
|
|||
16
Python/optimizer_cases.c.h
generated
16
Python/optimizer_cases.c.h
generated
|
|
@ -2752,6 +2752,14 @@
|
|||
/* _INSTRUMENTED_FOR_ITER is not a viable micro-op for tier 2 */
|
||||
|
||||
case _ITER_CHECK_LIST: {
|
||||
JitOptRef iter;
|
||||
iter = stack_pointer[-2];
|
||||
if (sym_matches_type(iter, &PyList_Type)) {
|
||||
ADD_OP(_NOP, 0, 0);
|
||||
}
|
||||
else {
|
||||
sym_set_type(iter, &PyList_Type);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -2800,6 +2808,14 @@
|
|||
}
|
||||
|
||||
case _ITER_CHECK_RANGE: {
|
||||
JitOptRef iter;
|
||||
iter = stack_pointer[-2];
|
||||
if (sym_matches_type(iter, &PyRange_Type)) {
|
||||
ADD_OP(_NOP, 0, 0);
|
||||
}
|
||||
else {
|
||||
sym_set_type(iter, &PyRange_Type);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue