Skip to content

Commit 4191de2

Browse files
committed
[RISCV] Don't emit LUI/ADDI MachineSDNodes from getAddr
Instead add RISCVISD opcodes that will be selected to LUI/ADDI during isel. I'm looking into maybe moving doPeepholeLoadStoreADDI into isel. Having the ADDI as a RISCVISD node will make it visible to isel. Reviewed By: reames Differential Revision: https://reviews.llvm.org/D127713
1 parent e6c7a3a commit 4191de2

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,8 +3631,8 @@ SDValue RISCVTargetLowering::getAddr(NodeTy *N, SelectionDAG &DAG,
36313631
// address space. This generates the pattern (addi (lui %hi(sym)) %lo(sym)).
36323632
SDValue AddrHi = getTargetNode(N, DL, Ty, DAG, RISCVII::MO_HI);
36333633
SDValue AddrLo = getTargetNode(N, DL, Ty, DAG, RISCVII::MO_LO);
3634-
SDValue MNHi = SDValue(DAG.getMachineNode(RISCV::LUI, DL, Ty, AddrHi), 0);
3635-
return SDValue(DAG.getMachineNode(RISCV::ADDI, DL, Ty, MNHi, AddrLo), 0);
3634+
SDValue MNHi = DAG.getNode(RISCVISD::HI, DL, Ty, AddrHi);
3635+
return DAG.getNode(RISCVISD::ADD_LO, DL, Ty, MNHi, AddrLo);
36363636
}
36373637
case CodeModel::Medium: {
36383638
// Generate a sequence for accessing addresses within any 2GiB range within
@@ -11113,6 +11113,8 @@ const char *RISCVTargetLowering::getTargetNodeName(unsigned Opcode) const {
1111311113
NODE_NAME_CASE(BuildPairF64)
1111411114
NODE_NAME_CASE(SplitF64)
1111511115
NODE_NAME_CASE(TAIL)
11116+
NODE_NAME_CASE(ADD_LO)
11117+
NODE_NAME_CASE(HI)
1111611118
NODE_NAME_CASE(MULHSU)
1111711119
NODE_NAME_CASE(SLLW)
1111811120
NODE_NAME_CASE(SRAW)

llvm/lib/Target/RISCV/RISCVISelLowering.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ enum NodeType : unsigned {
4141
BuildPairF64,
4242
SplitF64,
4343
TAIL,
44+
45+
// Add the Lo 12 bits from an address. Selected to ADDI.
46+
ADD_LO,
47+
// Get the Hi 20 bits from an address. Selected to LUI.
48+
HI,
49+
4450
// Multiply high for signedxunsigned.
4551
MULHSU,
4652
// RV64I shifts, directly matching the semantics of the named RISC-V

llvm/lib/Target/RISCV/RISCVInstrInfo.td

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ def riscv_read_cycle_wide : SDNode<"RISCVISD::READ_CYCLE_WIDE",
8383
SDT_RISCVReadCycleWide,
8484
[SDNPHasChain, SDNPSideEffect]>;
8585

86+
def riscv_add_lo : SDNode<"RISCVISD::ADD_LO", SDTIntBinOp>;
87+
def riscv_hi : SDNode<"RISCVISD::HI", SDTIntUnaryOp>;
88+
8689
//===----------------------------------------------------------------------===//
8790
// Operand and SDNode transformation definitions.
8891
//===----------------------------------------------------------------------===//
@@ -1207,6 +1210,22 @@ def PseudoAddTPRel : Pseudo<(outs GPR:$rd),
12071210
def : Pat<(FrameAddrRegImm GPR:$rs1, simm12:$imm12),
12081211
(ADDI GPR:$rs1, simm12:$imm12)>;
12091212

1213+
// HI and ADD_LO address nodes.
1214+
1215+
def : Pat<(riscv_hi tglobaladdr:$in), (LUI tglobaladdr:$in)>;
1216+
def : Pat<(riscv_hi tblockaddress:$in), (LUI tblockaddress:$in)>;
1217+
def : Pat<(riscv_hi tjumptable:$in), (LUI tjumptable:$in)>;
1218+
def : Pat<(riscv_hi tconstpool:$in), (LUI tconstpool:$in)>;
1219+
1220+
def : Pat<(riscv_add_lo GPR:$hi, tglobaladdr:$lo),
1221+
(ADDI GPR:$hi, tglobaladdr:$lo)>;
1222+
def : Pat<(riscv_add_lo GPR:$hi, tblockaddress:$lo),
1223+
(ADDI GPR:$hi, tblockaddress:$lo)>;
1224+
def : Pat<(riscv_add_lo GPR:$hi, tjumptable:$lo),
1225+
(ADDI GPR:$hi, tjumptable:$lo)>;
1226+
def : Pat<(riscv_add_lo GPR:$hi, tconstpool:$lo),
1227+
(ADDI GPR:$hi, tconstpool:$lo)>;
1228+
12101229
/// Setcc
12111230

12121231
def : PatGprGpr<setlt, SLT>;

0 commit comments

Comments
 (0)