diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py index 59266b000ed4df..f0a106d184ad64 100644 --- a/Lib/test/test_capi/test_opt.py +++ b/Lib/test/test_capi/test_opt.py @@ -438,7 +438,25 @@ def testfunc(n): self.assertNotIn("_GET_ITER", uops) self.assertNotIn("_GET_ITER_VIRTUAL", uops) self.assertNotIn("_GET_ITER_SELF", uops) + self.assertNotIn("_GUARD_NOS_NULL", uops) + + def test_get_iter_trad_for_iter_tier_two(self): + d = {v: v for v in range(20)} + def testfunc(n): + total = 0 + while n: + n -= 1 + for _ in d: + total += 1 + return total + + self.assertEqual(testfunc(TIER2_THRESHOLD), TIER2_THRESHOLD * len(d)) + ex = get_first_executor(testfunc) + self.assertIsNotNone(ex) + uops = get_opnames(ex) + self.assertIn("_FOR_ITER_TIER_TWO", uops) + self.assertNotIn("_GET_ITER_TRAD", uops) def test_for_iter_range(self): def testfunc(n): diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index daebef4a04320b..22b6023c74dba3 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -1443,6 +1443,12 @@ dummy_func(void) { } } + op(_GET_ITER_TRAD, (iterable -- iter, index_or_null)) { + (void)iterable; + iter = sym_new_not_null(ctx); + index_or_null = sym_new_null(ctx); + } + op(_GUARD_ITERATOR, (iterable -- iterable)) { bool definite = true; PyTypeObject *tp = sym_get_type(iterable); diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index c3c889e9de9a7e..28291a10d9516c 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -3612,10 +3612,13 @@ } case _GET_ITER_TRAD: { + JitOptRef iterable; JitOptRef iter; JitOptRef index_or_null; + iterable = stack_pointer[-1]; + (void)iterable; iter = sym_new_not_null(ctx); - index_or_null = sym_new_not_null(ctx); + index_or_null = sym_new_null(ctx); CHECK_STACK_BOUNDS(1); stack_pointer[-1] = iter; stack_pointer[0] = index_or_null;