@@ -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
16241698def global_identity (x ):
16251699 return x
0 commit comments