summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2017-08-03 23:12:44 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2017-08-03 23:12:44 +0000
commit817c253e60c50b897238a9831034c37d9d352b81 (patch)
tree10c9b2782aebe1281041109c3e4671220f7d3103 /llvm/lib/Target/AMDGPU/SIISelLowering.cpp
parent346a5fdc9bc09b87c486e62712eca9c90869c396 (diff)
downloadbcm5719-llvm-817c253e60c50b897238a9831034c37d9d352b81.tar.gz
bcm5719-llvm-817c253e60c50b897238a9831034c37d9d352b81.zip
AMDGPU: Fix implicitarg.ptr handling special inputs
llvm-svn: 310002
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIISelLowering.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/SIISelLowering.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 5a53d7914c0..da7d04bad25 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -1195,6 +1195,9 @@ static void allocateSpecialInputSGPRs(CCState &CCInfo,
if (Info.hasWorkGroupIDZ())
ArgInfo.WorkGroupIDZ = allocateSGPR32Input(CCInfo);
+
+ if (Info.hasImplicitArgPtr())
+ ArgInfo.ImplicitArgPtr = allocateSGPR64Input(CCInfo);
}
// Allocate special inputs passed in user SGPRs.
@@ -1914,7 +1917,8 @@ void SITargetLowering::passSpecialInputs(
AMDGPUFunctionArgInfo::WORKGROUP_ID_Z,
AMDGPUFunctionArgInfo::WORKITEM_ID_X,
AMDGPUFunctionArgInfo::WORKITEM_ID_Y,
- AMDGPUFunctionArgInfo::WORKITEM_ID_Z
+ AMDGPUFunctionArgInfo::WORKITEM_ID_Z,
+ AMDGPUFunctionArgInfo::IMPLICIT_ARG_PTR
};
for (auto InputID : InputRegs) {
@@ -1933,7 +1937,17 @@ void SITargetLowering::passSpecialInputs(
// All special arguments are ints for now.
EVT ArgVT = TRI->getSpillSize(*ArgRC) == 8 ? MVT::i64 : MVT::i32;
- SDValue InputReg = loadInputValue(DAG, ArgRC, ArgVT, DL, *IncomingArg);
+ SDValue InputReg;
+
+ if (IncomingArg) {
+ InputReg = loadInputValue(DAG, ArgRC, ArgVT, DL, *IncomingArg);
+ } else {
+ // The implicit arg ptr is special because it doesn't have a corresponding
+ // input for kernels, and is computed from the kernarg segment pointer.
+ assert(InputID == AMDGPUFunctionArgInfo::IMPLICIT_ARG_PTR);
+ InputReg = getImplicitArgPtr(DAG, DL);
+ }
+
if (OutgoingArg->isRegister()) {
RegsToPass.emplace_back(OutgoingArg->getRegister(), InputReg);
} else {
@@ -3662,7 +3676,8 @@ SDValue SITargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
case Intrinsic::amdgcn_implicitarg_ptr: {
if (MFI->isEntryFunction())
return getImplicitArgPtr(DAG, DL);
- report_fatal_error("amdgcn.implicitarg.ptr not implemented for functions");
+ return getPreloadedValue(DAG, *MFI, VT,
+ AMDGPUFunctionArgInfo::IMPLICIT_ARG_PTR);
}
case Intrinsic::amdgcn_kernarg_segment_ptr: {
return getPreloadedValue(DAG, *MFI, VT,
OpenPOWER on IntegriCloud