diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-06-25 16:17:48 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2018-06-25 16:17:48 +0000 |
commit | b1cc4f52ff0fbec69064ad72a3527dc0406ac03b (patch) | |
tree | 7f61fa7b3db597712eff5715b5144ef38704daa4 /llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp | |
parent | 1c79e4e9592a7543f5ecf302c6d1e59dfea58671 (diff) | |
download | bcm5719-llvm-b1cc4f52ff0fbec69064ad72a3527dc0406ac03b.tar.gz bcm5719-llvm-b1cc4f52ff0fbec69064ad72a3527dc0406ac03b.zip |
AMDGPU/GlobalISel: Add support for llvm.amdgcn.kernarg.segment.ptr
Note a normal select test is not currently possible because this
relies on input registers tracked in SIMachineFunctionInfo which
are not currently serializable in MIR, but this does work end-to-end
from the IR.
llvm-svn: 335490
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; } |