@@ -106,3 +106,149 @@ entry:
106106 store i32 %val2 , ptr addrspace (1 ) null
107107 ret void
108108}
109+
110+ ; MIR-LABEL: name: kernarg_preload_with_dispatch_ptr
111+ ; MIR: machineFunctionInfo:
112+ ; MIR: argumentInfo:
113+ ; MIR: dispatchPtr: { reg: '$sgpr0_sgpr1' }
114+ ; MIR: kernargSegmentPtr: { reg: '$sgpr2_sgpr3' }
115+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr4' }
116+ ; MIR: numKernargPreloadSGPRs: 2
117+
118+ ; ASM-LABEL: kernarg_preload_with_dispatch_ptr:
119+ ; ASM: .amdhsa_user_sgpr_dispatch_ptr 1
120+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 2
121+
122+ define amdgpu_kernel void @kernarg_preload_with_dispatch_ptr (i64 inreg %arg0 ) #0 {
123+ entry:
124+ %val = add i64 %arg0 , 1
125+ store i64 %val , ptr addrspace (1 ) null
126+ ret void
127+ }
128+
129+ attributes #0 = { "amdgpu-dispatch-ptr" "amdgpu-no-queue-ptr" "amdgpu-no-dispatch-id" }
130+
131+ ; MIR-LABEL: name: kernarg_preload_with_queue_ptr
132+ ; MIR: machineFunctionInfo:
133+ ; MIR: argumentInfo:
134+ ; MIR: queuePtr: { reg: '$sgpr0_sgpr1' }
135+ ; MIR: kernargSegmentPtr: { reg: '$sgpr2_sgpr3' }
136+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr4' }
137+ ; MIR: numKernargPreloadSGPRs: 1
138+
139+ ; ASM-LABEL: kernarg_preload_with_queue_ptr:
140+ ; ASM: .amdhsa_user_sgpr_queue_ptr 1
141+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 1
142+
143+ define amdgpu_kernel void @kernarg_preload_with_queue_ptr (i32 inreg %arg0 ) #1 {
144+ entry:
145+ %val = add i32 %arg0 , 1
146+ store i32 %val , ptr addrspace (1 ) null
147+ ret void
148+ }
149+
150+ attributes #1 = { "amdgpu-queue-ptr" "amdgpu-no-dispatch-ptr" "amdgpu-no-dispatch-id" }
151+
152+ ; MIR-LABEL: name: kernarg_preload_with_multiple_user_sgprs
153+ ; MIR: machineFunctionInfo:
154+ ; MIR: argumentInfo:
155+ ; MIR: dispatchPtr: { reg: '$sgpr0_sgpr1' }
156+ ; MIR: queuePtr: { reg: '$sgpr2_sgpr3' }
157+ ; MIR: kernargSegmentPtr: { reg: '$sgpr4_sgpr5' }
158+ ; MIR: dispatchID: { reg: '$sgpr6_sgpr7' }
159+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr8' }
160+ ; MIR: numKernargPreloadSGPRs: 2
161+
162+ ; ASM-LABEL: kernarg_preload_with_multiple_user_sgprs:
163+ ; ASM: .amdhsa_user_sgpr_dispatch_ptr 1
164+ ; ASM: .amdhsa_user_sgpr_queue_ptr 1
165+ ; ASM: .amdhsa_user_sgpr_dispatch_id 1
166+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 2
167+
168+ define amdgpu_kernel void @kernarg_preload_with_multiple_user_sgprs (i64 inreg %arg0 ) #5 {
169+ entry:
170+ %val = add i64 %arg0 , 1
171+ store i64 %val , ptr addrspace (1 ) null
172+ ret void
173+ }
174+
175+ attributes #2 = { "amdgpu-dispatch-ptr" "amdgpu-queue-ptr" "amdgpu-dispatch-id" }
176+
177+ ; MIR-LABEL: name: kernarg_preload_without_user_sgprs
178+ ; MIR: machineFunctionInfo:
179+ ; MIR: argumentInfo:
180+ ; MIR: kernargSegmentPtr: { reg: '$sgpr0_sgpr1' }
181+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr2' }
182+ ; MIR: numKernargPreloadSGPRs: 1
183+
184+ ; ASM-LABEL: kernarg_preload_without_user_sgprs:
185+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 1
186+
187+ define amdgpu_kernel void @kernarg_preload_without_user_sgprs (i32 inreg %arg0 ) #3 {
188+ entry:
189+ %val = add i32 %arg0 , 1
190+ store i32 %val , ptr addrspace (1 ) null
191+ ret void
192+ }
193+
194+ attributes #3 = { "amdgpu-no-queue-ptr" "amdgpu-no-dispatch-ptr" "amdgpu-no-dispatch-id" }
195+
196+ ; MIR-LABEL: name: kernarg_preload_max_args
197+ ; MIR: machineFunctionInfo:
198+ ; MIR: argumentInfo:
199+ ; MIR: dispatchPtr: { reg: '$sgpr0_sgpr1' }
200+ ; MIR: queuePtr: { reg: '$sgpr2_sgpr3' }
201+ ; MIR: kernargSegmentPtr: { reg: '$sgpr4_sgpr5' }
202+ ; MIR: dispatchID: { reg: '$sgpr6_sgpr7' }
203+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr8' }
204+ ; MIR: numKernargPreloadSGPRs: 8
205+
206+ ; ASM-LABEL: kernarg_preload_max_args:
207+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 8
208+
209+ define amdgpu_kernel void @kernarg_preload_max_args (
210+ i32 inreg %a0 , i32 inreg %a1 , i32 inreg %a2 , i32 inreg %a3 ,
211+ i32 inreg %a4 , i32 inreg %a5 , i32 inreg %a6 , i32 inreg %a7 ,
212+ i32 inreg %a8 , i32 inreg %a9 , i32 inreg %a10 , i32 inreg %a11 ,
213+ i32 inreg %a12 , i32 inreg %a13 , i32 inreg %a14 , i32 inreg %a15 ) {
214+ entry:
215+ ret void
216+ }
217+
218+ ; MIR-LABEL: name: kernarg_preload_mixed_inreg_and_stack
219+ ; MIR: machineFunctionInfo:
220+ ; MIR: argumentInfo:
221+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr8' }
222+ ; MIR: numKernargPreloadSGPRs: 2
223+
224+ ; ASM-LABEL: kernarg_preload_mixed_inreg_and_stack:
225+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 2
226+
227+ define amdgpu_kernel void @kernarg_preload_mixed_inreg_and_stack (
228+ i32 inreg %preload0 ,
229+ i32 inreg %preload1 ,
230+ i32 %stack0 ,
231+ i32 %stack1 ) {
232+ entry:
233+ %val = add i32 %preload0 , %preload1
234+ %val2 = add i32 %val , %stack0
235+ %val3 = add i32 %val2 , %stack1
236+ store i32 %val3 , ptr addrspace (1 ) null
237+ ret void
238+ }
239+
240+ ; MIR-LABEL: name: kernarg_preload_vector_types
241+ ; MIR: machineFunctionInfo:
242+ ; MIR: argumentInfo:
243+ ; MIR: firstKernArgPreloadReg: { reg: '$sgpr8' }
244+ ; MIR: numKernargPreloadSGPRs: 4
245+
246+ ; ASM-LABEL: kernarg_preload_vector_types:
247+ ; ASM: .amdhsa_user_sgpr_kernarg_preload_length 4
248+
249+ define amdgpu_kernel void @kernarg_preload_vector_types (<4 x i32 > inreg %vec ) {
250+ entry:
251+ %elem = extractelement <4 x i32 > %vec , i32 0
252+ store i32 %elem , ptr addrspace (1 ) null
253+ ret void
254+ }
0 commit comments