@@ -1743,3 +1743,151 @@ define i1 @masked_icmps_mask_notallzeros_bmask_mixed_negated_swapped_7b_logical(
1743
1743
%t5 = select i1 %t4 , i1 true , i1 %t2
1744
1744
ret i1 %t5
1745
1745
}
1746
+
1747
+
1748
+ define i1 @masked_icmps_bmask_notmixed_or (i32 %A ) {
1749
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_or(
1750
+ ; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15
1751
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp eq i32 [[MASK1]], 3
1752
+ ; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255
1753
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp eq i32 [[MASK2]], 243
1754
+ ; CHECK-NEXT: [[RES:%.*]] = or i1 [[TST1]], [[TST2]]
1755
+ ; CHECK-NEXT: ret i1 [[RES]]
1756
+ ;
1757
+ %mask1 = and i32 %A , 15 ; 0x0f
1758
+ %tst1 = icmp eq i32 %mask1 , 3 ; 0x03
1759
+ %mask2 = and i32 %A , 255 ; 0xff
1760
+ %tst2 = icmp eq i32 %mask2 , 243 ; 0xf3
1761
+ %res = or i1 %tst1 , %tst2
1762
+ ret i1 %res
1763
+ }
1764
+
1765
+ define <2 x i1 > @masked_icmps_bmask_notmixed_or_vec (<2 x i8 > %A ) {
1766
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_vec(
1767
+ ; CHECK-NEXT: [[MASK1:%.*]] = and <2 x i8> [[A:%.*]], <i8 15, i8 15>
1768
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp eq <2 x i8> [[MASK1]], <i8 3, i8 3>
1769
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp eq <2 x i8> [[A]], <i8 -13, i8 -13>
1770
+ ; CHECK-NEXT: [[RES:%.*]] = or <2 x i1> [[TST1]], [[TST2]]
1771
+ ; CHECK-NEXT: ret <2 x i1> [[RES]]
1772
+ ;
1773
+ %mask1 = and <2 x i8 > %A , <i8 15 , i8 15 > ; 0x0f
1774
+ %tst1 = icmp eq <2 x i8 > %mask1 , <i8 3 , i8 3 > ; 0x03
1775
+ %mask2 = and <2 x i8 > %A , <i8 255 , i8 255 > ; 0xff
1776
+ %tst2 = icmp eq <2 x i8 > %mask2 , <i8 243 , i8 243 > ; 0xf3
1777
+ %res = or <2 x i1 > %tst1 , %tst2
1778
+ ret <2 x i1 > %res
1779
+ }
1780
+
1781
+ define <2 x i1 > @masked_icmps_bmask_notmixed_or_vec_poison1 (<2 x i8 > %A ) {
1782
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_vec_poison1(
1783
+ ; CHECK-NEXT: [[MASK1:%.*]] = and <2 x i8> [[A:%.*]], <i8 15, i8 15>
1784
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp eq <2 x i8> [[MASK1]], <i8 3, i8 poison>
1785
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp eq <2 x i8> [[A]], <i8 -13, i8 -13>
1786
+ ; CHECK-NEXT: [[RES:%.*]] = or <2 x i1> [[TST1]], [[TST2]]
1787
+ ; CHECK-NEXT: ret <2 x i1> [[RES]]
1788
+ ;
1789
+ %mask1 = and <2 x i8 > %A , <i8 15 , i8 15 > ; 0x0f
1790
+ %tst1 = icmp eq <2 x i8 > %mask1 , <i8 3 , i8 poison> ; 0x03
1791
+ %mask2 = and <2 x i8 > %A , <i8 255 , i8 255 > ; 0xff
1792
+ %tst2 = icmp eq <2 x i8 > %mask2 , <i8 243 , i8 243 > ; 0xf3
1793
+ %res = or <2 x i1 > %tst1 , %tst2
1794
+ ret <2 x i1 > %res
1795
+ }
1796
+
1797
+ define <2 x i1 > @masked_icmps_bmask_notmixed_or_vec_poison2 (<2 x i8 > %A ) {
1798
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_vec_poison2(
1799
+ ; CHECK-NEXT: [[MASK1:%.*]] = and <2 x i8> [[A:%.*]], <i8 15, i8 15>
1800
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp eq <2 x i8> [[MASK1]], <i8 3, i8 3>
1801
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp eq <2 x i8> [[A]], <i8 -13, i8 poison>
1802
+ ; CHECK-NEXT: [[RES:%.*]] = or <2 x i1> [[TST1]], [[TST2]]
1803
+ ; CHECK-NEXT: ret <2 x i1> [[RES]]
1804
+ ;
1805
+ %mask1 = and <2 x i8 > %A , <i8 15 , i8 15 > ; 0x0f
1806
+ %tst1 = icmp eq <2 x i8 > %mask1 , <i8 3 , i8 3 > ; 0x03
1807
+ %mask2 = and <2 x i8 > %A , <i8 255 , i8 255 > ; 0xff
1808
+ %tst2 = icmp eq <2 x i8 > %mask2 , <i8 243 , i8 poison> ; 0xf3
1809
+ %res = or <2 x i1 > %tst1 , %tst2
1810
+ ret <2 x i1 > %res
1811
+ }
1812
+
1813
+ define i1 @masked_icmps_bmask_notmixed_or_contradict_notoptimized (i32 %A ) {
1814
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_or_contradict_notoptimized(
1815
+ ; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15
1816
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp eq i32 [[MASK1]], 3
1817
+ ; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255
1818
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp eq i32 [[MASK2]], 242
1819
+ ; CHECK-NEXT: [[RES:%.*]] = or i1 [[TST1]], [[TST2]]
1820
+ ; CHECK-NEXT: ret i1 [[RES]]
1821
+ ;
1822
+ %mask1 = and i32 %A , 15 ; 0x0f
1823
+ %tst1 = icmp eq i32 %mask1 , 3 ; 0x03
1824
+ %mask2 = and i32 %A , 255 ; 0xff
1825
+ %tst2 = icmp eq i32 %mask2 , 242 ; 0xf2
1826
+ %res = or i1 %tst1 , %tst2
1827
+ ret i1 %res
1828
+ }
1829
+
1830
+ define i1 @masked_icmps_bmask_notmixed_and (i32 %A ) {
1831
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_and(
1832
+ ; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15
1833
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp ne i32 [[MASK1]], 3
1834
+ ; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255
1835
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 243
1836
+ ; CHECK-NEXT: [[RES:%.*]] = and i1 [[TST1]], [[TST2]]
1837
+ ; CHECK-NEXT: ret i1 [[RES]]
1838
+ ;
1839
+ %mask1 = and i32 %A , 15 ; 0x0f
1840
+ %tst1 = icmp ne i32 %mask1 , 3 ; 0x03
1841
+ %mask2 = and i32 %A , 255 ; 0xff
1842
+ %tst2 = icmp ne i32 %mask2 , 243 ; 0xf3
1843
+ %res = and i1 %tst1 , %tst2
1844
+ ret i1 %res
1845
+ }
1846
+
1847
+ define i1 @masked_icmps_bmask_notmixed_and_contradict_notoptimized (i32 %A ) {
1848
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_and_contradict_notoptimized(
1849
+ ; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 15
1850
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp ne i32 [[MASK1]], 3
1851
+ ; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 255
1852
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 242
1853
+ ; CHECK-NEXT: [[RES:%.*]] = and i1 [[TST1]], [[TST2]]
1854
+ ; CHECK-NEXT: ret i1 [[RES]]
1855
+ ;
1856
+ %mask1 = and i32 %A , 15 ; 0x0f
1857
+ %tst1 = icmp ne i32 %mask1 , 3 ; 0x03
1858
+ %mask2 = and i32 %A , 255 ; 0xff
1859
+ %tst2 = icmp ne i32 %mask2 , 242 ; 0xf2
1860
+ %res = and i1 %tst1 , %tst2
1861
+ ret i1 %res
1862
+ }
1863
+
1864
+ define i1 @masked_icmps_bmask_notmixed_and_expected_false (i32 %A ) {
1865
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_and_expected_false(
1866
+ ; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A:%.*]], 255
1867
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 242
1868
+ ; CHECK-NEXT: ret i1 [[TST2]]
1869
+ ;
1870
+ %mask1 = and i32 %A , 3 ; 0x0f
1871
+ %tst1 = icmp ne i32 %mask1 , 15 ; 0x03
1872
+ %mask2 = and i32 %A , 255 ; 0xff
1873
+ %tst2 = icmp ne i32 %mask2 , 242 ; 0xf2
1874
+ %res = and i1 %tst1 , %tst2
1875
+ ret i1 %res
1876
+ }
1877
+
1878
+ define i1 @masked_icmps_bmask_notmixed_not_subset_notoptimized (i32 %A ) {
1879
+ ; CHECK-LABEL: @masked_icmps_bmask_notmixed_not_subset_notoptimized(
1880
+ ; CHECK-NEXT: [[MASK1:%.*]] = and i32 [[A:%.*]], 254
1881
+ ; CHECK-NEXT: [[TST1:%.*]] = icmp ne i32 [[MASK1]], 252
1882
+ ; CHECK-NEXT: [[MASK2:%.*]] = and i32 [[A]], 253
1883
+ ; CHECK-NEXT: [[TST2:%.*]] = icmp ne i32 [[MASK2]], 252
1884
+ ; CHECK-NEXT: [[RES:%.*]] = and i1 [[TST1]], [[TST2]]
1885
+ ; CHECK-NEXT: ret i1 [[RES]]
1886
+ ;
1887
+ %mask1 = and i32 %A , 254 ; 0xfe
1888
+ %tst1 = icmp ne i32 %mask1 , 252 ; 0xfc
1889
+ %mask2 = and i32 %A , 253 ; 0xfd
1890
+ %tst2 = icmp ne i32 %mask2 , 252 ; 0xfc
1891
+ %res = and i1 %tst1 , %tst2
1892
+ ret i1 %res
1893
+ }
0 commit comments