Skip to content

Commit 45e425e

Browse files
authored
AMDGPU: Teach isArgPassedInSGPR() about cs_chain* calling convention (#67086)
This cs_chain and cs_chain_preserve use InReg attribute to indicate argument passed through SGPR.
1 parent 72e3713 commit 45e425e

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2531,6 +2531,8 @@ bool isArgPassedInSGPR(const Argument *A) {
25312531
case CallingConv::AMDGPU_PS:
25322532
case CallingConv::AMDGPU_CS:
25332533
case CallingConv::AMDGPU_Gfx:
2534+
case CallingConv::AMDGPU_CS_Chain:
2535+
case CallingConv::AMDGPU_CS_ChainPreserve:
25342536
// For non-compute shaders, SGPR inputs are marked with either inreg or
25352537
// byval. Everything else is in VGPRs.
25362538
return A->hasAttribute(Attribute::InReg) ||
@@ -2556,6 +2558,8 @@ bool isArgPassedInSGPR(const CallBase *CB, unsigned ArgNo) {
25562558
case CallingConv::AMDGPU_PS:
25572559
case CallingConv::AMDGPU_CS:
25582560
case CallingConv::AMDGPU_Gfx:
2561+
case CallingConv::AMDGPU_CS_Chain:
2562+
case CallingConv::AMDGPU_CS_ChainPreserve:
25592563
// For non-compute shaders, SGPR inputs are marked with either inreg or
25602564
// byval. Everything else is in VGPRs.
25612565
return CB->paramHasAttr(ArgNo, Attribute::InReg) ||

llvm/test/Analysis/UniformityAnalysis/AMDGPU/kernel-args.ll

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,25 @@ define void @test_c(ptr addrspace(5) byval([4 x <16 x i8>]) %arg0, float inreg %
3636
ret void
3737
}
3838

39+
; CHECK-LABEL: for function 'test_amdgpu_cs_chain':
40+
; CHECK-DAG: DIVERGENT: ptr addrspace(4) %arg0
41+
; CHECK-DAG: DIVERGENT: <2 x i32> %arg3
42+
; CHECK-DAG: DIVERGENT: <3 x i32> %arg4
43+
; CHECK-DAG: DIVERGENT: float %arg5
44+
; CHECK-DAG: DIVERGENT: i32 %arg6
45+
; CHECK-NOT: DIVERGENT
46+
define amdgpu_cs_chain void @test_amdgpu_cs_chain(ptr addrspace(4) byref([4 x <16 x i8>]) %arg0, float inreg %arg1, i32 inreg %arg2, <2 x i32> %arg3, <3 x i32> %arg4, float %arg5, i32 %arg6) #0 {
47+
ret void
48+
}
49+
50+
; CHECK-LABEL: for function 'test_amdgpu_cs_chain_preserve':
51+
; CHECK-DAG: DIVERGENT: ptr addrspace(4) %arg0
52+
; CHECK-DAG: DIVERGENT: <2 x i32> %arg3
53+
; CHECK-DAG: DIVERGENT: <3 x i32> %arg4
54+
; CHECK-DAG: DIVERGENT: float %arg5
55+
; CHECK-DAG: DIVERGENT: i32 %arg6
56+
; CHECK-NOT: DIVERGENT
57+
define amdgpu_cs_chain_preserve void @test_amdgpu_cs_chain_preserve(ptr addrspace(4) byref([4 x <16 x i8>]) %arg0, float inreg %arg1, i32 inreg %arg2, <2 x i32> %arg3, <3 x i32> %arg4, float %arg5, i32 %arg6) #0 {
58+
ret void
59+
}
3960
attributes #0 = { nounwind }

0 commit comments

Comments
 (0)