@@ -1797,8 +1797,8 @@ define <4 x i32> @PR46872(<4 x i32> %x) {
1797
1797
1798
1798
define <2 x float > @fabs_unary_shuf (<2 x float > %x ) {
1799
1799
; CHECK-LABEL: @fabs_unary_shuf(
1800
- ; CHECK-NEXT: [[NX :%.*]] = call nnan nsz <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
1801
- ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[NX]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
1800
+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
1801
+ ; CHECK-NEXT: [[R:%.*]] = call nnan nsz <2 x float> @llvm.fabs.v2f32( <2 x float> [[TMP1]])
1802
1802
; CHECK-NEXT: ret <2 x float> [[R]]
1803
1803
;
1804
1804
%nx = call nsz nnan <2 x float > @llvm.fabs.v2f32 (<2 x float > %x )
@@ -1808,8 +1808,8 @@ define <2 x float> @fabs_unary_shuf(<2 x float> %x) {
1808
1808
1809
1809
define <4 x half > @fabs_unary_shuf_widen (<2 x half > %x ) {
1810
1810
; CHECK-LABEL: @fabs_unary_shuf_widen(
1811
- ; CHECK-NEXT: [[NX :%.*]] = call ninf <2 x half> @llvm.fabs.v2f16(<2 x half> [[X:%.*]])
1812
- ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x half> [[NX]], <2 x half> poison, <4 x i32> <i32 1, i32 0, i32 0, i32 undef>
1811
+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x half> [[X:%.*]], <2 x half> poison, <4 x i32> <i32 1, i32 0, i32 0, i32 undef>
1812
+ ; CHECK-NEXT: [[R:%.*]] = call ninf <4 x half> @llvm.fabs.v4f16( <4 x half> [[TMP1]])
1813
1813
; CHECK-NEXT: ret <4 x half> [[R]]
1814
1814
;
1815
1815
%nx = call ninf <2 x half > @llvm.fabs.v2f16 (<2 x half > %x )
@@ -1819,15 +1819,17 @@ define <4 x half> @fabs_unary_shuf_widen(<2 x half> %x) {
1819
1819
1820
1820
define <2 x double > @fabs_unary_shuf_narrow (<4 x double > %x ) {
1821
1821
; CHECK-LABEL: @fabs_unary_shuf_narrow(
1822
- ; CHECK-NEXT: [[NX :%.*]] = call nsz <4 x double> @llvm.fabs.v4f64(<4 x double> [[X:%.*]])
1823
- ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x double> [[NX]], <4 x double> poison, <2 x i32> <i32 3, i32 0>
1822
+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <4 x double> [[X:%.*]], <4 x double> poison, <2 x i32> <i32 3, i32 0>
1823
+ ; CHECK-NEXT: [[R:%.*]] = call nsz <2 x double> @llvm.fabs.v2f64( <2 x double> [[TMP1]])
1824
1824
; CHECK-NEXT: ret <2 x double> [[R]]
1825
1825
;
1826
1826
%nx = call nsz <4 x double > @llvm.fabs.v4f64 (<4 x double > %x )
1827
1827
%r = shufflevector <4 x double > %nx , <4 x double > poison, <2 x i32 > <i32 3 , i32 0 >
1828
1828
ret <2 x double > %r
1829
1829
}
1830
1830
1831
+ ; negative test - extra use prevents canonicalization
1832
+
1831
1833
define <2 x float > @fabs_unary_shuf_use (<2 x float > %x ) {
1832
1834
; CHECK-LABEL: @fabs_unary_shuf_use(
1833
1835
; CHECK-NEXT: [[NX:%.*]] = call nsz <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
@@ -1841,11 +1843,12 @@ define <2 x float> @fabs_unary_shuf_use(<2 x float> %x) {
1841
1843
ret <2 x float > %r
1842
1844
}
1843
1845
1846
+ ; intersect FMF
1847
+
1844
1848
define <4 x float > @fabs_shuf (<4 x float > %x , <4 x float > %y ) {
1845
1849
; CHECK-LABEL: @fabs_shuf(
1846
- ; CHECK-NEXT: [[NX:%.*]] = call ninf nsz <4 x float> @llvm.fabs.v4f32(<4 x float> [[X:%.*]])
1847
- ; CHECK-NEXT: [[NY:%.*]] = call nnan ninf <4 x float> @llvm.fabs.v4f32(<4 x float> [[Y:%.*]])
1848
- ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x float> [[NX]], <4 x float> [[NY]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1850
+ ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> [[Y:%.*]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1851
+ ; CHECK-NEXT: [[R:%.*]] = call ninf <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP1]])
1849
1852
; CHECK-NEXT: ret <4 x float> [[R]]
1850
1853
;
1851
1854
%nx = call nsz ninf <4 x float > @llvm.fabs.v4f32 (<4 x float > %x )
@@ -1854,12 +1857,14 @@ define <4 x float> @fabs_shuf(<4 x float> %x, <4 x float> %y) {
1854
1857
ret <4 x float > %r
1855
1858
}
1856
1859
1860
+ ; length-changing shuffle and extra use are ok
1861
+
1857
1862
define <4 x float > @fabs_shuf_widen_use1 (<2 x float > %x , <2 x float > %y ) {
1858
1863
; CHECK-LABEL: @fabs_shuf_widen_use1(
1859
1864
; CHECK-NEXT: [[NX:%.*]] = call nnan <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
1860
1865
; CHECK-NEXT: call void @use(<2 x float> [[NX]])
1861
- ; CHECK-NEXT: [[NY :%.*]] = call nnan <2 x float> @llvm.fabs.v2f32( <2 x float> [[Y:%.*]])
1862
- ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[NX]], <2 x float> [[NY]], <4 x i32> <i32 undef, i32 1, i32 2, i32 3>
1866
+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x float> [[X]], <2 x float> [[Y:%.*]], <4 x i32> <i32 undef, i32 1, i32 2, i32 3>
1867
+ ; CHECK-NEXT: [[R:%.*]] = call nnan <4 x float> @llvm.fabs.v4f32(<4 x float> [[TMP1]])
1863
1868
; CHECK-NEXT: ret <4 x float> [[R]]
1864
1869
;
1865
1870
%nx = call nnan <2 x float > @llvm.fabs.v2f32 (<2 x float > %x )
@@ -1869,12 +1874,14 @@ define <4 x float> @fabs_shuf_widen_use1(<2 x float> %x, <2 x float> %y) {
1869
1874
ret <4 x float > %r
1870
1875
}
1871
1876
1877
+ ; length-changing shuffle and extra use are ok
1878
+
1872
1879
define <2 x float > @fabs_shuf_narrow_use2 (<4 x float > %x , <4 x float > %y ) {
1873
1880
; CHECK-LABEL: @fabs_shuf_narrow_use2(
1874
- ; CHECK-NEXT: [[NX:%.*]] = call nnan nsz <4 x float> @llvm.fabs.v4f32(<4 x float> [[X:%.*]])
1875
1881
; CHECK-NEXT: [[NY:%.*]] = call nnan nsz <4 x float> @llvm.fabs.v4f32(<4 x float> [[Y:%.*]])
1876
1882
; CHECK-NEXT: call void @use4(<4 x float> [[NY]])
1877
- ; CHECK-NEXT: [[R:%.*]] = shufflevector <4 x float> [[NX]], <4 x float> [[NY]], <2 x i32> <i32 3, i32 5>
1883
+ ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> [[Y]], <2 x i32> <i32 3, i32 5>
1884
+ ; CHECK-NEXT: [[R:%.*]] = call nnan nsz <2 x float> @llvm.fabs.v2f32(<2 x float> [[TMP1]])
1878
1885
; CHECK-NEXT: ret <2 x float> [[R]]
1879
1886
;
1880
1887
%nx = call nsz nnan <4 x float > @llvm.fabs.v4f32 (<4 x float > %x )
@@ -1884,6 +1891,8 @@ define <2 x float> @fabs_shuf_narrow_use2(<4 x float> %x, <4 x float> %y) {
1884
1891
ret <2 x float > %r
1885
1892
}
1886
1893
1894
+ ; negative test - too many extra uses
1895
+
1887
1896
define <2 x float > @fabs_shuf_use3 (<2 x float > %x , <2 x float > %y ) {
1888
1897
; CHECK-LABEL: @fabs_shuf_use3(
1889
1898
; CHECK-NEXT: [[NX:%.*]] = call nnan <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
@@ -2016,6 +2025,8 @@ define <2 x float> @fneg_shuf_use3(<2 x float> %x, <2 x float> %y) {
2016
2025
ret <2 x float > %r
2017
2026
}
2018
2027
2028
+ ; negative test - mixed opcodes
2029
+
2019
2030
define <4 x float > @fabs_fneg_shuf (<4 x float > %x , <4 x float > %y ) {
2020
2031
; CHECK-LABEL: @fabs_fneg_shuf(
2021
2032
; CHECK-NEXT: [[NX:%.*]] = call <4 x float> @llvm.fabs.v4f32(<4 x float> [[X:%.*]])
0 commit comments