@@ -1682,9 +1682,8 @@ define i8 @lshr_bitwidth_mask(i8 %x, i8 %y) {
1682
1682
1683
1683
define i16 @signbit_splat_mask (i8 %x , i16 %y ) {
1684
1684
; CHECK-LABEL: @signbit_splat_mask(
1685
- ; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 7
1686
- ; CHECK-NEXT: [[S:%.*]] = sext i8 [[A]] to i16
1687
- ; CHECK-NEXT: [[R:%.*]] = and i16 [[S]], [[Y:%.*]]
1685
+ ; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt i8 [[X:%.*]], 0
1686
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISNEG]], i16 [[Y:%.*]], i16 0
1688
1687
; CHECK-NEXT: ret i16 [[R]]
1689
1688
;
1690
1689
%a = ashr i8 %x , 7
@@ -1696,9 +1695,8 @@ define i16 @signbit_splat_mask(i8 %x, i16 %y) {
1696
1695
define <2 x i16 > @signbit_splat_mask_commute (<2 x i5 > %x , <2 x i16 > %p ) {
1697
1696
; CHECK-LABEL: @signbit_splat_mask_commute(
1698
1697
; CHECK-NEXT: [[Y:%.*]] = mul <2 x i16> [[P:%.*]], [[P]]
1699
- ; CHECK-NEXT: [[A:%.*]] = ashr <2 x i5> [[X:%.*]], <i5 4, i5 poison>
1700
- ; CHECK-NEXT: [[S:%.*]] = sext <2 x i5> [[A]] to <2 x i16>
1701
- ; CHECK-NEXT: [[R:%.*]] = and <2 x i16> [[Y]], [[S]]
1698
+ ; CHECK-NEXT: [[ISNEG:%.*]] = icmp slt <2 x i5> [[X:%.*]], zeroinitializer
1699
+ ; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[ISNEG]], <2 x i16> [[Y]], <2 x i16> zeroinitializer
1702
1700
; CHECK-NEXT: ret <2 x i16> [[R]]
1703
1701
;
1704
1702
%y = mul <2 x i16 > %p , %p ; thwart complexity-based canonicalization
@@ -1712,8 +1710,8 @@ define i16 @signbit_splat_mask_use1(i8 %x, i16 %y) {
1712
1710
; CHECK-LABEL: @signbit_splat_mask_use1(
1713
1711
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 7
1714
1712
; CHECK-NEXT: call void @use8(i8 [[A]])
1715
- ; CHECK-NEXT: [[S :%.*]] = sext i8 [[A]] to i16
1716
- ; CHECK-NEXT: [[R:%.*]] = and i16 [[S ]], [[Y:%.*]]
1713
+ ; CHECK-NEXT: [[ISNEG :%.*]] = icmp slt i8 [[X]], 0
1714
+ ; CHECK-NEXT: [[R:%.*]] = select i1 [[ISNEG ]], i16 [[Y:%.*]], i16 0
1717
1715
; CHECK-NEXT: ret i16 [[R]]
1718
1716
;
1719
1717
%a = ashr i8 %x , 7
@@ -1723,6 +1721,8 @@ define i16 @signbit_splat_mask_use1(i8 %x, i16 %y) {
1723
1721
ret i16 %r
1724
1722
}
1725
1723
1724
+ ; negative test - extra use
1725
+
1726
1726
define i16 @signbit_splat_mask_use2 (i8 %x , i16 %y ) {
1727
1727
; CHECK-LABEL: @signbit_splat_mask_use2(
1728
1728
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 7
@@ -1738,6 +1738,8 @@ define i16 @signbit_splat_mask_use2(i8 %x, i16 %y) {
1738
1738
ret i16 %r
1739
1739
}
1740
1740
1741
+ ; negative test - wrong extend
1742
+
1741
1743
define i16 @not_signbit_splat_mask1 (i8 %x , i16 %y ) {
1742
1744
; CHECK-LABEL: @not_signbit_splat_mask1(
1743
1745
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 7
@@ -1751,6 +1753,8 @@ define i16 @not_signbit_splat_mask1(i8 %x, i16 %y) {
1751
1753
ret i16 %r
1752
1754
}
1753
1755
1756
+ ; negative test - wrong shift amount
1757
+
1754
1758
define i16 @not_signbit_splat_mask2 (i8 %x , i16 %y ) {
1755
1759
; CHECK-LABEL: @not_signbit_splat_mask2(
1756
1760
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 6
@@ -1915,6 +1919,8 @@ define i16 @invert_signbit_splat_mask_use2(i8 %x, i16 %y) {
1915
1919
ret i16 %r
1916
1920
}
1917
1921
1922
+ ; negative test - extra use
1923
+
1918
1924
define i16 @invert_signbit_splat_mask_use3 (i8 %x , i16 %y ) {
1919
1925
; CHECK-LABEL: @invert_signbit_splat_mask_use3(
1920
1926
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 7
@@ -1932,6 +1938,8 @@ define i16 @invert_signbit_splat_mask_use3(i8 %x, i16 %y) {
1932
1938
ret i16 %r
1933
1939
}
1934
1940
1941
+ ; negative test - wrong extend
1942
+
1935
1943
define i16 @not_invert_signbit_splat_mask1 (i8 %x , i16 %y ) {
1936
1944
; CHECK-LABEL: @not_invert_signbit_splat_mask1(
1937
1945
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 7
@@ -1947,6 +1955,8 @@ define i16 @not_invert_signbit_splat_mask1(i8 %x, i16 %y) {
1947
1955
ret i16 %r
1948
1956
}
1949
1957
1958
+ ; negative test - wrong shift amount
1959
+
1950
1960
define i16 @not_invert_signbit_splat_mask2 (i8 %x , i16 %y ) {
1951
1961
; CHECK-LABEL: @not_invert_signbit_splat_mask2(
1952
1962
; CHECK-NEXT: [[A:%.*]] = ashr i8 [[X:%.*]], 6
0 commit comments