diff --git a/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp b/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp index 5aa66b3780b86..ef85057ba1264 100644 --- a/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp +++ b/llvm/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp @@ -131,6 +131,8 @@ class RISCVInstructionSelector : public InstructionSelector { int OpIdx) const; void renderImm(MachineInstrBuilder &MIB, const MachineInstr &MI, int OpIdx) const; + void renderFrameIndex(MachineInstrBuilder &MIB, const MachineInstr &MI, + int OpIdx) const; void renderTrailingZeros(MachineInstrBuilder &MIB, const MachineInstr &MI, int OpIdx) const; @@ -715,14 +717,6 @@ bool RISCVInstructionSelector::select(MachineInstr &MI) { MI.setDesc(TII.get(RISCV::PseudoBRIND)); MI.addOperand(MachineOperand::CreateImm(0)); return constrainSelectedInstRegOperands(MI, TII, TRI, RBI); - case TargetOpcode::G_FRAME_INDEX: { - // TODO: We may want to replace this code with the SelectionDAG patterns, - // which fail to get imported because it uses FrameAddrRegImm, which is a - // ComplexPattern - MI.setDesc(TII.get(RISCV::ADDI)); - MI.addOperand(MachineOperand::CreateImm(0)); - return constrainSelectedInstRegOperands(MI, TII, TRI, RBI); - } case TargetOpcode::G_SELECT: return selectSelect(MI, MIB); case TargetOpcode::G_FCMP: @@ -859,6 +853,14 @@ void RISCVInstructionSelector::renderImm(MachineInstrBuilder &MIB, MIB.addImm(CstVal); } +void RISCVInstructionSelector::renderFrameIndex(MachineInstrBuilder &MIB, + const MachineInstr &MI, + int OpIdx) const { + assert(MI.getOpcode() == TargetOpcode::G_FRAME_INDEX && OpIdx == -1 && + "Expected G_FRAME_INDEX"); + MIB.add(MI.getOperand(1)); +} + void RISCVInstructionSelector::renderTrailingZeros(MachineInstrBuilder &MIB, const MachineInstr &MI, int OpIdx) const { diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index b33d58d177457..0070fd4520429 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -2531,29 +2531,6 @@ bool RISCVDAGToDAGISel::SelectAddrFrameIndex(SDValue Addr, SDValue &Base, return false; } -// Select a frame index and an optional immediate offset from an ADD or OR. -bool RISCVDAGToDAGISel::SelectFrameAddrRegImm(SDValue Addr, SDValue &Base, - SDValue &Offset) { - if (SelectAddrFrameIndex(Addr, Base, Offset)) - return true; - - if (!CurDAG->isBaseWithConstantOffset(Addr)) - return false; - - if (auto *FIN = dyn_cast(Addr.getOperand(0))) { - int64_t CVal = cast(Addr.getOperand(1))->getSExtValue(); - if (isInt<12>(CVal)) { - Base = CurDAG->getTargetFrameIndex(FIN->getIndex(), - Subtarget->getXLenVT()); - Offset = CurDAG->getSignedTargetConstant(CVal, SDLoc(Addr), - Subtarget->getXLenVT()); - return true; - } - } - - return false; -} - // Fold constant addresses. static bool selectConstantAddr(SelectionDAG *CurDAG, const SDLoc &DL, const MVT VT, const RISCVSubtarget *Subtarget, diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h index e75aff7eda993..592f517358506 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h @@ -46,7 +46,6 @@ class RISCVDAGToDAGISel : public SelectionDAGISel { std::vector &OutOps) override; bool SelectAddrFrameIndex(SDValue Addr, SDValue &Base, SDValue &Offset); - bool SelectFrameAddrRegImm(SDValue Addr, SDValue &Base, SDValue &Offset); bool SelectAddrRegImm(SDValue Addr, SDValue &Base, SDValue &Offset, bool IsRV32Zdinx = false); bool SelectAddrRegImmRV32Zdinx(SDValue Addr, SDValue &Base, SDValue &Offset) { diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index 3cb8a2dae5470..1260f99ad9dcd 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -400,9 +400,6 @@ def uimm6gt32 : ImmLeaf; // Addressing modes. -// Necessary because a frameindex can't be matched directly in a pattern. -def FrameAddrRegImm : ComplexPattern; def AddrRegImm : ComplexPattern; // Return the negation of an immediate value. @@ -1401,8 +1398,19 @@ def PseudoAddTPRel : Pseudo<(outs GPR:$rd), /// FrameIndex calculations -def : Pat<(FrameAddrRegImm (iPTR GPR:$rs1), simm12:$imm12), - (ADDI GPR:$rs1, simm12:$imm12)>; +// Transforms frameindex -> tframeindex. +def to_tframeindex : SDNodeXFormgetTargetFrameIndex(N->getIndex(), N->getValueType(0)); +}]>; + +def : GICustomOperandRenderer<"renderFrameIndex">, + GISDNodeXFormEquiv; + +def : Pat<(frameindex:$fi), (ADDI (iPTR (to_tframeindex $fi)), 0)>; + +def : Pat<(add_like frameindex:$fi, simm12:$offset), + (ADDI (iPTR (to_tframeindex $fi)), simm12:$offset)>; + def GIAddrRegImm : GIComplexOperandMatcher, GIComplexPatternEquiv;