diff options
| author | Scott Linder <scott@scottlinder.com> | 2019-02-04 20:00:07 +0000 | 
|---|---|---|
| committer | Scott Linder <scott@scottlinder.com> | 2019-02-04 20:00:07 +0000 | 
| commit | d19d1972217bd0da7ba2ecad77d257a23be83096 (patch) | |
| tree | 9568feb490f1715d8f042c0acdd0f2483638a0b0 /llvm/lib | |
| parent | 70560a0a2cce07901811e1d0f298a815c9b110d0 (diff) | |
| download | bcm5719-llvm-d19d1972217bd0da7ba2ecad77d257a23be83096.tar.gz bcm5719-llvm-d19d1972217bd0da7ba2ecad77d257a23be83096.zip | |
[AMDGPU] Support emitting GOT relocations for function calls
Differential Revision: https://reviews.llvm.org/D57416
llvm-svn: 353083
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.td | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 36 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIInstructions.td | 20 | 
3 files changed, 20 insertions, 41 deletions
| diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.td b/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.td index 73ae5de76b2..ba924b1f63a 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.td +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.td @@ -69,8 +69,6 @@ def AMDGPUAddeSubeOp : SDTypeProfile<2, 3,    [SDTCisSameAs<0, 2>, SDTCisSameAs<0, 3>, SDTCisVT<0, i32>, SDTCisVT<1, i1>, SDTCisVT<4, i1>]  >; -def SDT_AMDGPUTCRET : SDTypeProfile<0, 2, [SDTCisPtrTy<0>]>; -  //===----------------------------------------------------------------------===//  // AMDGPU DAG Nodes  // @@ -95,7 +93,8 @@ def AMDGPUcall : SDNode<"AMDGPUISD::CALL",    SDNPVariadic]  >; -def AMDGPUtc_return: SDNode<"AMDGPUISD::TC_RETURN", SDT_AMDGPUTCRET, +def AMDGPUtc_return: SDNode<"AMDGPUISD::TC_RETURN", +  SDTypeProfile<0, 3, [SDTCisPtrTy<0>]>,    [SDNPHasChain, SDNPOptInGlue, SDNPVariadic]  >; diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index 34643c99e11..94d2853bad1 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -2711,6 +2711,11 @@ SDValue SITargetLowering::LowerCall(CallLoweringInfo &CLI,    std::vector<SDValue> Ops;    Ops.push_back(Chain);    Ops.push_back(Callee); +  // Add a redundant copy of the callee global which will not be legalized, as +  // we need direct access to the callee later. +  GlobalAddressSDNode *GSD = cast<GlobalAddressSDNode>(Callee); +  const GlobalValue *GV = GSD->getGlobal(); +  Ops.push_back(DAG.getTargetGlobalAddress(GV, DL, MVT::i64));    if (IsTailCall) {      // Each tail call may have to adjust the stack by a different amount, so @@ -3474,34 +3479,16 @@ MachineBasicBlock *SITargetLowering::EmitInstrWithCustomInserter(          .addReg(Info->getFrameOffsetReg(), RegState::Implicit);      return BB;    } -  case AMDGPU::SI_CALL_ISEL: -  case AMDGPU::SI_TCRETURN_ISEL: { +  case AMDGPU::SI_CALL_ISEL: {      const SIInstrInfo *TII = getSubtarget()->getInstrInfo();      const DebugLoc &DL = MI.getDebugLoc(); -    unsigned ReturnAddrReg = TII->getRegisterInfo().getReturnAddressReg(*MF); -    MachineRegisterInfo &MRI = MF->getRegInfo(); -    unsigned GlobalAddrReg = MI.getOperand(0).getReg(); -    MachineInstr *PCRel = MRI.getVRegDef(GlobalAddrReg); -    assert(PCRel->getOpcode() == AMDGPU::SI_PC_ADD_REL_OFFSET); - -    const GlobalValue *G = PCRel->getOperand(1).getGlobal(); +    unsigned ReturnAddrReg = TII->getRegisterInfo().getReturnAddressReg(*MF);      MachineInstrBuilder MIB; -    if (MI.getOpcode() == AMDGPU::SI_CALL_ISEL) { -      MIB = BuildMI(*BB, MI, DL, TII->get(AMDGPU::SI_CALL), ReturnAddrReg) -        .add(MI.getOperand(0)) -        .addGlobalAddress(G); -    } else { -      MIB = BuildMI(*BB, MI, DL, TII->get(AMDGPU::SI_TCRETURN)) -        .add(MI.getOperand(0)) -        .addGlobalAddress(G); - -      // There is an additional imm operand for tcreturn, but it should be in the -      // right place already. -    } +    MIB = BuildMI(*BB, MI, DL, TII->get(AMDGPU::SI_CALL), ReturnAddrReg); -    for (unsigned I = 1, E = MI.getNumOperands(); I != E; ++I) +    for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I)        MIB.add(MI.getOperand(I));      MIB.cloneMemRefs(MI); @@ -4008,7 +3995,10 @@ bool SITargetLowering::shouldEmitFixup(const GlobalValue *GV) const {  }  bool SITargetLowering::shouldEmitGOTReloc(const GlobalValue *GV) const { -  return (GV->getType()->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS || +  // FIXME: Either avoid relying on address space here or change the default +  // address space for functions to avoid the explicit check. +  return (GV->getValueType()->isFunctionTy() || +          GV->getType()->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS ||            GV->getType()->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS ||            GV->getType()->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT) &&           !shouldEmitFixup(GV) && diff --git a/llvm/lib/Target/AMDGPU/SIInstructions.td b/llvm/lib/Target/AMDGPU/SIInstructions.td index 61a3e9268df..9b99d1bc3ff 100644 --- a/llvm/lib/Target/AMDGPU/SIInstructions.td +++ b/llvm/lib/Target/AMDGPU/SIInstructions.td @@ -373,7 +373,8 @@ def SI_RETURN : SPseudoInstSI <  // This version is only needed so we can fill in the output regiter in  // the custom inserter.  def SI_CALL_ISEL : SPseudoInstSI < -  (outs), (ins SSrc_b64:$src0), [(AMDGPUcall i64:$src0)]> { +  (outs), (ins SSrc_b64:$src0, unknown:$callee), +  [(AMDGPUcall i64:$src0, tglobaladdr:$callee)]> {    let Size = 4;    let isCall = 1;    let SchedRW = [WriteBranch]; @@ -391,20 +392,9 @@ def SI_CALL : SPseudoInstSI <  }  // Tail call handling pseudo -def SI_TCRETURN_ISEL : SPseudoInstSI<(outs), -  (ins SSrc_b64:$src0, i32imm:$fpdiff), -  [(AMDGPUtc_return i64:$src0, i32:$fpdiff)]> { -  let isCall = 1; -  let isTerminator = 1; -  let isReturn = 1; -  let isBarrier = 1; -  let SchedRW = [WriteBranch]; -  let usesCustomInserter = 1; -} - -def SI_TCRETURN : SPseudoInstSI < -  (outs), -  (ins SSrc_b64:$src0, unknown:$callee, i32imm:$fpdiff)> { +def SI_TCRETURN : SPseudoInstSI <(outs), +  (ins SSrc_b64:$src0, unknown:$callee, i32imm:$fpdiff), +  [(AMDGPUtc_return i64:$src0, tglobaladdr:$callee, i32:$fpdiff)]> {    let Size = 4;    let isCall = 1;    let isTerminator = 1; | 

