diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp index 80f062b7daa..180101559b2 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp @@ -18,6 +18,7 @@ #include "AMDGPURegisterInfo.h" #include "AMDGPUSubtarget.h" #include "AMDGPUTargetMachine.h" +#include "SIMachineFunctionInfo.h" #include "MCTargetDesc/AMDGPUMCTargetDesc.h" #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" #include "llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h" @@ -181,6 +182,26 @@ bool AMDGPUInstructionSelector::selectG_INTRINSIC(MachineInstr &I, break; case Intrinsic::amdgcn_cvt_pkrtz: return selectImpl(I, CoverageInfo); + + case Intrinsic::amdgcn_kernarg_segment_ptr: { + MachineFunction *MF = I.getParent()->getParent(); + MachineRegisterInfo &MRI = MF->getRegInfo(); + const SIMachineFunctionInfo *MFI = MF->getInfo<SIMachineFunctionInfo>(); + const ArgDescriptor *InputPtrReg; + const TargetRegisterClass *RC; + const DebugLoc &DL = I.getDebugLoc(); + + std::tie(InputPtrReg, RC) + = MFI->getPreloadedValue(AMDGPUFunctionArgInfo::KERNARG_SEGMENT_PTR); + if (!InputPtrReg) + report_fatal_error("missing kernarg segment ptr"); + + BuildMI(*I.getParent(), &I, DL, TII.get(AMDGPU::COPY)) + .add(I.getOperand(0)) + .addReg(MRI.getLiveInVirtReg(InputPtrReg->getRegister())); + I.eraseFromParent(); + return true; + } } return false; } |