[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