@@ -1829,3 +1829,75 @@ define i8 @shl_mask_demand(i8 %x) {
1829
1829
%r = and i8 %s , 7 ; 0b00000111
1830
1830
ret i8 %r
1831
1831
}
1832
+
1833
+ define i64 @lshr_mul_negpow2 (i64 %x ) {
1834
+ ; CHECK-LABEL: @lshr_mul_negpow2(
1835
+ ; CHECK-NEXT: [[A:%.*]] = mul i64 [[X:%.*]], -4294967296
1836
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact i64 [[A]], 32
1837
+ ; CHECK-NEXT: ret i64 [[B]]
1838
+ ;
1839
+ %a = mul i64 %x , -4294967296
1840
+ %b = lshr i64 %a , 32
1841
+ ret i64 %b
1842
+ }
1843
+
1844
+ define i64 @lshr_mul_negpow2_2 (i64 %x ) {
1845
+ ; CHECK-LABEL: @lshr_mul_negpow2_2(
1846
+ ; CHECK-NEXT: [[A:%.*]] = mul i64 [[X:%.*]], -65536
1847
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact i64 [[A]], 16
1848
+ ; CHECK-NEXT: ret i64 [[B]]
1849
+ ;
1850
+ %a = mul i64 %x , -65536
1851
+ %b = lshr i64 %a , 16
1852
+ ret i64 %b
1853
+ }
1854
+
1855
+ define <2 x i32 > @lshr_mul_negpow2_3 (<2 x i32 > %x ) {
1856
+ ; CHECK-LABEL: @lshr_mul_negpow2_3(
1857
+ ; CHECK-NEXT: [[A:%.*]] = mul <2 x i32> [[X:%.*]], <i32 -16777216, i32 -16777216>
1858
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact <2 x i32> [[A]], <i32 24, i32 24>
1859
+ ; CHECK-NEXT: ret <2 x i32> [[B]]
1860
+ ;
1861
+ %a = mul <2 x i32 > %x , <i32 -16777216 , i32 -16777216 >
1862
+ %b = lshr <2 x i32 > %a , <i32 24 , i32 24 >
1863
+ ret <2 x i32 > %b
1864
+ }
1865
+
1866
+ define i32 @lshr_mul_negpow2_4 (i32 %x ) {
1867
+ ; CHECK-LABEL: @lshr_mul_negpow2_4(
1868
+ ; CHECK-NEXT: [[A:%.*]] = mul i32 [[X:%.*]], -65536
1869
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact i32 [[A]], 16
1870
+ ; CHECK-NEXT: [[C:%.*]] = xor i32 [[B]], 1
1871
+ ; CHECK-NEXT: ret i32 [[C]]
1872
+ ;
1873
+ %a = mul i32 %x , -65536
1874
+ %b = xor i32 %a , 65536
1875
+ %c = lshr i32 %b , 16
1876
+ ret i32 %c
1877
+ }
1878
+
1879
+ define <2 x i32 > @lshr_mul_negpow2_5 (<2 x i32 > %x ) {
1880
+ ; CHECK-LABEL: @lshr_mul_negpow2_5(
1881
+ ; CHECK-NEXT: [[A:%.*]] = mul <2 x i32> [[X:%.*]], <i32 -65536, i32 -65536>
1882
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact <2 x i32> [[A]], <i32 16, i32 16>
1883
+ ; CHECK-NEXT: [[C:%.*]] = or <2 x i32> [[B]], <i32 8, i32 8>
1884
+ ; CHECK-NEXT: ret <2 x i32> [[C]]
1885
+ ;
1886
+ %a = mul <2 x i32 > %x , <i32 -65536 , i32 -65536 >
1887
+ %b = or <2 x i32 > %a , <i32 524288 , i32 524288 >
1888
+ %c = lshr <2 x i32 > %b , <i32 16 , i32 16 >
1889
+ ret <2 x i32 > %c
1890
+ }
1891
+
1892
+ define i64 @lshr_mul_negpow2_extra_use (i64 %x ) {
1893
+ ; CHECK-LABEL: @lshr_mul_negpow2_extra_use(
1894
+ ; CHECK-NEXT: [[A:%.*]] = mul i64 [[X:%.*]], -4294967296
1895
+ ; CHECK-NEXT: [[B:%.*]] = lshr exact i64 [[A]], 32
1896
+ ; CHECK-NEXT: call void @use(i64 [[A]])
1897
+ ; CHECK-NEXT: ret i64 [[B]]
1898
+ ;
1899
+ %a = mul i64 %x , -4294967296
1900
+ %b = lshr i64 %a , 32
1901
+ call void @use (i64 %a )
1902
+ ret i64 %b
1903
+ }
0 commit comments