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 @@ -1267,3 +1267,37 @@ %fadd = fadd nsz %a, %sel ret %fadd } + +; Make sure to select the correct destination operand and avoid choosing z0 mindlessly. +define @fadd_sel_fmul_h_different_arg_order( %pred, %m1, %m2, %acc) { +; CHECK-LABEL: fadd_sel_fmul_h_different_arg_order: +; CHECK: // %bb.0: +; CHECK-NEXT: fmad z0.h, p0/m, z1.h, z2.h +; CHECK-NEXT: ret + %mul = fmul contract %m1, %m2 + %masked.mul = select %pred, %mul, zeroinitializer + %add = fadd nsz contract %acc, %masked.mul + ret %add +} + +define @fadd_sel_fmul_s_different_arg_order( %pred, %m1, %m2, %acc) { +; CHECK-LABEL: fadd_sel_fmul_s_different_arg_order: +; CHECK: // %bb.0: +; CHECK-NEXT: fmad z0.s, p0/m, z1.s, z2.s +; CHECK-NEXT: ret + %mul = fmul contract %m1, %m2 + %masked.mul = select %pred, %mul, zeroinitializer + %add = fadd nsz contract %acc, %masked.mul + ret %add +} + +define @fadd_sel_fmul_d_different_arg_order( %pred, %m1, %m2, %acc) { +; CHECK-LABEL: fadd_sel_fmul_d_different_arg_order: +; CHECK: // %bb.0: +; CHECK-NEXT: fmad z0.d, p0/m, z1.d, z2.d +; CHECK-NEXT: ret + %mul = fmul contract %m1, %m2 + %masked.mul = select %pred, %mul, zeroinitializer + %add = fadd nsz contract %acc, %masked.mul + ret %add +}