[llvm] [RISCV] Move the rest of Zfa FLI instruction handling to lowerConstantFP. (PR #109217)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 18 16:04:27 PDT 2024
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/109217
We already moved the fneg case. This moves the rest so we can drop the custom isel.
>From 94239b8b8da1d87bd66e0af5140d081d2325b241 Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Wed, 18 Sep 2024 16:02:13 -0700
Subject: [PATCH] [RISCV] Move the rest of Zfa FLI instruction handling to
lowerConstantFP.
We already moved the fneg case. This moves the rest so we can
drop the custom isel.
---
llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp | 30 ---------------------
llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 24 ++++++++++-------
2 files changed, 14 insertions(+), 40 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
index f22ab1e5e9d48a..fcd46b5921c4de 100644
--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -889,29 +889,6 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
}
case ISD::ConstantFP: {
const APFloat &APF = cast<ConstantFPSDNode>(Node)->getValueAPF();
- int FPImm = static_cast<const RISCVTargetLowering *>(TLI)->getLegalZfaFPImm(
- APF, VT);
- if (FPImm >= 0) {
- unsigned Opc;
- switch (VT.SimpleTy) {
- default:
- llvm_unreachable("Unexpected size");
- case MVT::f16:
- Opc = RISCV::FLI_H;
- break;
- case MVT::f32:
- Opc = RISCV::FLI_S;
- break;
- case MVT::f64:
- Opc = RISCV::FLI_D;
- break;
- }
- SDNode *Res = CurDAG->getMachineNode(
- Opc, DL, VT, CurDAG->getTargetConstant(FPImm, DL, XLenVT));
-
- ReplaceNode(Node, Res);
- return;
- }
bool NegZeroF64 = APF.isNegZero() && VT == MVT::f64;
SDValue Imm;
@@ -3552,13 +3529,6 @@ bool RISCVDAGToDAGISel::selectScalarFPAsInt(SDValue N, SDValue &Imm) {
MVT VT = CFP->getSimpleValueType(0);
- // Even if this FPImm requires an additional FNEG (i.e. the second element of
- // the returned pair is true) we still prefer FLI + FNEG over immediate
- // materialization as the latter might generate a longer instruction sequence.
- if (static_cast<const RISCVTargetLowering *>(TLI)->getLegalZfaFPImm(APF,
- VT) >= 0)
- return false;
-
MVT XLenVT = Subtarget->getXLenVT();
if (VT == MVT::f64 && !Subtarget->is64Bit()) {
assert(APF.isNegZero() && "Unexpected constant.");
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 189fb741f34cd1..fc12c88445200d 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -2268,9 +2268,6 @@ bool RISCVTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT,
if (!IsLegalVT)
return false;
- if (getLegalZfaFPImm(Imm, VT) >= 0)
- return true;
-
// Cannot create a 64 bit floating-point immediate value for rv32.
if (Subtarget.getXLen() < VT.getScalarSizeInBits()) {
// td can handle +0.0 or -0.0 already.
@@ -5802,22 +5799,29 @@ SDValue RISCVTargetLowering::lowerConstantFP(SDValue Op,
MVT VT = Op.getSimpleValueType();
const APFloat &Imm = cast<ConstantFPSDNode>(Op)->getValueAPF();
- if (getLegalZfaFPImm(Imm, VT) >= 0)
- return Op;
+ // Can this constant be select by a Zfa FLI instruction?
+ bool Negate = false;
+ int Index = getLegalZfaFPImm(Imm, VT);
- if (!Imm.isNegative())
- return SDValue();
+ // If the constant is negative, try negating.
+ if (Index < 0 && Imm.isNegative()) {
+ Index = getLegalZfaFPImm(-Imm, VT);
+ Negate = true;
+ }
- int Index = getLegalZfaFPImm(-Imm, VT);
+ // If we couldn't find a FLI lowering, fall back to generic code.
if (Index < 0)
return SDValue();
// Emit an FLI+FNEG. We use a custom node to hide from constant folding.
SDLoc DL(Op);
SDValue Const =
- DAG.getNode(RISCVISD::FLI, Op, VT,
+ DAG.getNode(RISCVISD::FLI, DL, VT,
DAG.getTargetConstant(Index, DL, Subtarget.getXLenVT()));
- return DAG.getNode(ISD::FNEG, Op, VT, Const);
+ if (!Negate)
+ return Const;
+
+ return DAG.getNode(ISD::FNEG, DL, VT, Const);
}
static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG,
More information about the llvm-commits
mailing list