Skip to content

Commit df48119

Browse files
committed
add option to set max allowed instructins
1 parent 2432bb0 commit df48119

File tree

5 files changed

+389
-119
lines changed

5 files changed

+389
-119
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "LoongArchSubtarget.h"
1919
#include "MCTargetDesc/LoongArchBaseInfo.h"
2020
#include "MCTargetDesc/LoongArchMCTargetDesc.h"
21+
#include "MCTargetDesc/LoongArchMatInt.h"
2122
#include "llvm/ADT/SmallSet.h"
2223
#include "llvm/ADT/Statistic.h"
2324
#include "llvm/ADT/StringExtras.h"
@@ -41,6 +42,29 @@ using namespace llvm;
4142

4243
STATISTIC(NumTailCalls, "Number of tail calls");
4344

45+
enum MaterializeFPImm {
46+
NoMaterializeFPImm,
47+
MaterializeFPImm1Ins,
48+
MaterializeFPImm2Ins,
49+
MaterializeFPImm3Ins,
50+
MaterializeFPImm4Ins
51+
};
52+
53+
static cl::opt<MaterializeFPImm> MaterializeFPImmInsNum(
54+
"loongarch-materialize-float-imm", cl::Hidden,
55+
cl::desc("Maximum number of instructions used when materializing "
56+
"floating-point immediates (default = 2)"),
57+
cl::init(MaterializeFPImm2Ins),
58+
cl::values(clEnumValN(NoMaterializeFPImm, "0", "Use constant pool"),
59+
clEnumValN(MaterializeFPImm1Ins, "1",
60+
"Materialize FP immediate within 1 instruction"),
61+
clEnumValN(MaterializeFPImm2Ins, "2",
62+
"Materialize FP immediate within 2 instructions"),
63+
clEnumValN(MaterializeFPImm3Ins, "3",
64+
"Materialize FP immediate within 3 instructions"),
65+
clEnumValN(MaterializeFPImm4Ins, "4",
66+
"Materialize FP immediate within 4 instructions")));
67+
4468
static cl::opt<bool> ZeroDivCheck("loongarch-check-zero-division", cl::Hidden,
4569
cl::desc("Trap on integer division by zero."),
4670
cl::init(false));
@@ -572,7 +596,7 @@ SDValue LoongArchTargetLowering::lowerConstantFP(SDValue Op,
572596
return SDValue();
573597

574598
// If lsx enabled, use cheaper 'vldi' instruction if possible.
575-
if (Subtarget.hasExtLSX() && isFPImmVLDILegal(FPVal, VT))
599+
if (isFPImmVLDILegal(FPVal, VT))
576600
return SDValue();
577601

578602
// Construct as integer, and move to float register.
@@ -590,10 +614,18 @@ SDValue LoongArchTargetLowering::lowerConstantFP(SDValue Op,
590614
DL, VT, NewVal);
591615
}
592616
case MVT::f64: {
617+
// If more than MaterializeFPImmInsNum instructions will be used to
618+
// generate the INTVal, fallback to use floating point load from the
619+
// constant pool.
620+
auto Seq = LoongArchMatInt::generateInstSeq(INTVal.getSExtValue());
621+
if (Seq.size() > MaterializeFPImmInsNum && !FPVal.isExactlyValue(+1.0))
622+
return SDValue();
623+
593624
if (Subtarget.is64Bit()) {
594625
SDValue NewVal = DAG.getConstant(INTVal, DL, MVT::i64);
595626
return DAG.getNode(LoongArchISD::MOVGR2FR_D, DL, VT, NewVal);
596627
}
628+
597629
SDValue Lo = DAG.getConstant(INTVal.trunc(32), DL, MVT::i32);
598630
SDValue Hi = DAG.getConstant(INTVal.lshr(32).trunc(32), DL, MVT::i32);
599631
return DAG.getNode(LoongArchISD::MOVGR2FR_D_LO_HI, DL, VT, Lo, Hi);

llvm/test/CodeGen/LoongArch/calling-conv-ilp32d.ll

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,17 @@ define i32 @caller_double_in_gpr_exhausted_fprs() nounwind {
7272
; CHECK-NEXT: lu12i.w $a0, 262144
7373
; CHECK-NEXT: fmov.d $fa1, $fa7
7474
; CHECK-NEXT: movgr2frh.w $fa1, $a0
75-
; CHECK-NEXT: lu12i.w $a0, 262272
76-
; CHECK-NEXT: fmov.d $fa2, $fa7
77-
; CHECK-NEXT: movgr2frh.w $fa2, $a0
7875
; CHECK-NEXT: lu12i.w $a0, 262400
7976
; CHECK-NEXT: fmov.d $fa3, $fa7
8077
; CHECK-NEXT: movgr2frh.w $fa3, $a0
81-
; CHECK-NEXT: lu12i.w $a0, 262464
82-
; CHECK-NEXT: fmov.d $fa4, $fa7
83-
; CHECK-NEXT: movgr2frh.w $fa4, $a0
84-
; CHECK-NEXT: lu12i.w $a0, 262528
85-
; CHECK-NEXT: fmov.d $fa5, $fa7
86-
; CHECK-NEXT: movgr2frh.w $fa5, $a0
87-
; CHECK-NEXT: lu12i.w $a0, 262592
88-
; CHECK-NEXT: fmov.d $fa6, $fa7
89-
; CHECK-NEXT: movgr2frh.w $fa6, $a0
78+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_0)
79+
; CHECK-NEXT: fld.d $fa2, $a0, %pc_lo12(.LCPI3_0)
80+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_1)
81+
; CHECK-NEXT: fld.d $fa4, $a0, %pc_lo12(.LCPI3_1)
82+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_2)
83+
; CHECK-NEXT: fld.d $fa5, $a0, %pc_lo12(.LCPI3_2)
84+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI3_3)
85+
; CHECK-NEXT: fld.d $fa6, $a0, %pc_lo12(.LCPI3_3)
9086
; CHECK-NEXT: lu12i.w $a0, 262656
9187
; CHECK-NEXT: movgr2frh.w $fa7, $a0
9288
; CHECK-NEXT: lu12i.w $a1, 262688
@@ -138,23 +134,19 @@ define i32 @caller_double_on_stack_exhausted_fprs_gprs() nounwind {
138134
; CHECK-NEXT: lu12i.w $a0, 262144
139135
; CHECK-NEXT: fmov.d $fa1, $fa7
140136
; CHECK-NEXT: movgr2frh.w $fa1, $a0
141-
; CHECK-NEXT: lu12i.w $a0, 262272
142-
; CHECK-NEXT: fmov.d $fa2, $fa7
143-
; CHECK-NEXT: movgr2frh.w $fa2, $a0
144137
; CHECK-NEXT: lu12i.w $a0, 262400
145138
; CHECK-NEXT: fmov.d $fa3, $fa7
146139
; CHECK-NEXT: movgr2frh.w $fa3, $a0
147-
; CHECK-NEXT: lu12i.w $a0, 262464
148-
; CHECK-NEXT: fmov.d $fa4, $fa7
149-
; CHECK-NEXT: movgr2frh.w $fa4, $a0
150-
; CHECK-NEXT: lu12i.w $a0, 262528
151-
; CHECK-NEXT: fmov.d $fa5, $fa7
152-
; CHECK-NEXT: movgr2frh.w $fa5, $a0
153-
; CHECK-NEXT: lu12i.w $a0, 262592
154-
; CHECK-NEXT: fmov.d $fa6, $fa7
155-
; CHECK-NEXT: movgr2frh.w $fa6, $a0
156140
; CHECK-NEXT: lu12i.w $a0, 262656
157141
; CHECK-NEXT: movgr2frh.w $fa7, $a0
142+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_0)
143+
; CHECK-NEXT: fld.d $fa2, $a0, %pc_lo12(.LCPI5_0)
144+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_1)
145+
; CHECK-NEXT: fld.d $fa4, $a0, %pc_lo12(.LCPI5_1)
146+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_2)
147+
; CHECK-NEXT: fld.d $fa5, $a0, %pc_lo12(.LCPI5_2)
148+
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI5_3)
149+
; CHECK-NEXT: fld.d $fa6, $a0, %pc_lo12(.LCPI5_3)
158150
; CHECK-NEXT: lu12i.w $a1, 262688
159151
; CHECK-NEXT: lu12i.w $a3, 262720
160152
; CHECK-NEXT: lu12i.w $a5, 262752

0 commit comments

Comments
 (0)