diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2013-07-23 01:48:05 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2013-07-23 01:48:05 +0000 |
commit | acfeebf883d44d9592d7beb78a809a7f72ae9917 (patch) | |
tree | 1a16b15d69ed2b60078b91931059196b990dfd44 /llvm/lib | |
parent | 78e012969c9eea253abae8192203a4234fd1b507 (diff) | |
download | bcm5719-llvm-acfeebf883d44d9592d7beb78a809a7f72ae9917.tar.gz bcm5719-llvm-acfeebf883d44d9592d7beb78a809a7f72ae9917.zip |
R600: Use the same compute kernel calling convention for all GPUs
A side-effect of this is that now the compiler expects kernel arguments
to be 4-byte aligned.
Reviewed-by: Vincent Lejeune <vljn at ovi.com>
llvm-svn: 186916
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/R600/AMDGPUCallingConv.td | 16 | ||||
-rw-r--r-- | llvm/lib/Target/R600/AMDGPUISelLowering.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Target/R600/R600ISelLowering.cpp | 21 |
3 files changed, 27 insertions, 11 deletions
diff --git a/llvm/lib/Target/R600/AMDGPUCallingConv.td b/llvm/lib/Target/R600/AMDGPUCallingConv.td index 29a0326143b..5c9a3e425dd 100644 --- a/llvm/lib/Target/R600/AMDGPUCallingConv.td +++ b/llvm/lib/Target/R600/AMDGPUCallingConv.td @@ -36,9 +36,9 @@ def CC_SI : CallingConv<[ ]>; -// Calling convention for SI compute kernels -def CC_SI_Kernel : CallingConv<[ - CCIfType<[v4i32, v4f32], CCAssignToStack <16, 4>>, +// Calling convention for compute kernels +def CC_AMDGPU_Kernel : CallingConv<[ + CCIfType<[v4i32, v4f32], CCAssignToStack <16, 16>>, CCIfType<[i64, f64], CCAssignToStack < 8, 4>>, CCIfType<[i32, f32], CCAssignToStack < 4, 4>>, CCIfType<[i16], CCAssignToStack < 2, 4>>, @@ -46,8 +46,14 @@ def CC_SI_Kernel : CallingConv<[ ]>; def CC_AMDGPU : CallingConv<[ - CCIf<"State.getMachineFunction().getInfo<SIMachineFunctionInfo>()->"# - "ShaderType == ShaderType::COMPUTE", CCDelegateTo<CC_SI_Kernel>>, + CCIf<"State.getTarget().getSubtarget<AMDGPUSubtarget>().getGeneration() == " + "AMDGPUSubtarget::SOUTHERN_ISLANDS && " + "State.getMachineFunction().getInfo<SIMachineFunctionInfo>()->"# + "ShaderType == ShaderType::COMPUTE", CCDelegateTo<CC_AMDGPU_Kernel>>, + CCIf<"State.getTarget().getSubtarget<AMDGPUSubtarget>().getGeneration() < " + "AMDGPUSubtarget::SOUTHERN_ISLANDS && " + "State.getMachineFunction().getInfo<R600MachineFunctionInfo>()->" + "ShaderType == ShaderType::COMPUTE", CCDelegateTo<CC_AMDGPU_Kernel>>, CCIf<"State.getTarget().getSubtarget<AMDGPUSubtarget>()"# ".getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS", CCDelegateTo<CC_SI>> ]>; diff --git a/llvm/lib/Target/R600/AMDGPUISelLowering.cpp b/llvm/lib/Target/R600/AMDGPUISelLowering.cpp index d74d9f89c37..c90176b8f88 100644 --- a/llvm/lib/Target/R600/AMDGPUISelLowering.cpp +++ b/llvm/lib/Target/R600/AMDGPUISelLowering.cpp @@ -18,6 +18,7 @@ #include "AMDGPURegisterInfo.h" #include "AMDGPUSubtarget.h" #include "AMDILIntrinsicInfo.h" +#include "R600MachineFunctionInfo.h" #include "SIMachineFunctionInfo.h" #include "llvm/CodeGen/CallingConvLower.h" #include "llvm/CodeGen/MachineFunction.h" diff --git a/llvm/lib/Target/R600/R600ISelLowering.cpp b/llvm/lib/Target/R600/R600ISelLowering.cpp index ac4a81c9ac5..7f93f23f280 100644 --- a/llvm/lib/Target/R600/R600ISelLowering.cpp +++ b/llvm/lib/Target/R600/R600ISelLowering.cpp @@ -16,6 +16,7 @@ #include "R600Defines.h" #include "R600InstrInfo.h" #include "R600MachineFunctionInfo.h" +#include "llvm/CodeGen/CallingConvLower.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineRegisterInfo.h" @@ -1212,11 +1213,17 @@ SDValue R600TargetLowering::LowerFormalArguments( const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc DL, SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals) const { - unsigned ParamOffsetBytes = 36; + SmallVector<CCValAssign, 16> ArgLocs; + CCState CCInfo(CallConv, isVarArg, DAG.getMachineFunction(), + getTargetMachine(), ArgLocs, *DAG.getContext()); + + AnalyzeFormalArguments(CCInfo, Ins); + Function::const_arg_iterator FuncArg = DAG.getMachineFunction().getFunction()->arg_begin(); for (unsigned i = 0, e = Ins.size(); i < e; ++i, ++FuncArg) { - EVT VT = Ins[i].VT; + CCValAssign &VA = ArgLocs[i]; + EVT VT = VA.getLocVT(); Type *ArgType = FuncArg->getType(); unsigned ArgSizeInBits = ArgType->isPointerTy() ? 32 : ArgType->getPrimitiveSizeInBits(); @@ -1239,12 +1246,14 @@ SDValue R600TargetLowering::LowerFormalArguments( PointerType *PtrTy = PointerType::get(VT.getTypeForEVT(*DAG.getContext()), AMDGPUAS::PARAM_I_ADDRESS); + + // The first 36 bytes of the input buffer contains information about + // thread group and global sizes. SDValue Arg = DAG.getExtLoad(LoadType, DL, VT, DAG.getRoot(), - DAG.getConstant(ParamOffsetBytes, MVT::i32), - MachinePointerInfo(UndefValue::get(PtrTy)), - ArgVT, false, false, ArgBytes); + DAG.getConstant(36 + VA.getLocMemOffset(), MVT::i32), + MachinePointerInfo(UndefValue::get(PtrTy)), + ArgVT, false, false, ArgBytes); InVals.push_back(Arg); - ParamOffsetBytes += ArgBytes; } return Chain; } |