From 2b09f53b32a5eea3ff1c33319fb541aa570e456b Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 6 Jun 2023 18:34:15 -0700 Subject: [PATCH] [RISCV] Remove overly restrictive assert from negateFMAOpcode. It's possible that both multiplicands are being negated. This won't change the opcode, but we can delete the two negates. Allow this case to get through negateFMAOpcode. I think D152260 will also fix this test case, but in the future it may be possible for an fneg to appear after we've already converted to RISCVISD opcodes in which case D152260 won't help. Reviewed By: fakepaper56 Differential Revision: https://reviews.llvm.org/D152296 --- llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 2 -- llvm/test/CodeGen/RISCV/rvv/vfma-vp.ll | 13 +++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index a756689..168c9ab 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -11412,8 +11412,6 @@ static SDValue performBITREVERSECombine(SDNode *N, SelectionDAG &DAG, // multiply result and/or the accumulator. // NOTE: Only supports RVV operations with VL. static unsigned negateFMAOpcode(unsigned Opcode, bool NegMul, bool NegAcc) { - assert((NegMul || NegAcc) && "Not negating anything?"); - // Negating the multiply result changes ADD<->SUB and toggles 'N'. if (NegMul) { // clang-format off diff --git a/llvm/test/CodeGen/RISCV/rvv/vfma-vp.ll b/llvm/test/CodeGen/RISCV/rvv/vfma-vp.ll index 0deabf0..b29781f 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vfma-vp.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vfma-vp.ll @@ -7708,3 +7708,16 @@ define @vfnmsub_vf_nxv8f64_neg_splat_unmasked_commute( @llvm.vp.fma.nxv8f64( %negvb, %va, %vc, %m, i32 %evl) ret %v } + +define @vfma_vv_nxv1f16_double_neg( %a, %b, %c, %m, i32 zeroext %evl) { +; CHECK-LABEL: vfma_vv_nxv1f16_double_neg: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma +; CHECK-NEXT: vfmadd.vv v9, v8, v10, v0.t +; CHECK-NEXT: vmv1r.v v8, v9 +; CHECK-NEXT: ret + %nega = call @llvm.vp.fneg.nxv1f16( %a, %m, i32 %evl) + %negb = call @llvm.vp.fneg.nxv1f16( %b, %m, i32 %evl) + %v = call @llvm.vp.fma.nxv1f16( %nega, %negb, %c, %m, i32 %evl) + ret %v +} -- 2.7.4