diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -9208,9 +9208,6 @@ 0)) return SDValue(); - if (!ScalarV.hasOneUse()) - return SDValue(); - // If the AVL is zero, operand 0 will be returned. So it's not safe to fold. // FIXME: We might be able to improve this if operand 0 is undef. if (!isNonZeroAVL(Reduce.getOperand(5))) diff --git a/llvm/test/CodeGen/RISCV/rvv/fold-binary-reduce.ll b/llvm/test/CodeGen/RISCV/rvv/fold-binary-reduce.ll --- a/llvm/test/CodeGen/RISCV/rvv/fold-binary-reduce.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fold-binary-reduce.ll @@ -282,13 +282,12 @@ ; CHECK-LABEL: reduce_fadd4: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma -; CHECK-NEXT: vmv.s.x v10, zero +; CHECK-NEXT: vfmv.s.f v10, fa0 ; CHECK-NEXT: vfredusum.vs v8, v8, v10 ; CHECK-NEXT: vfmv.f.s fa5, v8 -; CHECK-NEXT: vfredusum.vs v8, v9, v10 +; CHECK-NEXT: vfmv.s.f v8, fa1 +; CHECK-NEXT: vfredusum.vs v8, v9, v8 ; CHECK-NEXT: vfmv.f.s fa4, v8 -; CHECK-NEXT: fadd.s fa5, fa5, fa0 -; CHECK-NEXT: fadd.s fa4, fa4, fa1 ; CHECK-NEXT: fdiv.s fa0, fa5, fa4 ; CHECK-NEXT: ret entry: