[llvm] b540103 - [DAG]Add ISD::SPLAT_VECTOR to TargetLowering::getNegatedExpression (#173967)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 9 02:07:15 PST 2026
Author: Liao Chunyu
Date: 2026-01-09T18:07:10+08:00
New Revision: b5401031d6e6588ecd8aefc7f5eefac52c7f8f90
URL: https://github.com/llvm/llvm-project/commit/b5401031d6e6588ecd8aefc7f5eefac52c7f8f90
DIFF: https://github.com/llvm/llvm-project/commit/b5401031d6e6588ecd8aefc7f5eefac52c7f8f90.diff
LOG: [DAG]Add ISD::SPLAT_VECTOR to TargetLowering::getNegatedExpression (#173967)
Fold splat_vector(fneg(X)) -> splat_vector(-X)
Call the getCheaperNegatedExpression function, and ISD::SPLAT_VECTOR
return NegatibleCost::Cheaper.
This optimization is applied only to the fneg instruction.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/RISCV/rvv/vsplats-zfa.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 94464e792c645..dfd074092fc78 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -7554,6 +7554,18 @@ SDValue TargetLowering::getNegatedExpression(SDValue Op, SelectionDAG &DAG,
Cost = NegatibleCost::Neutral;
return CFP;
}
+ case ISD::SPLAT_VECTOR: {
+ // fold splat_vector(fneg(X)) -> splat_vector(-X)
+ SDValue X = Op.getOperand(0);
+ if (!isOperationLegal(ISD::SPLAT_VECTOR, VT))
+ break;
+
+ SDValue NegX = getCheaperNegatedExpression(X, DAG, LegalOps, OptForSize);
+ if (!NegX)
+ break;
+ Cost = NegatibleCost::Cheaper;
+ return DAG.getNode(ISD::SPLAT_VECTOR, DL, VT, NegX);
+ }
case ISD::BUILD_VECTOR: {
// Only permit BUILD_VECTOR of constants.
if (llvm::any_of(Op->op_values(), [&](SDValue N) {
diff --git a/llvm/test/CodeGen/RISCV/rvv/vsplats-zfa.ll b/llvm/test/CodeGen/RISCV/rvv/vsplats-zfa.ll
index 6f997082a3d35..42a2894197988 100644
--- a/llvm/test/CodeGen/RISCV/rvv/vsplats-zfa.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/vsplats-zfa.ll
@@ -79,3 +79,49 @@ define <vscale x 8 x float> @vfnmadd(<vscale x 8 x float> %va, <vscale x 8 x flo
%vd = call <vscale x 8 x float> @llvm.fma.v8f32(<vscale x 8 x float> %va, <vscale x 8 x float> splat (float -2.000000e+00), <vscale x 8 x float> %neg)
ret <vscale x 8 x float> %vd
}
+
+define <vscale x 8 x float> @vfadd_vf_neg(<vscale x 8 x float> %va) {
+; CHECK-LABEL: vfadd_vf_neg:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fli.s fa5, 2.0
+; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-NEXT: vfsub.vf v8, v8, fa5
+; CHECK-NEXT: ret
+ %vd = fadd <vscale x 8 x float> %va, splat (float -2.000000e+00)
+ ret <vscale x 8 x float> %vd
+}
+
+
+define <vscale x 8 x float> @vfsub_vf_neg(<vscale x 8 x float> %va) {
+; CHECK-LABEL: vfsub_vf_neg:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fli.s fa5, 2.0
+; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-NEXT: vfadd.vf v8, v8, fa5
+; CHECK-NEXT: ret
+ %vd = fsub <vscale x 8 x float> %va, splat (float -2.000000e+00)
+ ret <vscale x 8 x float> %vd
+}
+
+
+define <vscale x 8 x float> @vfsub_vf(<vscale x 8 x float> %va) {
+; CHECK-LABEL: vfsub_vf:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fli.s fa5, 2.0
+; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-NEXT: vfsub.vf v8, v8, fa5
+; CHECK-NEXT: ret
+ %vd = fsub <vscale x 8 x float> %va, splat (float 2.000000e+00)
+ ret <vscale x 8 x float> %vd
+}
+
+define <vscale x 8 x float> @vfadd_vf(<vscale x 8 x float> %va) {
+; CHECK-LABEL: vfadd_vf:
+; CHECK: # %bb.0:
+; CHECK-NEXT: fli.s fa5, 2.0
+; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-NEXT: vfadd.vf v8, v8, fa5
+; CHECK-NEXT: ret
+ %vd = fadd <vscale x 8 x float> %va, splat (float 2.000000e+00)
+ ret <vscale x 8 x float> %vd
+}
More information about the llvm-commits
mailing list