Skip to content

Commit 0efca44

Browse files
committed
Add regression tests
1 parent a471ee3 commit 0efca44

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed

Lib/test/test_capi/test_opt.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1620,6 +1620,80 @@ def f(n):
16201620
self.assertIn("_TO_BOOL_STR", uops)
16211621
self.assertNotIn("_GUARD_TOS_UNICODE", uops)
16221622

1623+
def test_remove_guard_for_known_type_dict(self):
1624+
def f(n):
1625+
x = 0
1626+
for _ in range(n):
1627+
d = {}
1628+
d["Spam"] = 1 # Guarded...
1629+
x += d["Spam"] # ...unguarded!
1630+
return x
1631+
1632+
res, ex = self._run_with_optimizer(f, TIER2_THRESHOLD)
1633+
self.assertEqual(res, TIER2_THRESHOLD)
1634+
self.assertIsNotNone(ex)
1635+
uops = get_opnames(ex)
1636+
self.assertEqual(uops.count("_GUARD_NOS_DICT"), 1)
1637+
self.assertEqual(uops.count("_STORE_SUBSCR_DICT"), 1)
1638+
self.assertEqual(uops.count("_BINARY_OP_SUBSCR_DICT"), 1)
1639+
1640+
def test_remove_guard_for_known_type_list(self):
1641+
def f(n):
1642+
x = 0
1643+
for _ in range(n):
1644+
l = [0]
1645+
l[0] = 1 # Guarded...
1646+
[a] = l # ...unguarded!
1647+
b = l[0] # ...unguarded!
1648+
if l: # ...unguarded!
1649+
x += a + b
1650+
return x
1651+
1652+
res, ex = self._run_with_optimizer(f, TIER2_THRESHOLD)
1653+
self.assertEqual(res, 2 * TIER2_THRESHOLD)
1654+
self.assertIsNotNone(ex)
1655+
uops = get_opnames(ex)
1656+
self.assertEqual(uops.count("_GUARD_NOS_LIST"), 1)
1657+
self.assertEqual(uops.count("_STORE_SUBSCR_LIST_INT"), 1)
1658+
self.assertEqual(uops.count("_GUARD_TOS_LIST"), 0)
1659+
self.assertEqual(uops.count("_UNPACK_SEQUENCE_LIST"), 1)
1660+
self.assertEqual(uops.count("_BINARY_OP_SUBSCR_LIST_INT"), 1)
1661+
self.assertEqual(uops.count("_TO_BOOL_LIST"), 1)
1662+
1663+
def test_remove_guard_for_known_type_set(self):
1664+
def f(n):
1665+
x = 0
1666+
for _ in range(n):
1667+
x += "Spam" in {"Spam"} # Unguarded!
1668+
return x
1669+
1670+
res, ex = self._run_with_optimizer(f, TIER2_THRESHOLD)
1671+
self.assertEqual(res, TIER2_THRESHOLD)
1672+
self.assertIsNotNone(ex)
1673+
uops = get_opnames(ex)
1674+
self.assertNotIn("_GUARD_TOS_ANY_SET", uops)
1675+
self.assertIn("_CONTAINS_OP_SET", uops)
1676+
1677+
def test_remove_guard_for_known_type_tuple(self):
1678+
def f(n):
1679+
x = 0
1680+
for _ in range(n):
1681+
t = (1, 2, (3, (4,)))
1682+
t_0, t_1, (t_2_0, t_2_1) = t # Unguarded!
1683+
t_2_1_0 = t_2_1[0] # Unguarded!
1684+
x += t_0 + t_1 + t_2_0 + t_2_1_0
1685+
return x
1686+
1687+
res, ex = self._run_with_optimizer(f, TIER2_THRESHOLD)
1688+
self.assertEqual(res, 10 * TIER2_THRESHOLD)
1689+
self.assertIsNotNone(ex)
1690+
uops = get_opnames(ex)
1691+
self.assertNotIn("_GUARD_TOS_TUPLE", uops)
1692+
self.assertIn("_UNPACK_SEQUENCE_TUPLE", uops)
1693+
self.assertIn("_UNPACK_SEQUENCE_TWO_TUPLE", uops)
1694+
self.assertNotIn("_GUARD_NOS_TUPLE", uops)
1695+
self.assertIn("_BINARY_OP_SUBSCR_TUPLE_INT", uops)
1696+
16231697

16241698
def global_identity(x):
16251699
return x

0 commit comments

Comments
 (0)