[llvm-commits] MIPS patch

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Fri Apr 1 23:13:36 PDT 2011


LGTM! :)

On Fri, Apr 1, 2011 at 7:36 PM, Akira Hatanaka <ahatanak at gmail.com> wrote:
> This patch moves transformation of JmpLink and related nodes done during
> instruction selection to Legalize.
>
> Index: lib/Target/Mips/MipsISelDAGToDAG.cpp
> ===================================================================
> --- lib/Target/Mips/MipsISelDAGToDAG.cpp  (revision 128742)
> +++ lib/Target/Mips/MipsISelDAGToDAG.cpp  (working copy)
> @@ -122,7 +122,8 @@
>      if ((Addr.getOpcode() == ISD::TargetGlobalAddress) ||
>          (Addr.getOpcode() == ISD::TargetConstantPool) ||
>          (Addr.getOpcode() == ISD::TargetJumpTable) ||
> -        (Addr.getOpcode() == ISD::TargetBlockAddress)) {
> +        (Addr.getOpcode() == ISD::TargetBlockAddress) ||
> +        (Addr.getOpcode() == ISD::TargetExternalSymbol)) {
>        Base   = CurDAG->getRegister(Mips::GP, MVT::i32);
>        Offset = Addr;
>        return true;
> @@ -444,61 +445,6 @@
>          return ResNode;
>        // Other cases are autogenerated.
>        break;
> -
> -    /// Handle direct and indirect calls when using PIC. On PIC, when
> -    /// GOT is smaller than about 64k (small code) the GA target is
> -    /// loaded with only one instruction. Otherwise GA's target must
> -    /// be loaded with 3 instructions.
> -    case MipsISD::JmpLink: {
> -      if (TM.getRelocationModel() == Reloc::PIC_) {
> -        unsigned LastOpNum = Node->getNumOperands()-1;
> -
> -        SDValue Chain  = Node->getOperand(0);
> -        SDValue Callee = Node->getOperand(1);
> -        SDValue InFlag;
> -
> -        // Skip the incomming flag if present
> -        if (Node->getOperand(LastOpNum).getValueType() == MVT::Glue)
> -          LastOpNum--;
> -
> -        if ( (isa<GlobalAddressSDNode>(Callee)) ||
> -             (isa<ExternalSymbolSDNode>(Callee)) )
> -        {
> -          /// Direct call for global addresses and external symbols
> -          SDValue GPReg = CurDAG->getRegister(Mips::GP, MVT::i32);
> -
> -          // Use load to get GOT target
> -          SDValue Ops[] = { Callee, GPReg, Chain };
> -          SDValue Load = SDValue(CurDAG->getMachineNode(Mips::LW, dl,
> MVT::i32,
> -                                     MVT::Other, Ops, 3), 0);
> -          Chain = Load.getValue(1);
> -
> -          // Call target must be on T9
> -          Chain = CurDAG->getCopyToReg(Chain, dl, Mips::T9, Load, InFlag);
> -        } else
> -          /// Indirect call
> -          Chain = CurDAG->getCopyToReg(Chain, dl, Mips::T9, Callee,
> InFlag);
> -
> -        // Map the JmpLink operands to JALR
> -        SDVTList NodeTys = CurDAG->getVTList(MVT::Other, MVT::Glue);
> -        SmallVector<SDValue, 8> Ops;
> -        Ops.push_back(CurDAG->getRegister(Mips::T9, MVT::i32));
> -
> -        for (unsigned i = 2, e = LastOpNum+1; i != e; ++i)
> -          Ops.push_back(Node->getOperand(i));
> -        Ops.push_back(Chain);
> -        Ops.push_back(Chain.getValue(1));
> -
> -        // Emit Jump and Link Register
> -        SDNode *ResNode = CurDAG->getMachineNode(Mips::JALR, dl, NodeTys,
> -                                  &Ops[0], Ops.size());
> -
> -        // Replace Chain and InFlag
> -        ReplaceUses(SDValue(Node, 0), SDValue(ResNode, 0));
> -        ReplaceUses(SDValue(Node, 1), SDValue(ResNode, 1));
> -        return ResNode;
> -      }
> -    }
>    }
>
>    // Select the default instruction
> Index: lib/Target/Mips/MipsISelLowering.cpp
> ===================================================================
> --- lib/Target/Mips/MipsISelLowering.cpp  (revision 128741)
> +++ lib/Target/Mips/MipsISelLowering.cpp  (working copy)
> @@ -1201,13 +1201,35 @@
>    // direct call is) turn it into a
> TargetGlobalAddress/TargetExternalSymbol
>    // node so that legalize doesn't hack it.
>    unsigned char OpFlag = IsPIC ? MipsII::MO_GOT_CALL : MipsII::MO_NO_FLAG;
> -  if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
> +  bool LoadSymAddr = false;
> +
> +  if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
>      Callee = DAG.getTargetGlobalAddress(G->getGlobal(), dl,
> -                                getPointerTy(), 0, OpFlag);
> -  else if (ExternalSymbolSDNode *S =
> dyn_cast<ExternalSymbolSDNode>(Callee))
> +                                        getPointerTy(), 0, OpFlag);
> +    LoadSymAddr = true;
> +  }
> +  else if (ExternalSymbolSDNode *S =
> dyn_cast<ExternalSymbolSDNode>(Callee)) {
>      Callee = DAG.getTargetExternalSymbol(S->getSymbol(),
>                                  getPointerTy(), OpFlag);
> +    LoadSymAddr = true;
> +  }
>
> +  // Create nodes that load address of callee and copy it to T9
> +  if (IsPIC) {
> +    if (LoadSymAddr) {
> +      // load callee address
> +      Callee = DAG.getLoad(MVT::i32, dl, Chain, Callee,
> +                                        MachinePointerInfo::getGOT(),
> +                                        false, false, 0);
> +      Chain = Callee.getValue(1);
> +    }
> +
> +    // copy to T9
> +    Chain = DAG.getCopyToReg(Chain, dl, Mips::T9, Callee, SDValue(0, 0));
> +    InFlag = Chain.getValue(1);
> +    Callee = DAG.getRegister(Mips::T9, MVT::i32);
> +  }
> +
>    // MipsJmpLink = #chain, #target_address, #opt_in_flags...
>    //             = Chain, Callee, Reg#1, Reg#2, ...
>    //
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>



-- 
Bruno Cardoso Lopes
http://www.brunocardoso.cc




More information about the llvm-commits mailing list