@@ -1278,8 +1278,8 @@ define <2 x float> @fsub_splat_constant1(<2 x float> %x) {
12781278
12791279define <2 x float > @fneg (<2 x float > %x ) {
12801280; CHECK-LABEL: @fneg(
1281- ; CHECK-NEXT: [[TMP1:%.*]] = fneg <2 x float> [[X:%.*]]
1282- ; CHECK-NEXT: [[R:%.*]] = shufflevector <2 x float> [[TMP1]], <2 x float> poison, <2 x i32> zeroinitializer
1281+ ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> poison, <2 x i32> zeroinitializer
1282+ ; CHECK-NEXT: [[R:%.*]] = fneg <2 x float> [[TMP1]]
12831283; CHECK-NEXT: ret <2 x float> [[R]]
12841284;
12851285 %splat = shufflevector <2 x float > %x , <2 x float > undef , <2 x i32 > zeroinitializer
@@ -1791,8 +1791,8 @@ define <4 x i32> @PR46872(<4 x i32> %x) {
17911791
17921792define <2 x float > @fneg_unary_shuf (<2 x float > %x ) {
17931793; 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>
1794+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x float> [[X:%.*]], <2 x float> poison, <2 x i32> <i32 1, i32 0>
1795+ ; CHECK-NEXT: [[R:%.*]] = fneg nnan nsz <2 x float> [[TMP1]]
17961796; CHECK-NEXT: ret <2 x float> [[R]]
17971797;
17981798 %nx = fneg nsz nnan <2 x float > %x
@@ -1802,8 +1802,8 @@ define <2 x float> @fneg_unary_shuf(<2 x float> %x) {
18021802
18031803define <4 x half > @fneg_unary_shuf_widen (<2 x half > %x ) {
18041804; 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>
1805+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x half> [[X:%.*]], <2 x half> poison, <4 x i32> <i32 1, i32 0, i32 0, i32 undef>
1806+ ; CHECK-NEXT: [[R:%.*]] = fneg ninf <4 x half> [[TMP1]]
18071807; CHECK-NEXT: ret <4 x half> [[R]]
18081808;
18091809 %nx = fneg ninf <2 x half > %x
@@ -1813,15 +1813,17 @@ define <4 x half> @fneg_unary_shuf_widen(<2 x half> %x) {
18131813
18141814define <2 x double > @fneg_unary_shuf_narrow (<4 x double > %x ) {
18151815; 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>
1816+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <4 x double> [[X:%.*]], <4 x double> poison, <2 x i32> <i32 3, i32 0>
1817+ ; CHECK-NEXT: [[R:%.*]] = fneg nsz <2 x double> [[TMP1]]
18181818; CHECK-NEXT: ret <2 x double> [[R]]
18191819;
18201820 %nx = fneg nsz <4 x double > %x
18211821 %r = shufflevector <4 x double > %nx , <4 x double > poison, <2 x i32 > <i32 3 , i32 0 >
18221822 ret <2 x double > %r
18231823}
18241824
1825+ ; negative test - extra use prevents canonicalization
1826+
18251827define <2 x float > @fneg_unary_shuf_use (<2 x float > %x ) {
18261828; CHECK-LABEL: @fneg_unary_shuf_use(
18271829; CHECK-NEXT: [[NX:%.*]] = fneg nsz <2 x float> [[X:%.*]]
@@ -1835,11 +1837,12 @@ define <2 x float> @fneg_unary_shuf_use(<2 x float> %x) {
18351837 ret <2 x float > %r
18361838}
18371839
1840+ ; intersect FMF
1841+
18381842define <4 x float > @fneg_shuf (<4 x float > %x , <4 x float > %y ) {
18391843; 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>
1844+ ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> [[Y:%.*]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>
1845+ ; CHECK-NEXT: [[R:%.*]] = fneg ninf <4 x float> [[TMP1]]
18431846; CHECK-NEXT: ret <4 x float> [[R]]
18441847;
18451848 %nx = fneg nsz ninf <4 x float > %x
@@ -1848,12 +1851,14 @@ define <4 x float> @fneg_shuf(<4 x float> %x, <4 x float> %y) {
18481851 ret <4 x float > %r
18491852}
18501853
1854+ ; length-changing shuffle and extra use are ok
1855+
18511856define <4 x float > @fneg_shuf_widen_use1 (<2 x float > %x , <2 x float > %y ) {
18521857; CHECK-LABEL: @fneg_shuf_widen_use1(
18531858; CHECK-NEXT: [[NX:%.*]] = fneg nnan <2 x float> [[X:%.*]]
18541859; 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>
1860+ ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <2 x float> [[X]], <2 x float> [[Y:%.*]], <4 x i32> <i32 undef, i32 1, i32 2, i32 3>
1861+ ; CHECK-NEXT: [[R:%.*]] = fneg nnan <4 x float> [[TMP1]]
18571862; CHECK-NEXT: ret <4 x float> [[R]]
18581863;
18591864 %nx = fneg nnan <2 x float > %x
@@ -1863,12 +1868,14 @@ define <4 x float> @fneg_shuf_widen_use1(<2 x float> %x, <2 x float> %y) {
18631868 ret <4 x float > %r
18641869}
18651870
1871+ ; length-changing shuffle and extra use still ok
1872+
18661873define <2 x float > @fneg_shuf_narrow_use2 (<4 x float > %x , <4 x float > %y ) {
18671874; CHECK-LABEL: @fneg_shuf_narrow_use2(
1868- ; CHECK-NEXT: [[NX:%.*]] = fneg nnan nsz <4 x float> [[X:%.*]]
18691875; CHECK-NEXT: [[NY:%.*]] = fneg nnan nsz <4 x float> [[Y:%.*]]
18701876; 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>
1877+ ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x float> [[X:%.*]], <4 x float> [[Y]], <2 x i32> <i32 3, i32 5>
1878+ ; CHECK-NEXT: [[R:%.*]] = fneg nnan nsz <2 x float> [[TMP1]]
18721879; CHECK-NEXT: ret <2 x float> [[R]]
18731880;
18741881 %nx = fneg nsz nnan <4 x float > %x
@@ -1878,6 +1885,8 @@ define <2 x float> @fneg_shuf_narrow_use2(<4 x float> %x, <4 x float> %y) {
18781885 ret <2 x float > %r
18791886}
18801887
1888+ ; negative test - too many extra uses
1889+
18811890define <2 x float > @fneg_shuf_use3 (<2 x float > %x , <2 x float > %y ) {
18821891; CHECK-LABEL: @fneg_shuf_use3(
18831892; CHECK-NEXT: [[NX:%.*]] = fneg nnan <2 x float> [[X:%.*]]
0 commit comments