[PATCH] D26578: Introduce TLI predicative for base-relative Jump Tables
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 14 11:54:18 PST 2016
Joerg Sonnenberger <joerg at NetBSD.org> writes:
> joerg created this revision.
> joerg added a reviewer: bogner.
> joerg added a subscriber: llvm-commits.
> joerg set the repository for this revision to rL LLVM.
>
> For 64bit ABIs it is common practice to use relative Jump Tables with
> potentially different relocation bases.
> As the logic for the jump itself doesn't depend on the relocation
> base, make it easier for targets to use the generic logic.
> Start by dropping the now redundant MIPS logic.
Seems pretty straightforward. LGTM.
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D26578
>
> Files:
> include/llvm/Target/TargetLowering.h
> lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> lib/Target/Mips/MipsISelLowering.cpp
> lib/Target/Mips/MipsISelLowering.h
>
> Index: lib/Target/Mips/MipsISelLowering.h
> ===================================================================
> --- lib/Target/Mips/MipsISelLowering.h
> +++ lib/Target/Mips/MipsISelLowering.h
> @@ -296,6 +296,10 @@
> return SrcAS < 256 && DestAS < 256;
> }
>
> + bool isJumpTableRelative() const override {
> + return getTargetMachine().isPositionIndependent() || ABI.IsN64();
> + }
> +
> protected:
> SDValue getGlobalReg(SelectionDAG &DAG, EVT Ty) const;
>
> @@ -426,7 +430,6 @@
> TargetLowering::CallLoweringInfo &CLI) const;
>
> // Lower Operand specifics
> - SDValue lowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
> SDValue lowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
> SDValue lowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
> SDValue lowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
> Index: lib/Target/Mips/MipsISelLowering.cpp
> ===================================================================
> --- lib/Target/Mips/MipsISelLowering.cpp
> +++ lib/Target/Mips/MipsISelLowering.cpp
> @@ -268,7 +268,7 @@
> AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
>
> // Mips Custom Operations
> - setOperationAction(ISD::BR_JT, MVT::Other, Custom);
> + setOperationAction(ISD::BR_JT, MVT::Other, Expand);
> setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
> setOperationAction(ISD::BlockAddress, MVT::i32, Custom);
> setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
> @@ -910,7 +910,6 @@
> {
> switch (Op.getOpcode())
> {
> - case ISD::BR_JT: return lowerBR_JT(Op, DAG);
> case ISD::BRCOND: return lowerBRCOND(Op, DAG);
> case ISD::ConstantPool: return lowerConstantPool(Op, DAG);
> case ISD::GlobalAddress: return lowerGlobalAddress(Op, DAG);
> @@ -1676,40 +1675,6 @@
> return BB;
> }
>
> -//===----------------------------------------------------------------------===//
> -// Misc Lower Operation implementation
> -//===----------------------------------------------------------------------===//
> -SDValue MipsTargetLowering::lowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
> - SDValue Chain = Op.getOperand(0);
> - SDValue Table = Op.getOperand(1);
> - SDValue Index = Op.getOperand(2);
> - SDLoc DL(Op);
> - auto &TD = DAG.getDataLayout();
> - EVT PTy = getPointerTy(TD);
> - unsigned EntrySize =
> - DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(TD);
> -
> - Index = DAG.getNode(ISD::MUL, DL, PTy, Index,
> - DAG.getConstant(EntrySize, DL, PTy));
> - SDValue Addr = DAG.getNode(ISD::ADD, DL, PTy, Index, Table);
> -
> - EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), EntrySize * 8);
> - Addr = DAG.getExtLoad(
> - ISD::SEXTLOAD, DL, PTy, Chain, Addr,
> - MachinePointerInfo::getJumpTable(DAG.getMachineFunction()), MemVT);
> - Chain = Addr.getValue(1);
> -
> - if (isPositionIndependent() || ABI.IsN64()) {
> - // For PIC, the sequence is:
> - // BRIND(load(Jumptable + index) + RelocBase)
> - // RelocBase can be JumpTable, GOT or some sort of global base.
> - Addr = DAG.getNode(ISD::ADD, DL, PTy, Addr,
> - getPICJumpTableRelocBase(Table, DAG));
> - }
> -
> - return DAG.getNode(ISD::BRIND, DL, MVT::Other, Chain, Addr);
> -}
> -
> SDValue MipsTargetLowering::lowerBRCOND(SDValue Op, SelectionDAG &DAG) const {
> // The first operand is the chain, the second is the condition, the third is
> // the block to branch to if the condition is true.
> Index: lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> ===================================================================
> --- lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> +++ lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
> @@ -3566,7 +3566,7 @@
> ISD::SEXTLOAD, dl, PTy, Chain, Addr,
> MachinePointerInfo::getJumpTable(DAG.getMachineFunction()), MemVT);
> Addr = LD;
> - if (TM.isPositionIndependent()) {
> + if (TLI.isJumpTableRelative()) {
> // For PIC, the sequence is:
> // BRIND(load(Jumptable + index) + RelocBase)
> // RelocBase can be JumpTable, GOT or some sort of global base.
> Index: include/llvm/Target/TargetLowering.h
> ===================================================================
> --- include/llvm/Target/TargetLowering.h
> +++ include/llvm/Target/TargetLowering.h
> @@ -1057,6 +1057,10 @@
> /// Zero if no limit.
> unsigned getMaximumJumpTableSize() const;
>
> + virtual bool isJumpTableRelative() const {
> + return TM.isPositionIndependent();
> + }
> +
> /// If a physical register, this specifies the register that
> /// llvm.savestack/llvm.restorestack should save and restore.
> unsigned getStackPointerRegisterToSaveRestore() const {
More information about the llvm-commits
mailing list