Skip to content

Commit 079f31c

Browse files
authored
[RISCV] Move the rest of Zfa FLI instruction handling to lowerConstantFP. (#109217)
We already moved the fneg case. This moves the rest so we can drop the custom isel.
1 parent 13dd2fd commit 079f31c

File tree

5 files changed

+89
-37
lines changed

5 files changed

+89
-37
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -889,29 +889,6 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
889889
}
890890
case ISD::ConstantFP: {
891891
const APFloat &APF = cast<ConstantFPSDNode>(Node)->getValueAPF();
892-
int FPImm = static_cast<const RISCVTargetLowering *>(TLI)->getLegalZfaFPImm(
893-
APF, VT);
894-
if (FPImm >= 0) {
895-
unsigned Opc;
896-
switch (VT.SimpleTy) {
897-
default:
898-
llvm_unreachable("Unexpected size");
899-
case MVT::f16:
900-
Opc = RISCV::FLI_H;
901-
break;
902-
case MVT::f32:
903-
Opc = RISCV::FLI_S;
904-
break;
905-
case MVT::f64:
906-
Opc = RISCV::FLI_D;
907-
break;
908-
}
909-
SDNode *Res = CurDAG->getMachineNode(
910-
Opc, DL, VT, CurDAG->getTargetConstant(FPImm, DL, XLenVT));
911-
912-
ReplaceNode(Node, Res);
913-
return;
914-
}
915892

916893
bool NegZeroF64 = APF.isNegZero() && VT == MVT::f64;
917894
SDValue Imm;
@@ -3552,13 +3529,6 @@ bool RISCVDAGToDAGISel::selectScalarFPAsInt(SDValue N, SDValue &Imm) {
35523529

35533530
MVT VT = CFP->getSimpleValueType(0);
35543531

3555-
// Even if this FPImm requires an additional FNEG (i.e. the second element of
3556-
// the returned pair is true) we still prefer FLI + FNEG over immediate
3557-
// materialization as the latter might generate a longer instruction sequence.
3558-
if (static_cast<const RISCVTargetLowering *>(TLI)->getLegalZfaFPImm(APF,
3559-
VT) >= 0)
3560-
return false;
3561-
35623532
MVT XLenVT = Subtarget->getXLenVT();
35633533
if (VT == MVT::f64 && !Subtarget->is64Bit()) {
35643534
assert(APF.isNegZero() && "Unexpected constant.");

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5802,22 +5802,29 @@ SDValue RISCVTargetLowering::lowerConstantFP(SDValue Op,
58025802
MVT VT = Op.getSimpleValueType();
58035803
const APFloat &Imm = cast<ConstantFPSDNode>(Op)->getValueAPF();
58045804

5805-
if (getLegalZfaFPImm(Imm, VT) >= 0)
5806-
return Op;
5805+
// Can this constant be selected by a Zfa FLI instruction?
5806+
bool Negate = false;
5807+
int Index = getLegalZfaFPImm(Imm, VT);
58075808

5808-
if (!Imm.isNegative())
5809-
return SDValue();
5809+
// If the constant is negative, try negating.
5810+
if (Index < 0 && Imm.isNegative()) {
5811+
Index = getLegalZfaFPImm(-Imm, VT);
5812+
Negate = true;
5813+
}
58105814

5811-
int Index = getLegalZfaFPImm(-Imm, VT);
5815+
// If we couldn't find a FLI lowering, fall back to generic code.
58125816
if (Index < 0)
58135817
return SDValue();
58145818

58155819
// Emit an FLI+FNEG. We use a custom node to hide from constant folding.
58165820
SDLoc DL(Op);
58175821
SDValue Const =
5818-
DAG.getNode(RISCVISD::FLI, Op, VT,
5822+
DAG.getNode(RISCVISD::FLI, DL, VT,
58195823
DAG.getTargetConstant(Index, DL, Subtarget.getXLenVT()));
5820-
return DAG.getNode(ISD::FNEG, Op, VT, Const);
5824+
if (!Negate)
5825+
return Const;
5826+
5827+
return DAG.getNode(ISD::FNEG, DL, VT, Const);
58215828
}
58225829

58235830
static SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG,

llvm/test/CodeGen/RISCV/double-zfa.ll

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,3 +371,31 @@ define double @fma_neg_addend_multiplicand(double %x) nounwind {
371371
%a = call double @llvm.fma.f32(double %x, double -0.5, double -0.25)
372372
ret double %a
373373
}
374+
375+
define double @select_loadfpimm(double %x) nounwind {
376+
; RV32IDZFA-LABEL: select_loadfpimm:
377+
; RV32IDZFA: # %bb.0: # %entry
378+
; RV32IDZFA-NEXT: fcvt.d.w fa5, zero
379+
; RV32IDZFA-NEXT: fle.d a0, fa5, fa0
380+
; RV32IDZFA-NEXT: fli.d fa0, 0.5
381+
; RV32IDZFA-NEXT: bnez a0, .LBB35_2
382+
; RV32IDZFA-NEXT: # %bb.1:
383+
; RV32IDZFA-NEXT: fneg.d fa0, fa0
384+
; RV32IDZFA-NEXT: .LBB35_2: # %entry
385+
; RV32IDZFA-NEXT: ret
386+
;
387+
; RV64DZFA-LABEL: select_loadfpimm:
388+
; RV64DZFA: # %bb.0: # %entry
389+
; RV64DZFA-NEXT: fmv.d.x fa5, zero
390+
; RV64DZFA-NEXT: fle.d a0, fa5, fa0
391+
; RV64DZFA-NEXT: fli.d fa0, 0.5
392+
; RV64DZFA-NEXT: bnez a0, .LBB35_2
393+
; RV64DZFA-NEXT: # %bb.1:
394+
; RV64DZFA-NEXT: fneg.d fa0, fa0
395+
; RV64DZFA-NEXT: .LBB35_2: # %entry
396+
; RV64DZFA-NEXT: ret
397+
entry:
398+
%cmp = fcmp ult double %x, 0.000000e+00
399+
%sel = select i1 %cmp, double -5.000000e-01, double 5.000000e-01
400+
ret double %sel
401+
}

llvm/test/CodeGen/RISCV/float-zfa.ll

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,3 +310,20 @@ define float @fma_neg_addend_multiplicand(float %x) nounwind {
310310
%a = call float @llvm.fma.f32(float %x, float -0.5, float -0.25)
311311
ret float %a
312312
}
313+
314+
define float @select_loadfpimm(float %x) nounwind {
315+
; CHECK-LABEL: select_loadfpimm:
316+
; CHECK: # %bb.0: # %entry
317+
; CHECK-NEXT: fmv.w.x fa5, zero
318+
; CHECK-NEXT: fle.s a0, fa5, fa0
319+
; CHECK-NEXT: fli.s fa0, 0.5
320+
; CHECK-NEXT: bnez a0, .LBB30_2
321+
; CHECK-NEXT: # %bb.1:
322+
; CHECK-NEXT: fneg.s fa0, fa0
323+
; CHECK-NEXT: .LBB30_2: # %entry
324+
; CHECK-NEXT: ret
325+
entry:
326+
%cmp = fcmp ult float %x, 0.000000e+00
327+
%sel = select i1 %cmp, float -5.000000e-01, float 5.000000e-01
328+
ret float %sel
329+
}

llvm/test/CodeGen/RISCV/half-zfa.ll

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,33 @@ define half @fma_neg_addend_multiplicand(half %x) nounwind {
314314
%a = call half @llvm.fma.f32(half %x, half -0.5, half -0.25)
315315
ret half %a
316316
}
317+
318+
define half @select_loadfpimm(half %x) nounwind {
319+
; CHECK-LABEL: select_loadfpimm:
320+
; CHECK: # %bb.0: # %entry
321+
; CHECK-NEXT: fmv.h.x fa5, zero
322+
; CHECK-NEXT: fle.h a0, fa5, fa0
323+
; CHECK-NEXT: fli.h fa0, 0.5
324+
; CHECK-NEXT: bnez a0, .LBB16_2
325+
; CHECK-NEXT: # %bb.1:
326+
; CHECK-NEXT: fneg.h fa0, fa0
327+
; CHECK-NEXT: .LBB16_2: # %entry
328+
; CHECK-NEXT: ret
329+
;
330+
; ZFHMIN-LABEL: select_loadfpimm:
331+
; ZFHMIN: # %bb.0: # %entry
332+
; ZFHMIN-NEXT: fcvt.s.h fa5, fa0
333+
; ZFHMIN-NEXT: fmv.w.x fa4, zero
334+
; ZFHMIN-NEXT: fle.s a0, fa4, fa5
335+
; ZFHMIN-NEXT: xori a0, a0, 1
336+
; ZFHMIN-NEXT: slli a0, a0, 1
337+
; ZFHMIN-NEXT: lui a1, %hi(.LCPI16_0)
338+
; ZFHMIN-NEXT: addi a1, a1, %lo(.LCPI16_0)
339+
; ZFHMIN-NEXT: add a0, a1, a0
340+
; ZFHMIN-NEXT: flh fa0, 0(a0)
341+
; ZFHMIN-NEXT: ret
342+
entry:
343+
%cmp = fcmp ult half %x, 0.000000e+00
344+
%sel = select i1 %cmp, half -5.000000e-01, half 5.000000e-01
345+
ret half %sel
346+
}

0 commit comments

Comments
 (0)