diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -513,10 +513,6 @@ def : Pat<(Ty (AArch64fma_p PredTy:$P, (AArch64fneg_mt PredTy:$P, Ty:$Zn, (Ty (undef))), Ty:$Zm, (AArch64fneg_mt PredTy:$P, Ty:$Za, (Ty (undef))))), (!cast("FNMLA_ZPZZZ_UNDEF_"#Suffix) $P, ZPR:$Za, ZPR:$Zn, ZPR:$Zm)>; - // Zd = -(Za + Zn * Zm) - def : Pat<(AArch64fneg_mt PredTy:$P, (AArch64fma_p PredTy:$P, Ty:$Zn, Ty:$Zm, Ty:$Za), (Ty (undef))), - (!cast("FNMLA_ZPZZZ_UNDEF_"#Suffix) $P, ZPR:$Za, ZPR:$Zn, ZPR:$Zm)>; - // Zda = Zda + Zn * Zm def : Pat<(vselect (PredTy PPR:$Pg), (Ty (AArch64fma_p (PredTy (AArch64ptrue 31)), ZPR:$Zn, ZPR:$Zm, ZPR:$Za)), ZPR:$Za), (!cast("FMLA_ZPmZZ_"#Suffix) PPR:$Pg, ZPR:$Za, ZPR:$Zn, ZPR:$Zm)>; diff --git a/llvm/test/CodeGen/AArch64/sve-fp-combine.ll b/llvm/test/CodeGen/AArch64/sve-fp-combine.ll --- a/llvm/test/CodeGen/AArch64/sve-fp-combine.ll +++ b/llvm/test/CodeGen/AArch64/sve-fp-combine.ll @@ -401,7 +401,8 @@ ; CHECK-LABEL: fnmad_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -413,7 +414,8 @@ ; CHECK-LABEL: fnmad_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -425,7 +427,8 @@ ; CHECK-LABEL: fnmad_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -437,7 +440,8 @@ ; CHECK-LABEL: fnmad_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -449,7 +453,8 @@ ; CHECK-LABEL: fnmad_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmad z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -461,7 +466,8 @@ ; CHECK-LABEL: fnmad_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmad z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: fmad z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: fneg z0.d, p0/m, z0.d ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -473,7 +479,8 @@ ; CHECK-LABEL: fnmla_h: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -485,7 +492,8 @@ ; CHECK-LABEL: fnmla_hx4: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -497,7 +505,8 @@ ; CHECK-LABEL: fnmla_hx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -509,7 +518,8 @@ ; CHECK-LABEL: fnmla_s: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -521,7 +531,8 @@ ; CHECK-LABEL: fnmla_sx2: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -533,7 +544,8 @@ ; CHECK-LABEL: fnmla_d: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmla z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: fneg z0.d, p0/m, z0.d ; CHECK-NEXT: ret %neg_m1 = fneg fast %m1 %mul = fmul fast %neg_m1, %m2 @@ -545,7 +557,8 @@ ; CHECK-LABEL: fnmla_h_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.h -; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %mul = fmul fast %m1, %m2 %add = fadd fast %mul, %acc @@ -557,7 +570,8 @@ ; CHECK-LABEL: fnmla_hx4_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %mul = fmul fast %m1, %m2 %add = fadd fast %mul, %acc @@ -569,7 +583,8 @@ ; CHECK-LABEL: fnmla_hx2_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fmla z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: fneg z0.h, p0/m, z0.h ; CHECK-NEXT: ret %mul = fmul fast %m1, %m2 %add = fadd fast %mul, %acc @@ -581,7 +596,8 @@ ; CHECK-LABEL: fnmla_s_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.s -; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %mul = fmul fast %m1, %m2 %add = fadd fast %mul, %acc @@ -593,7 +609,8 @@ ; CHECK-LABEL: fnmla_sx2_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fmla z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: fneg z0.s, p0/m, z0.s ; CHECK-NEXT: ret %mul = fmul fast %m1, %m2 %add = fadd fast %mul, %acc @@ -605,7 +622,8 @@ ; CHECK-LABEL: fnmla_d_reversed: ; CHECK: // %bb.0: ; CHECK-NEXT: ptrue p0.d -; CHECK-NEXT: fnmla z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: fmla z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: fneg z0.d, p0/m, z0.d ; CHECK-NEXT: ret %mul = fmul fast %m1, %m2 %add = fadd fast %mul, %acc