@@ -251,6 +251,205 @@ define amdgpu_kernel void @indirect_calls_none_agpr(i1 %cond) {
251
251
ret void
252
252
}
253
253
254
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_def_struct_0 () {
255
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_def_struct_0(
256
+ ; CHECK-SAME: ) #[[ATTR0]] {
257
+ ; CHECK-NEXT: [[DEF:%.*]] = call { i32, i32 } asm sideeffect "
258
+ ; CHECK-NEXT: ret void
259
+ ;
260
+ %def = call {i32 , i32 } asm sideeffect "; def $0" , "=a,=a" ()
261
+ ret void
262
+ }
263
+
264
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_use_struct_1 () {
265
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_use_struct_1(
266
+ ; CHECK-SAME: ) #[[ATTR0]] {
267
+ ; CHECK-NEXT: [[DEF:%.*]] = call { i32, <2 x i32> } asm sideeffect "
268
+ ; CHECK-NEXT: ret void
269
+ ;
270
+ %def = call {i32 , <2 x i32 >} asm sideeffect "; def $0" , "=a,=a" ()
271
+ ret void
272
+ }
273
+
274
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_use_struct_2 () {
275
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_use_struct_2(
276
+ ; CHECK-SAME: ) #[[ATTR0]] {
277
+ ; CHECK-NEXT: [[DEF:%.*]] = call { i32, <2 x i32> } asm sideeffect "
278
+ ; CHECK-NEXT: ret void
279
+ ;
280
+ %def = call {i32 , <2 x i32 >} asm sideeffect "; def $0" , "=a,=v" ()
281
+ ret void
282
+ }
283
+
284
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_ptr_ty () {
285
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_ptr_ty(
286
+ ; CHECK-SAME: ) #[[ATTR0]] {
287
+ ; CHECK-NEXT: call void asm sideeffect "
288
+ ; CHECK-NEXT: ret void
289
+ ;
290
+ call void asm sideeffect "; use $0" , "a" (ptr poison)
291
+ ret void
292
+ }
293
+
294
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_def_ptr_ty () {
295
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_def_ptr_ty(
296
+ ; CHECK-SAME: ) #[[ATTR0]] {
297
+ ; CHECK-NEXT: [[DEF:%.*]] = call ptr asm sideeffect "
298
+ ; CHECK-NEXT: ret void
299
+ ;
300
+ %def = call ptr asm sideeffect "; def $0" , "=a" ()
301
+ ret void
302
+ }
303
+
304
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_def_vector_ptr_ty () {
305
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_def_vector_ptr_ty(
306
+ ; CHECK-SAME: ) #[[ATTR0]] {
307
+ ; CHECK-NEXT: [[DEF:%.*]] = call <2 x ptr> asm sideeffect "
308
+ ; CHECK-NEXT: ret void
309
+ ;
310
+ %def = call <2 x ptr > asm sideeffect "; def $0" , "=a" ()
311
+ ret void
312
+ }
313
+
314
+ define amdgpu_kernel void @kernel_uses_asm_physreg_def_struct_0 () {
315
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_physreg_def_struct_0(
316
+ ; CHECK-SAME: ) #[[ATTR0]] {
317
+ ; CHECK-NEXT: [[DEF:%.*]] = call { i32, i32 } asm sideeffect "
318
+ ; CHECK-NEXT: ret void
319
+ ;
320
+ %def = call {i32 , i32 } asm sideeffect "; def $0" , "={a0},={a[4:5]}" ()
321
+ ret void
322
+ }
323
+
324
+ define amdgpu_kernel void @kernel_uses_asm_clobber () {
325
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_clobber(
326
+ ; CHECK-SAME: ) #[[ATTR0]] {
327
+ ; CHECK-NEXT: call void asm sideeffect "
328
+ ; CHECK-NEXT: ret void
329
+ ;
330
+ call void asm sideeffect "; clobber $0" , "~{a4}" ()
331
+ ret void
332
+ }
333
+
334
+ define amdgpu_kernel void @kernel_uses_asm_clobber_tuple () {
335
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_clobber_tuple(
336
+ ; CHECK-SAME: ) #[[ATTR0]] {
337
+ ; CHECK-NEXT: call void asm sideeffect "
338
+ ; CHECK-NEXT: ret void
339
+ ;
340
+ call void asm sideeffect "; clobber $0" , "~{a[10:13]}" ()
341
+ ret void
342
+ }
343
+
344
+ define amdgpu_kernel void @kernel_uses_asm_clobber_oob () {
345
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_clobber_oob(
346
+ ; CHECK-SAME: ) #[[ATTR0]] {
347
+ ; CHECK-NEXT: call void asm sideeffect "
348
+ ; CHECK-NEXT: ret void
349
+ ;
350
+ call void asm sideeffect "; clobber $0" , "~{a256}" ()
351
+ ret void
352
+ }
353
+
354
+ define amdgpu_kernel void @kernel_uses_asm_clobber_max () {
355
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_clobber_max(
356
+ ; CHECK-SAME: ) #[[ATTR0]] {
357
+ ; CHECK-NEXT: call void asm sideeffect "
358
+ ; CHECK-NEXT: ret void
359
+ ;
360
+ call void asm sideeffect "; clobber $0" , "~{a255}" ()
361
+ ret void
362
+ }
363
+
364
+ define amdgpu_kernel void @kernel_uses_asm_physreg_oob () {
365
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_physreg_oob(
366
+ ; CHECK-SAME: ) #[[ATTR0]] {
367
+ ; CHECK-NEXT: call void asm sideeffect "
368
+ ; CHECK-NEXT: ret void
369
+ ;
370
+ call void asm sideeffect "; use $0" , "{a256}" (i32 poison)
371
+ ret void
372
+ }
373
+
374
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_def_max_ty () {
375
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_def_max_ty(
376
+ ; CHECK-SAME: ) #[[ATTR0]] {
377
+ ; CHECK-NEXT: [[DEF:%.*]] = call <32 x i32> asm sideeffect "
378
+ ; CHECK-NEXT: ret void
379
+ ;
380
+ %def = call <32 x i32 > asm sideeffect "; def $0" , "=a" ()
381
+ ret void
382
+ }
383
+
384
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_use_max_ty () {
385
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_use_max_ty(
386
+ ; CHECK-SAME: ) #[[ATTR0]] {
387
+ ; CHECK-NEXT: call void asm sideeffect "
388
+ ; CHECK-NEXT: ret void
389
+ ;
390
+ call void asm sideeffect "; use $0" , "a" (<32 x i32 > poison)
391
+ ret void
392
+ }
393
+
394
+ define amdgpu_kernel void @kernel_uses_asm_virtreg_use_def_max_ty () {
395
+ ; CHECK-LABEL: define amdgpu_kernel void @kernel_uses_asm_virtreg_use_def_max_ty(
396
+ ; CHECK-SAME: ) #[[ATTR0]] {
397
+ ; CHECK-NEXT: [[DEF:%.*]] = call <32 x i32> asm sideeffect "
398
+ ; CHECK-NEXT: ret void
399
+ ;
400
+ %def = call <32 x i32 > asm sideeffect "; use $0" , "=a,a" (<32 x i32 > poison)
401
+ ret void
402
+ }
403
+
404
+ define amdgpu_kernel void @vreg_use_exceeds_register_file () {
405
+ ; CHECK-LABEL: define amdgpu_kernel void @vreg_use_exceeds_register_file(
406
+ ; CHECK-SAME: ) #[[ATTR0]] {
407
+ ; CHECK-NEXT: call void asm sideeffect "
408
+ ; CHECK-NEXT: ret void
409
+ ;
410
+ call void asm sideeffect "; use $0" , "a" (<257 x i32 > poison)
411
+ ret void
412
+ }
413
+
414
+ define amdgpu_kernel void @vreg_def_exceeds_register_file () {
415
+ ; CHECK-LABEL: define amdgpu_kernel void @vreg_def_exceeds_register_file(
416
+ ; CHECK-SAME: ) #[[ATTR0]] {
417
+ ; CHECK-NEXT: [[DEF:%.*]] = call <257 x i32> asm sideeffect "
418
+ ; CHECK-NEXT: ret void
419
+ ;
420
+ %def = call <257 x i32 > asm sideeffect "; def $0" , "=a" ()
421
+ ret void
422
+ }
423
+
424
+ define amdgpu_kernel void @multiple () {
425
+ ; CHECK-LABEL: define amdgpu_kernel void @multiple(
426
+ ; CHECK-SAME: ) #[[ATTR0]] {
427
+ ; CHECK-NEXT: [[DEF:%.*]] = call { <16 x i32>, <8 x i32>, <8 x i32> } asm sideeffect "
428
+ ; CHECK-NEXT: ret void
429
+ ;
430
+ %def = call {<16 x i32 >, <8 x i32 >, <8 x i32 >} asm sideeffect "; def $0" , "=a,=a,=a,a,a,a" (<4 x i32 > splat (i32 0 ), <8 x i32 > splat (i32 1 ), i64 999 )
431
+ ret void
432
+ }
433
+
434
+ define amdgpu_kernel void @earlyclobber_0 () {
435
+ ; CHECK-LABEL: define amdgpu_kernel void @earlyclobber_0(
436
+ ; CHECK-SAME: ) #[[ATTR0]] {
437
+ ; CHECK-NEXT: [[DEF:%.*]] = call <8 x i32> asm sideeffect "
438
+ ; CHECK-NEXT: ret void
439
+ ;
440
+ %def = call <8 x i32 > asm sideeffect "; def $0" , "=&a,a" (i32 0 )
441
+ ret void
442
+ }
443
+
444
+ define amdgpu_kernel void @earlyclobber_1 () {
445
+ ; CHECK-LABEL: define amdgpu_kernel void @earlyclobber_1(
446
+ ; CHECK-SAME: ) #[[ATTR0]] {
447
+ ; CHECK-NEXT: [[DEF:%.*]] = call { <8 x i32>, <16 x i32> } asm sideeffect "
448
+ ; CHECK-NEXT: ret void
449
+ ;
450
+ %def = call { <8 x i32 >, <16 x i32 > } asm sideeffect "; def $0, $1" , "=&a,=&a,a,a" (i32 0 , <16 x i32 > splat (i32 1 ))
451
+ ret void
452
+ }
254
453
255
454
attributes #0 = { "amdgpu-agpr-alloc" ="0" }
256
455
;.
0 commit comments