@@ -403,6 +403,7 @@ define <4 x i32> @shuffle_17and(<4 x i32> %v1, <4 x i32> %v2) {
403
403
}
404
404
405
405
declare void @use (<2 x float >)
406
+ declare void @use4 (<4 x float >)
406
407
407
408
; One extra use is ok to transform.
408
409
@@ -749,8 +750,8 @@ define <8 x i8> @pr19730(<16 x i8> %in0) {
749
750
750
751
define i32 @pr19737 (<4 x i32 > %in0 ) {
751
752
; CHECK-LABEL: @pr19737(
752
- ; CHECK-NEXT: [[RV :%.*]] = extractelement <4 x i32> [[IN0:%.*]], i64 0
753
- ; CHECK-NEXT: ret i32 [[RV ]]
753
+ ; CHECK-NEXT: [[TMP1 :%.*]] = extractelement <4 x i32> [[IN0:%.*]], i64 0
754
+ ; CHECK-NEXT: ret i32 [[TMP1 ]]
754
755
;
755
756
%shuffle.i = shufflevector <4 x i32 > zeroinitializer , <4 x i32 > %in0 , <4 x i32 > <i32 0 , i32 4 , i32 2 , i32 6 >
756
757
%neg.i = xor <4 x i32 > %shuffle.i , <i32 -1 , i32 -1 , i32 -1 , i32 -1 >
@@ -1788,3 +1789,108 @@ define <4 x i32> @PR46872(<4 x i32> %x) {
1788
1789
ret <4 x i32 > %a
1789
1790
}
1790
1791
1792
+ define <2 x float > @fneg_unary_shuf (<2 x float > %x ) {
1793
+ ; CHECK-LABEL: @fneg_unary_shuf(
1794
+ ; CHECK-NEXT: [[NX:%.*]] = fneg nnan nsz <2 x float> [[X:%.*]]
1795
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[NX]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
1796
+ ; CHECK-NEXT: ret <2 x float> [[R]]
1797
+ ;
1798
+ %nx = fneg nsz nnan <2 x float > %x
1799
+ %r = shufflevector <2 x float > %nx , <2 x float > poison, <2 x i32 > <i32 1 , i32 0 >
1800
+ ret <2 x float > %r
1801
+ }
1802
+
1803
+ define <4 x half > @fneg_unary_shuf_widen (<2 x half > %x ) {
1804
+ ; CHECK-LABEL: @fneg_unary_shuf_widen(
1805
+ ; CHECK-NEXT: [[NX:%.*]] = fneg ninf <2 x half> [[X:%.*]]
1806
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x half> [[NX]], <2 x half> poison, <4 x i32> <i32 1, i32 0, i32 0, i32 undef>
1807
+ ; CHECK-NEXT: ret <4 x half> [[R]]
1808
+ ;
1809
+ %nx = fneg ninf <2 x half > %x
1810
+ %r = shufflevector <2 x half > %nx , <2 x half > poison, <4 x i32 > <i32 1 , i32 0 , i32 0 , i32 poison>
1811
+ ret <4 x half > %r
1812
+ }
1813
+
1814
+ define <2 x double > @fneg_unary_shuf_narrow (<4 x double > %x ) {
1815
+ ; CHECK-LABEL: @fneg_unary_shuf_narrow(
1816
+ ; CHECK-NEXT: [[NX:%.*]] = fneg nsz <4 x double> [[X:%.*]]
1817
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x double> [[NX]], <4 x double> poison, <2 x i32> <i32 3, i32 0>
1818
+ ; CHECK-NEXT: ret <2 x double> [[R]]
1819
+ ;
1820
+ %nx = fneg nsz <4 x double > %x
1821
+ %r = shufflevector <4 x double > %nx , <4 x double > poison, <2 x i32 > <i32 3 , i32 0 >
1822
+ ret <2 x double > %r
1823
+ }
1824
+
1825
+ define <2 x float > @fneg_unary_shuf_use (<2 x float > %x ) {
1826
+ ; CHECK-LABEL: @fneg_unary_shuf_use(
1827
+ ; CHECK-NEXT: [[NX:%.*]] = fneg nsz <2 x float> [[X:%.*]]
1828
+ ; CHECK-NEXT: call void @use(<2 x float> [[NX]])
1829
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[NX]], <2 x float> poison, <2 x i32> <i32 undef, i32 0>
1830
+ ; CHECK-NEXT: ret <2 x float> [[R]]
1831
+ ;
1832
+ %nx = fneg nsz <2 x float > %x
1833
+ call void @use (<2 x float > %nx )
1834
+ %r = shufflevector <2 x float > %nx , <2 x float > poison, <2 x i32 > <i32 3 , i32 0 >
1835
+ ret <2 x float > %r
1836
+ }
1837
+
1838
+ define <4 x float > @fneg_shuf (<4 x float > %x , <4 x float > %y ) {
1839
+ ; CHECK-LABEL: @fneg_shuf(
1840
+ ; CHECK-NEXT: [[NX:%.*]] = fneg ninf nsz <4 x float> [[X:%.*]]
1841
+ ; CHECK-NEXT: [[NY:%.*]] = fneg nnan ninf <4 x float> [[Y:%.*]]
1842
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x float> [[NX]], <4 x float> [[NY]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1843
+ ; CHECK-NEXT: ret <4 x float> [[R]]
1844
+ ;
1845
+ %nx = fneg nsz ninf <4 x float > %x
1846
+ %ny = fneg nnan ninf <4 x float > %y
1847
+ %r = shufflevector <4 x float > %nx , <4 x float > %ny , <4 x i32 > <i32 0 , i32 1 , i32 4 , i32 5 >
1848
+ ret <4 x float > %r
1849
+ }
1850
+
1851
+ define <4 x float > @fneg_shuf_widen_use1 (<2 x float > %x , <2 x float > %y ) {
1852
+ ; CHECK-LABEL: @fneg_shuf_widen_use1(
1853
+ ; CHECK-NEXT: [[NX:%.*]] = fneg nnan <2 x float> [[X:%.*]]
1854
+ ; CHECK-NEXT: call void @use(<2 x float> [[NX]])
1855
+ ; CHECK-NEXT: [[NY:%.*]] = fneg nnan <2 x float> [[Y:%.*]]
1856
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[NX]], <2 x float> [[NY]], <4 x i32> <i32 undef, i32 1, i32 2, i32 3>
1857
+ ; CHECK-NEXT: ret <4 x float> [[R]]
1858
+ ;
1859
+ %nx = fneg nnan <2 x float > %x
1860
+ call void @use (<2 x float > %nx )
1861
+ %ny = fneg nnan <2 x float > %y
1862
+ %r = shufflevector <2 x float > %nx , <2 x float > %ny , <4 x i32 > <i32 poison, i32 1 , i32 2 , i32 3 >
1863
+ ret <4 x float > %r
1864
+ }
1865
+
1866
+ define <2 x float > @fneg_shuf_narrow_use2 (<4 x float > %x , <4 x float > %y ) {
1867
+ ; CHECK-LABEL: @fneg_shuf_narrow_use2(
1868
+ ; CHECK-NEXT: [[NX:%.*]] = fneg nnan nsz <4 x float> [[X:%.*]]
1869
+ ; CHECK-NEXT: [[NY:%.*]] = fneg nnan nsz <4 x float> [[Y:%.*]]
1870
+ ; CHECK-NEXT: call void @use4(<4 x float> [[NY]])
1871
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x float> [[NX]], <4 x float> [[NY]], <2 x i32> <i32 3, i32 5>
1872
+ ; CHECK-NEXT: ret <2 x float> [[R]]
1873
+ ;
1874
+ %nx = fneg nsz nnan <4 x float > %x
1875
+ %ny = fneg nsz nnan <4 x float > %y
1876
+ call void @use4 (<4 x float > %ny )
1877
+ %r = shufflevector <4 x float > %nx , <4 x float > %ny , <2 x i32 > <i32 3 , i32 5 >
1878
+ ret <2 x float > %r
1879
+ }
1880
+
1881
+ define <2 x float > @fneg_shuf_use3 (<2 x float > %x , <2 x float > %y ) {
1882
+ ; CHECK-LABEL: @fneg_shuf_use3(
1883
+ ; CHECK-NEXT: [[NX:%.*]] = fneg nnan <2 x float> [[X:%.*]]
1884
+ ; CHECK-NEXT: call void @use(<2 x float> [[NX]])
1885
+ ; CHECK-NEXT: [[NY:%.*]] = fneg nnan <2 x float> [[Y:%.*]]
1886
+ ; CHECK-NEXT: call void @use(<2 x float> [[NY]])
1887
+ ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[NX]], <2 x float> [[NY]], <2 x i32> <i32 1, i32 2>
1888
+ ; CHECK-NEXT: ret <2 x float> [[R]]
1889
+ ;
1890
+ %nx = fneg nnan <2 x float > %x
1891
+ call void @use (<2 x float > %nx )
1892
+ %ny = fneg nnan <2 x float > %y
1893
+ call void @use (<2 x float > %ny )
1894
+ %r = shufflevector <2 x float > %nx , <2 x float > %ny , <2 x i32 > <i32 1 , i32 2 >
1895
+ ret <2 x float > %r
1896
+ }
0 commit comments