Index: lib/Target/AMDGPU/AMDGPUInstructionSelector.h =================================================================== --- lib/Target/AMDGPU/AMDGPUInstructionSelector.h +++ lib/Target/AMDGPU/AMDGPUInstructionSelector.h @@ -15,6 +15,7 @@ #define LLVM_LIB_TARGET_AMDGPU_AMDGPUINSTRUCTIONSELECTOR_H #include "AMDGPU.h" +#include "AMDGPUArgumentUsageInfo.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" @@ -34,6 +35,7 @@ class MachineOperand; class MachineRegisterInfo; class SIInstrInfo; +class SIMachineFunctionInfo; class SIRegisterInfo; class SISubtarget; Index: lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp +++ 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 @@ 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(); + 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; } Index: lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp +++ lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp @@ -480,13 +480,18 @@ break; } case AMDGPU::G_INTRINSIC: { - switch(MI.getOperand(1).getIntrinsicID()) { + switch (MI.getOperand(1).getIntrinsicID()) { default: return getInvalidInstructionMapping(); case Intrinsic::maxnum: case Intrinsic::minnum: case Intrinsic::amdgcn_cvt_pkrtz: return getDefaultMappingVOP(MI); + case Intrinsic::amdgcn_kernarg_segment_ptr: { + unsigned Size = MRI.getType(MI.getOperand(0).getReg()).getSizeInBits(); + OpdsMapping[0] = AMDGPU::getValueMapping(AMDGPU::SGPRRegBankID, Size); + break; + } } break; } Index: test/CodeGen/AMDGPU/GlobalISel/inst-select-amdgcn.kernarg.segment.ptr.mir =================================================================== --- /dev/null +++ test/CodeGen/AMDGPU/GlobalISel/inst-select-amdgcn.kernarg.segment.ptr.mir @@ -0,0 +1,19 @@ +# XFAIL: * +# RUN: llc -march=amdgcn -run-pass=instruction-select -verify-machineinstrs -global-isel %s -o - | FileCheck %s -check-prefixes=GCN + +# FIXME: This requires additional context for what input registers are special inputs not present in MIR. + +--- + +name: kernarg_segment_Ptr +legalized: true +regBankSelected: true + +body: | + bb.0: + %0:vgpr(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.kernarg.segment.ptr) + %1:sgpr(s32) = G_LOAD %0 :: (load 4) + %2:vgpr(p1) = G_IMPLICIT_DEF + G_STORE %1, %2 :: (store 4) +... +--- Index: test/CodeGen/AMDGPU/GlobalISel/regbankselect-amdgcn.kernarg.segment.ptr.mir =================================================================== --- /dev/null +++ test/CodeGen/AMDGPU/GlobalISel/regbankselect-amdgcn.kernarg.segment.ptr.mir @@ -0,0 +1,14 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s +# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-greedy | FileCheck %s + +--- +name: kernarg_segment_ptr +legalized: true + +body: | + bb.0: + ; CHECK-LABEL: name: kernarg_segment_ptr + ; CHECK: [[INT:%[0-9]+]]:sgpr(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.kernarg.segment.ptr) + %2:_(p4) = G_INTRINSIC intrinsic(@llvm.amdgcn.kernarg.segment.ptr) +...