@@ -1637,31 +1637,57 @@ def test_optimize_literal_set_contains(self):
1637
1637
]
1638
1638
self .cfg_optimization_test (same , same , consts = [None ], expected_consts = [None ])
1639
1639
1640
- def test_optimize_unary_not_to_bool (self ):
1640
+ def test_optimize_unary_not (self ):
1641
+ # test folding
1642
+ before = [
1643
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1644
+ ('UNARY_NOT' , None , 0 ),
1645
+ ('RETURN_VALUE' , None , 0 ),
1646
+ ]
1647
+ after = [
1648
+ ('LOAD_CONST' , 0 , 0 ),
1649
+ ('RETURN_VALUE' , None , 0 ),
1650
+ ]
1651
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [False ])
1652
+
1653
+ # test cancel out
1654
+ before = [
1655
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1656
+ ('UNARY_NOT' , None , 0 ),
1657
+ ('UNARY_NOT' , None , 0 ),
1658
+ ('UNARY_NOT' , None , 0 ),
1659
+ ('UNARY_NOT' , None , 0 ),
1660
+ ('RETURN_VALUE' , None , 0 ),
1661
+ ]
1662
+ after = [
1663
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1664
+ ('RETURN_VALUE' , None , 0 ),
1665
+ ]
1666
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1667
+
1668
+ # test eliminate to bool
1641
1669
before = [
1642
1670
('LOAD_NAME' , 0 , 0 ),
1643
1671
('UNARY_NOT' , None , 0 ),
1644
1672
('TO_BOOL' , None , 0 ),
1645
1673
('TO_BOOL' , None , 0 ),
1646
1674
('TO_BOOL' , None , 0 ),
1647
- ('LOAD_CONST' , 0 , 0 ),
1648
1675
('RETURN_VALUE' , None , 0 ),
1649
1676
]
1650
1677
after = [
1651
1678
('LOAD_NAME' , 0 , 0 ),
1652
1679
('UNARY_NOT' , None , 0 ),
1653
- ('LOAD_CONST' , 0 , 0 ),
1654
1680
('RETURN_VALUE' , None , 0 ),
1655
1681
]
1656
- self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1682
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1657
1683
1684
+ # test folding & elimitnate to bool
1658
1685
before = [
1659
1686
('LOAD_SMALL_INT' , 1 , 0 ),
1660
1687
('UNARY_NOT' , None , 0 ),
1661
1688
('TO_BOOL' , None , 0 ),
1662
1689
('TO_BOOL' , None , 0 ),
1663
1690
('TO_BOOL' , None , 0 ),
1664
- ('TO_BOOL' , None , 0 ),
1665
1691
('RETURN_VALUE' , None , 0 ),
1666
1692
]
1667
1693
after = [
@@ -1670,8 +1696,43 @@ def test_optimize_unary_not_to_bool(self):
1670
1696
]
1671
1697
self .cfg_optimization_test (before , after , consts = [], expected_consts = [False ])
1672
1698
1673
- is_ = 0
1674
- isnot = 1
1699
+ # test cancel out & eliminate to bool (to bool stays)
1700
+ before = [
1701
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1702
+ ('UNARY_NOT' , None , 0 ),
1703
+ ('UNARY_NOT' , None , 0 ),
1704
+ ('UNARY_NOT' , None , 0 ),
1705
+ ('UNARY_NOT' , None , 0 ),
1706
+ ('TO_BOOL' , None , 0 ),
1707
+ ('RETURN_VALUE' , None , 0 ),
1708
+ ]
1709
+ after = [
1710
+ ('LOAD_SMALL_INT' , 1 , 0 ),
1711
+ ('TO_BOOL' , None , 0 ),
1712
+ ('RETURN_VALUE' , None , 0 ),
1713
+ ]
1714
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1715
+
1716
+ is_ = in_ = 0
1717
+ isnot = notin = 1
1718
+
1719
+ # test is/isnot
1720
+ before = [
1721
+ ('LOAD_NAME' , 0 , 0 ),
1722
+ ('LOAD_NAME' , 1 , 0 ),
1723
+ ('IS_OP' , is_ , 0 ),
1724
+ ('UNARY_NOT' , None , 0 ),
1725
+ ('RETURN_VALUE' , None , 0 ),
1726
+ ]
1727
+ after = [
1728
+ ('LOAD_NAME' , 0 , 0 ),
1729
+ ('LOAD_NAME' , 1 , 0 ),
1730
+ ('IS_OP' , isnot , 0 ),
1731
+ ('RETURN_VALUE' , None , 0 ),
1732
+ ]
1733
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1734
+
1735
+ # test is/isnot eliminate to bool
1675
1736
before = [
1676
1737
('LOAD_NAME' , 0 , 0 ),
1677
1738
('LOAD_NAME' , 1 , 0 ),
@@ -1680,20 +1741,85 @@ def test_optimize_unary_not_to_bool(self):
1680
1741
('TO_BOOL' , None , 0 ),
1681
1742
('TO_BOOL' , None , 0 ),
1682
1743
('TO_BOOL' , None , 0 ),
1683
- ('LOAD_CONST' , 0 , 0 ),
1684
1744
('RETURN_VALUE' , None , 0 ),
1685
1745
]
1686
1746
after = [
1687
1747
('LOAD_NAME' , 0 , 0 ),
1688
1748
('LOAD_NAME' , 1 , 0 ),
1689
1749
('IS_OP' , isnot , 0 ),
1690
- ('LOAD_CONST' , 0 , 0 ),
1691
1750
('RETURN_VALUE' , None , 0 ),
1692
1751
]
1693
- self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1752
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1694
1753
1695
- in_ = 0
1696
- notin = 1
1754
+ # test in/notin
1755
+ before = [
1756
+ ('LOAD_NAME' , 0 , 0 ),
1757
+ ('LOAD_NAME' , 1 , 0 ),
1758
+ ('CONTAINS_OP' , in_ , 0 ),
1759
+ ('UNARY_NOT' , None , 0 ),
1760
+ ('RETURN_VALUE' , None , 0 ),
1761
+ ]
1762
+ after = [
1763
+ ('LOAD_NAME' , 0 , 0 ),
1764
+ ('LOAD_NAME' , 1 , 0 ),
1765
+ ('CONTAINS_OP' , notin , 0 ),
1766
+ ('RETURN_VALUE' , None , 0 ),
1767
+ ]
1768
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1769
+
1770
+ # test in/notin cancel out
1771
+ before = [
1772
+ ('LOAD_NAME' , 0 , 0 ),
1773
+ ('LOAD_NAME' , 1 , 0 ),
1774
+ ('CONTAINS_OP' , in_ , 0 ),
1775
+ ('UNARY_NOT' , None , 0 ),
1776
+ ('UNARY_NOT' , None , 0 ),
1777
+ ('RETURN_VALUE' , None , 0 ),
1778
+ ]
1779
+ after = [
1780
+ ('LOAD_NAME' , 0 , 0 ),
1781
+ ('LOAD_NAME' , 1 , 0 ),
1782
+ ('CONTAINS_OP' , in_ , 0 ),
1783
+ ('RETURN_VALUE' , None , 0 ),
1784
+ ]
1785
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1786
+
1787
+ # test in/notin
1788
+ before = [
1789
+ ('LOAD_NAME' , 0 , 0 ),
1790
+ ('LOAD_NAME' , 1 , 0 ),
1791
+ ('CONTAINS_OP' , in_ , 0 ),
1792
+ ('UNARY_NOT' , None , 0 ),
1793
+ ('RETURN_VALUE' , None , 0 ),
1794
+ ]
1795
+ after = [
1796
+ ('LOAD_NAME' , 0 , 0 ),
1797
+ ('LOAD_NAME' , 1 , 0 ),
1798
+ ('CONTAINS_OP' , notin , 0 ),
1799
+ ('RETURN_VALUE' , None , 0 ),
1800
+ ]
1801
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1802
+
1803
+ # test in/notin cancel out eliminate to bool (to bool stays) (maybe optimize later ???)
1804
+ before = [
1805
+ ('LOAD_NAME' , 0 , 0 ),
1806
+ ('LOAD_NAME' , 1 , 0 ),
1807
+ ('CONTAINS_OP' , in_ , 0 ),
1808
+ ('UNARY_NOT' , None , 0 ),
1809
+ ('UNARY_NOT' , None , 0 ),
1810
+ ('TO_BOOL' , None , 0 ),
1811
+ ('RETURN_VALUE' , None , 0 ),
1812
+ ]
1813
+ after = [
1814
+ ('LOAD_NAME' , 0 , 0 ),
1815
+ ('LOAD_NAME' , 1 , 0 ),
1816
+ ('CONTAINS_OP' , in_ , 0 ),
1817
+ ('TO_BOOL' , None , 0 ),
1818
+ ('RETURN_VALUE' , None , 0 ),
1819
+ ]
1820
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1821
+
1822
+ # test in/notin eliminate to bool
1697
1823
before = [
1698
1824
('LOAD_NAME' , 0 , 0 ),
1699
1825
('LOAD_NAME' , 1 , 0 ),
@@ -1702,17 +1828,34 @@ def test_optimize_unary_not_to_bool(self):
1702
1828
('TO_BOOL' , None , 0 ),
1703
1829
('TO_BOOL' , None , 0 ),
1704
1830
('TO_BOOL' , None , 0 ),
1705
- ('LOAD_CONST' , 0 , 0 ),
1706
1831
('RETURN_VALUE' , None , 0 ),
1707
1832
]
1708
1833
after = [
1709
1834
('LOAD_NAME' , 0 , 0 ),
1710
1835
('LOAD_NAME' , 1 , 0 ),
1711
1836
('CONTAINS_OP' , notin , 0 ),
1712
- ('LOAD_CONST' , 0 , 0 ),
1713
1837
('RETURN_VALUE' , None , 0 ),
1714
1838
]
1715
- self .cfg_optimization_test (before , after , consts = [None ], expected_consts = [None ])
1839
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1840
+
1841
+ # test in/notin cancel out eliminate to bool (to bool stays) (maybe optimize later ???)
1842
+ before = [
1843
+ ('LOAD_NAME' , 0 , 0 ),
1844
+ ('LOAD_NAME' , 1 , 0 ),
1845
+ ('CONTAINS_OP' , in_ , 0 ),
1846
+ ('UNARY_NOT' , None , 0 ),
1847
+ ('UNARY_NOT' , None , 0 ),
1848
+ ('TO_BOOL' , None , 0 ),
1849
+ ('RETURN_VALUE' , None , 0 ),
1850
+ ]
1851
+ after = [
1852
+ ('LOAD_NAME' , 0 , 0 ),
1853
+ ('LOAD_NAME' , 1 , 0 ),
1854
+ ('CONTAINS_OP' , in_ , 0 ),
1855
+ ('TO_BOOL' , None , 0 ),
1856
+ ('RETURN_VALUE' , None , 0 ),
1857
+ ]
1858
+ self .cfg_optimization_test (before , after , consts = [], expected_consts = [])
1716
1859
1717
1860
def test_optimize_if_const_unaryop (self ):
1718
1861
pass
0 commit comments