1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
2 ; RUN: opt < %s -S -passes=openmp-opt | FileCheck %s --check-prefixes=CHECK,MODULE
3 ; RUN: opt < %s -S -passes=openmp-opt-cgscc | FileCheck %s --check-prefixes=CHECK,CGSCC
4 target triple = "amdgcn-amd-amdhsa"
6 declare void @useI32(i32)
7 declare void @unknown()
8 declare void @aligned_barrier() "llvm.assume"="ompx_aligned_barrier"
9 declare void @llvm.nvvm.barrier0()
10 declare i32 @llvm.nvvm.barrier0.and(i32)
11 declare i32 @llvm.nvvm.barrier0.or(i32)
12 declare i32 @llvm.nvvm.barrier0.popc(i32)
13 declare void @llvm.amdgcn.s.barrier()
14 declare void @llvm.assume(i1)
17 ; CHECK: @[[GC1:[a-zA-Z0-9_$"\\.-]+]] = constant i32 42
18 ; CHECK: @[[GC2:[a-zA-Z0-9_$"\\.-]+]] = addrspace(4) global i32 0
19 ; CHECK: @[[GPTR4:[a-zA-Z0-9_$"\\.-]+]] = addrspace(4) global ptr addrspace(4) null
20 ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = global i32 42
21 ; CHECK: @[[GS:[a-zA-Z0-9_$"\\.-]+]] = addrspace(3) global i32 0
22 ; CHECK: @[[GPTR:[a-zA-Z0-9_$"\\.-]+]] = global ptr null
23 ; CHECK: @[[PG1:[a-zA-Z0-9_$"\\.-]+]] = thread_local global i32 42
24 ; CHECK: @[[PG2:[a-zA-Z0-9_$"\\.-]+]] = addrspace(5) global i32 0
25 ; CHECK: @[[GPTR5:[a-zA-Z0-9_$"\\.-]+]] = global ptr addrspace(5) null
26 ; CHECK: @[[G1:[a-zA-Z0-9_$"\\.-]+]] = global i32 42
27 ; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = addrspace(1) global i32 0
29 define void @pos_empty_1(i1 %c) "kernel" {
30 ; MODULE-LABEL: define {{[^@]+}}@pos_empty_1
31 ; MODULE-SAME: (i1 [[C:%.*]]) #[[ATTR4:[0-9]+]] {
32 ; MODULE-NEXT: ret void
34 ; CGSCC-LABEL: define {{[^@]+}}@pos_empty_1
35 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR4:[0-9]+]] {
36 ; CGSCC-NEXT: call void @llvm.assume(i1 [[C]])
37 ; CGSCC-NEXT: call void @unknown() #[[ATTR0:[0-9]+]]
38 ; CGSCC-NEXT: call void @llvm.assume(i1 [[C]])
39 ; CGSCC-NEXT: ret void
41 call void @llvm.assume(i1 %c)
42 call void @unknown() "llvm.assume"="ompx_aligned_barrier"
43 call void @llvm.assume(i1 %c)
46 define void @pos_empty_2() "kernel" {
47 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_2
48 ; CHECK-SAME: () #[[ATTR4:[0-9]+]] {
49 ; CHECK-NEXT: ret void
51 call void @aligned_barrier()
54 define void @pos_empty_3() "kernel" {
55 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_3
56 ; CHECK-SAME: () #[[ATTR4]] {
57 ; CHECK-NEXT: ret void
59 call void @llvm.nvvm.barrier0()
62 define void @pos_empty_4() "kernel" {
63 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_4
64 ; CHECK-SAME: () #[[ATTR4]] {
65 ; CHECK-NEXT: ret void
67 call i32 @llvm.nvvm.barrier0.and(i32 0)
70 define void @pos_empty_5() "kernel" {
71 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_5
72 ; CHECK-SAME: () #[[ATTR4]] {
73 ; CHECK-NEXT: ret void
75 call i32 @llvm.nvvm.barrier0.or(i32 0)
78 define void @pos_empty_6() "kernel" {
79 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_6
80 ; CHECK-SAME: () #[[ATTR4]] {
81 ; CHECK-NEXT: ret void
83 call i32 @llvm.nvvm.barrier0.popc(i32 0)
86 define void @pos_empty_7a() "kernel" {
87 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_7a
88 ; CHECK-SAME: () #[[ATTR4]] {
89 ; CHECK-NEXT: call void @unknown()
90 ; CHECK-NEXT: ret void
92 call void @llvm.amdgcn.s.barrier()
96 ; FIXME: We should remove the barrier.
97 define void @pos_empty_7b() "kernel" {
98 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_7b
99 ; CHECK-SAME: () #[[ATTR4]] {
100 ; CHECK-NEXT: call void @unknown() #[[ATTR5:[0-9]+]]
101 ; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()
102 ; CHECK-NEXT: call void @unknown()
103 ; CHECK-NEXT: ret void
105 call void @unknown() nosync readnone
106 call void @llvm.amdgcn.s.barrier()
110 define void @pos_empty_8(i1 %c) "kernel" {
111 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_8
112 ; CHECK-SAME: (i1 [[C:%.*]]) #[[ATTR4]] {
113 ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
115 ; CHECK-NEXT: br label [[F]]
117 ; CHECK-NEXT: ret void
119 br i1 %c, label %t, label %f
122 call void @llvm.amdgcn.s.barrier() "llvm.assume"="ompx_aligned_barrier"
127 define void @neg_empty_8() "kernel" {
128 ; CHECK-LABEL: define {{[^@]+}}@neg_empty_8
129 ; CHECK-SAME: () #[[ATTR4]] {
130 ; CHECK-NEXT: call void @unknown()
131 ; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()
132 ; CHECK-NEXT: ret void
135 call void @llvm.amdgcn.s.barrier()
138 define void @neg_empty_9(i1 %c) "kernel" {
139 ; CHECK-LABEL: define {{[^@]+}}@neg_empty_9
140 ; CHECK-SAME: (i1 [[C:%.*]]) #[[ATTR4]] {
141 ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
143 ; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()
144 ; CHECK-NEXT: fence release
145 ; CHECK-NEXT: br label [[M:%.*]]
147 ; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()
148 ; CHECK-NEXT: fence release
149 ; CHECK-NEXT: br label [[M]]
151 ; CHECK-NEXT: fence release
152 ; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()
153 ; CHECK-NEXT: fence release
154 ; CHECK-NEXT: ret void
156 br i1 %c, label %t, label %f
159 call void @llvm.amdgcn.s.barrier()
164 call void @llvm.amdgcn.s.barrier()
169 call void @llvm.amdgcn.s.barrier()
173 ; FIXME: We should remove the barrier
174 define void @pos_empty_10() "kernel" {
175 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_10
176 ; CHECK-SAME: () #[[ATTR4]] {
177 ; CHECK-NEXT: br label [[M:%.*]]
179 ; CHECK-NEXT: call void @llvm.amdgcn.s.barrier()
180 ; CHECK-NEXT: ret void
184 call void @llvm.amdgcn.s.barrier()
187 define void @pos_empty_11() "kernel" {
188 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_11
189 ; CHECK-SAME: () #[[ATTR4]] {
190 ; CHECK-NEXT: br label [[M:%.*]]
192 ; CHECK-NEXT: ret void
196 call void @aligned_barrier()
197 call void @llvm.amdgcn.s.barrier()
200 define void @empty() {
201 ; CHECK-LABEL: define {{[^@]+}}@empty() {
202 ; CHECK-NEXT: ret void
206 ; FIXME: We should remove the barrier in the end but not the first one.
207 define void @neg_empty_12(i1 %c) "kernel" {
208 ; MODULE-LABEL: define {{[^@]+}}@neg_empty_12
209 ; MODULE-SAME: (i1 [[C:%.*]]) #[[ATTR4]] {
210 ; MODULE-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
212 ; MODULE-NEXT: call void @llvm.amdgcn.s.barrier()
213 ; MODULE-NEXT: br label [[M:%.*]]
215 ; MODULE-NEXT: br label [[M]]
217 ; MODULE-NEXT: call void @llvm.amdgcn.s.barrier()
218 ; MODULE-NEXT: ret void
220 ; CGSCC-LABEL: define {{[^@]+}}@neg_empty_12
221 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR4]] {
222 ; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
224 ; CGSCC-NEXT: call void @empty()
225 ; CGSCC-NEXT: call void @llvm.amdgcn.s.barrier()
226 ; CGSCC-NEXT: br label [[M:%.*]]
228 ; CGSCC-NEXT: call void @empty()
229 ; CGSCC-NEXT: br label [[M]]
231 ; CGSCC-NEXT: call void @llvm.amdgcn.s.barrier()
232 ; CGSCC-NEXT: ret void
234 br i1 %c, label %t, label %f
237 call void @llvm.amdgcn.s.barrier()
243 call void @llvm.amdgcn.s.barrier()
246 define void @neg_empty_1() "kernel" {
247 ; CHECK-LABEL: define {{[^@]+}}@neg_empty_1
248 ; CHECK-SAME: () #[[ATTR4]] {
249 ; CHECK-NEXT: call void @unknown()
250 ; CHECK-NEXT: ret void
255 define void @neg_empty_2() "kernel" {
256 ; CHECK-LABEL: define {{[^@]+}}@neg_empty_2
257 ; CHECK-SAME: () #[[ATTR4]] {
258 ; CHECK-NEXT: ret void
260 call void @aligned_barrier()
264 @GC1 = constant i32 42
265 @GC2 = addrspace(4) global i32 0
266 @GPtr4 = addrspace(4) global ptr addrspace(4) null
267 define void @pos_constant_loads() "kernel" {
268 ; CHECK-LABEL: define {{[^@]+}}@pos_constant_loads
269 ; CHECK-SAME: () #[[ATTR4]] {
270 ; CHECK-NEXT: [[ARG:%.*]] = load ptr addrspace(4), ptr addrspacecast (ptr addrspace(4) @GPtr4 to ptr), align 8
271 ; CHECK-NEXT: [[B:%.*]] = load i32, ptr addrspacecast (ptr addrspace(4) @GC2 to ptr), align 4
272 ; CHECK-NEXT: [[ARGC:%.*]] = addrspacecast ptr addrspace(4) [[ARG]] to ptr
273 ; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[ARGC]], align 4
274 ; CHECK-NEXT: [[D:%.*]] = add i32 42, [[B]]
275 ; CHECK-NEXT: [[E:%.*]] = add i32 [[D]], [[C]]
276 ; CHECK-NEXT: call void @useI32(i32 [[E]])
277 ; CHECK-NEXT: ret void
279 %GPtr4c = addrspacecast ptr addrspace(4) @GPtr4 to ptr
280 %arg = load ptr addrspace(4), ptr %GPtr4c
281 %a = load i32, ptr @GC1
282 call void @aligned_barrier()
283 %GC2c = addrspacecast ptr addrspace(4) @GC2 to ptr
284 %b = load i32, ptr %GC2c
285 call void @aligned_barrier()
286 %argc = addrspacecast ptr addrspace(4) %arg to ptr
287 %c = load i32, ptr %argc
288 call void @aligned_barrier()
291 call void @useI32(i32 %e)
295 @GS = addrspace(3) global i32 0
296 @GPtr = global ptr null
297 ; TODO: We could remove some of the barriers due to the lack of write effects.
298 define void @neg_loads() "kernel" {
299 ; CHECK-LABEL: define {{[^@]+}}@neg_loads
300 ; CHECK-SAME: () #[[ATTR4]] {
301 ; CHECK-NEXT: [[ARG:%.*]] = load ptr, ptr @GPtr, align 8
302 ; CHECK-NEXT: [[A:%.*]] = load i32, ptr @G, align 4
303 ; CHECK-NEXT: call void @aligned_barrier()
304 ; CHECK-NEXT: [[B:%.*]] = load i32, ptr addrspacecast (ptr addrspace(3) @GS to ptr), align 4
305 ; CHECK-NEXT: call void @aligned_barrier()
306 ; CHECK-NEXT: [[C:%.*]] = load i32, ptr [[ARG]], align 4
307 ; CHECK-NEXT: call void @aligned_barrier()
308 ; CHECK-NEXT: [[D:%.*]] = add i32 [[A]], [[B]]
309 ; CHECK-NEXT: [[E:%.*]] = add i32 [[D]], [[C]]
310 ; CHECK-NEXT: call void @useI32(i32 [[E]])
311 ; CHECK-NEXT: ret void
313 %arg = load ptr, ptr @GPtr
314 %a = load i32, ptr @G
315 call void @aligned_barrier()
316 %GSc = addrspacecast ptr addrspace(3) @GS to ptr
317 %b = load i32, ptr %GSc
318 call void @aligned_barrier()
319 %c = load i32, ptr %arg
320 call void @aligned_barrier()
323 call void @useI32(i32 %e)
326 @PG1 = thread_local global i32 42
327 @PG2 = addrspace(5) global i32 0
328 @GPtr5 = global ptr addrspace(5) null
329 define void @pos_priv_mem() "kernel" {
330 ; CHECK-LABEL: define {{[^@]+}}@pos_priv_mem
331 ; CHECK-SAME: () #[[ATTR4]] {
332 ; CHECK-NEXT: [[ARG:%.*]] = load ptr addrspace(5), ptr @GPtr5, align 8
333 ; CHECK-NEXT: [[LOC:%.*]] = alloca i32, align 4
334 ; CHECK-NEXT: [[A:%.*]] = load i32, ptr @PG1, align 4
335 ; CHECK-NEXT: store i32 [[A]], ptr [[LOC]], align 4
336 ; CHECK-NEXT: [[B:%.*]] = load i32, ptr addrspacecast (ptr addrspace(5) @PG2 to ptr), align 4
337 ; CHECK-NEXT: [[ARGC:%.*]] = addrspacecast ptr addrspace(5) [[ARG]] to ptr
338 ; CHECK-NEXT: store i32 [[B]], ptr [[ARGC]], align 4
339 ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[LOC]], align 4
340 ; CHECK-NEXT: store i32 [[V]], ptr @PG1, align 4
341 ; CHECK-NEXT: ret void
343 %arg = load ptr addrspace(5), ptr @GPtr5
345 %a = load i32, ptr @PG1
346 call void @aligned_barrier()
347 store i32 %a, ptr %loc
348 %PG2c = addrspacecast ptr addrspace(5) @PG2 to ptr
349 %b = load i32, ptr %PG2c
350 call void @aligned_barrier()
351 %argc = addrspacecast ptr addrspace(5) %arg to ptr
352 store i32 %b, ptr %argc
353 call void @aligned_barrier()
354 %v = load i32, ptr %loc
355 store i32 %v, ptr @PG1
356 call void @aligned_barrier()
360 @G2 = addrspace(1) global i32 0
361 define void @neg_mem() "kernel" {
362 ; CHECK-LABEL: define {{[^@]+}}@neg_mem
363 ; CHECK-SAME: () #[[ATTR4]] {
364 ; CHECK-NEXT: [[ARG:%.*]] = load ptr, ptr @GPtr, align 8
365 ; CHECK-NEXT: [[A:%.*]] = load i32, ptr @G1, align 4
366 ; CHECK-NEXT: fence seq_cst
367 ; CHECK-NEXT: call void @aligned_barrier()
368 ; CHECK-NEXT: store i32 [[A]], ptr [[ARG]], align 4
369 ; CHECK-NEXT: fence release
370 ; CHECK-NEXT: call void @aligned_barrier()
371 ; CHECK-NEXT: [[B:%.*]] = load i32, ptr addrspacecast (ptr addrspace(1) @G2 to ptr), align 4
372 ; CHECK-NEXT: store i32 [[B]], ptr @G1, align 4
373 ; CHECK-NEXT: fence acquire
374 ; CHECK-NEXT: ret void
376 %arg = load ptr, ptr @GPtr
377 %a = load i32, ptr @G1
379 call void @aligned_barrier()
380 store i32 %a, ptr %arg
382 call void @aligned_barrier()
383 %G2c = addrspacecast ptr addrspace(1) @G2 to ptr
384 %b = load i32, ptr %G2c
385 store i32 %b, ptr @G1
387 call void @aligned_barrier()
391 define void @pos_multiple() "kernel" {
392 ; CHECK-LABEL: define {{[^@]+}}@pos_multiple
393 ; CHECK-SAME: () #[[ATTR4]] {
394 ; CHECK-NEXT: ret void
396 call void @llvm.nvvm.barrier0()
397 call void @aligned_barrier()
398 call void @aligned_barrier()
399 call void @llvm.amdgcn.s.barrier()
400 call void @aligned_barrier()
401 call void @llvm.nvvm.barrier0()
402 call void @aligned_barrier()
403 call void @aligned_barrier()
407 define void @multiple_blocks_kernel_1(i1 %c0, i1 %c1) "kernel" {
408 ; CHECK-LABEL: define {{[^@]+}}@multiple_blocks_kernel_1
409 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR4]] {
410 ; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]
412 ; CHECK-NEXT: br label [[T0B:%.*]]
414 ; CHECK-NEXT: br label [[M:%.*]]
416 ; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
418 ; CHECK-NEXT: br label [[M]]
420 ; CHECK-NEXT: br label [[M]]
422 ; CHECK-NEXT: ret void
425 call void @llvm.nvvm.barrier0()
427 call void @aligned_barrier()
429 br i1 %c0, label %t0, label %f0
432 call void @aligned_barrier()
437 call void @aligned_barrier()
442 call void @aligned_barrier()
444 call void @llvm.nvvm.barrier0()
446 br i1 %c1, label %t1, label %f1
449 call void @aligned_barrier()
454 call void @aligned_barrier()
459 call void @aligned_barrier()
464 define void @multiple_blocks_kernel_2(i1 %c0, i1 %c1, ptr %p) "kernel" {
465 ; CHECK-LABEL: define {{[^@]+}}@multiple_blocks_kernel_2
466 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) #[[ATTR4]] {
467 ; CHECK-NEXT: store i32 4, ptr [[P]], align 4
468 ; CHECK-NEXT: call void @aligned_barrier()
469 ; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]
471 ; CHECK-NEXT: br label [[T0B:%.*]]
473 ; CHECK-NEXT: br label [[M:%.*]]
475 ; CHECK-NEXT: store i32 4, ptr [[P]], align 4
476 ; CHECK-NEXT: call void @llvm.nvvm.barrier0()
477 ; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
479 ; CHECK-NEXT: br label [[M]]
481 ; CHECK-NEXT: br label [[M]]
483 ; CHECK-NEXT: store i32 4, ptr [[P]], align 4
484 ; CHECK-NEXT: ret void
486 call void @llvm.nvvm.barrier0()
488 call void @aligned_barrier()
489 br i1 %c0, label %t0, label %f0
491 call void @aligned_barrier()
494 call void @aligned_barrier()
497 call void @aligned_barrier()
499 call void @llvm.nvvm.barrier0()
500 br i1 %c1, label %t1, label %f1
502 call void @aligned_barrier()
505 call void @aligned_barrier()
509 call void @aligned_barrier()
513 define void @multiple_blocks_non_kernel_1(i1 %c0, i1 %c1) "kernel" {
514 ; CHECK-LABEL: define {{[^@]+}}@multiple_blocks_non_kernel_1
515 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR4]] {
516 ; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]
518 ; CHECK-NEXT: br label [[T0B:%.*]]
520 ; CHECK-NEXT: br label [[M:%.*]]
522 ; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
524 ; CHECK-NEXT: br label [[M]]
526 ; CHECK-NEXT: br label [[M]]
528 ; CHECK-NEXT: ret void
530 call void @llvm.nvvm.barrier0()
531 call void @aligned_barrier()
532 br i1 %c0, label %t0, label %f0
534 call void @aligned_barrier()
537 call void @aligned_barrier()
540 call void @aligned_barrier()
541 call void @llvm.nvvm.barrier0()
542 br i1 %c1, label %t1, label %f1
544 call void @aligned_barrier()
547 call void @aligned_barrier()
550 call void @aligned_barrier()
554 define void @multiple_blocks_non_kernel_2(i1 %c0, i1 %c1) "kernel" {
555 ; CHECK-LABEL: define {{[^@]+}}@multiple_blocks_non_kernel_2
556 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR4]] {
557 ; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]
559 ; CHECK-NEXT: br label [[T0B:%.*]]
561 ; CHECK-NEXT: br label [[M:%.*]]
563 ; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
565 ; CHECK-NEXT: br label [[M]]
567 ; CHECK-NEXT: br label [[M]]
569 ; CHECK-NEXT: ret void
571 br i1 %c0, label %t0, label %f0
573 call void @aligned_barrier()
576 call void @aligned_barrier()
579 call void @aligned_barrier()
580 call void @llvm.nvvm.barrier0()
581 br i1 %c1, label %t1, label %f1
583 call void @aligned_barrier()
586 call void @aligned_barrier()
589 call void @aligned_barrier()
593 define void @multiple_blocks_non_kernel_3(i1 %c0, i1 %c1) "kernel" {
594 ; CHECK-LABEL: define {{[^@]+}}@multiple_blocks_non_kernel_3
595 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR4]] {
596 ; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]
598 ; CHECK-NEXT: br label [[T0B:%.*]]
600 ; CHECK-NEXT: br label [[M:%.*]]
602 ; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
604 ; CHECK-NEXT: br label [[M]]
606 ; CHECK-NEXT: br label [[M]]
608 ; CHECK-NEXT: ret void
610 br i1 %c0, label %t0, label %f0
616 call void @aligned_barrier()
617 call void @llvm.nvvm.barrier0()
618 br i1 %c1, label %t1, label %f1
620 call void @aligned_barrier()
623 call void @aligned_barrier()
626 call void @aligned_barrier()
630 define void @multiple_blocks_non_kernel_effects_1(i1 %c0, i1 %c1, ptr %p) "kernel" {
631 ; CHECK-LABEL: define {{[^@]+}}@multiple_blocks_non_kernel_effects_1
632 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) #[[ATTR4]] {
633 ; CHECK-NEXT: store i32 0, ptr [[P]], align 4
634 ; CHECK-NEXT: call void @aligned_barrier()
635 ; CHECK-NEXT: br i1 [[C0]], label [[T0:%.*]], label [[F0:%.*]]
637 ; CHECK-NEXT: store i32 1, ptr [[P]], align 4
638 ; CHECK-NEXT: br label [[T0B:%.*]]
640 ; CHECK-NEXT: call void @aligned_barrier()
641 ; CHECK-NEXT: br label [[M:%.*]]
643 ; CHECK-NEXT: store i32 2, ptr [[P]], align 4
644 ; CHECK-NEXT: br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
646 ; CHECK-NEXT: call void @aligned_barrier()
647 ; CHECK-NEXT: br label [[M]]
649 ; CHECK-NEXT: call void @aligned_barrier()
650 ; CHECK-NEXT: br label [[M]]
652 ; CHECK-NEXT: store i32 3, ptr [[P]], align 4
653 ; CHECK-NEXT: ret void
655 call void @aligned_barrier()
657 call void @aligned_barrier()
658 br i1 %c0, label %t0, label %f0
660 call void @aligned_barrier()
664 call void @aligned_barrier()
667 call void @aligned_barrier()
668 call void @llvm.nvvm.barrier0()
670 br i1 %c1, label %t1, label %f1
672 call void @aligned_barrier()
675 call void @aligned_barrier()
678 call void @aligned_barrier()
680 call void @aligned_barrier()
684 define internal void @write_then_barrier0(ptr %p) {
685 ; CHECK-LABEL: define {{[^@]+}}@write_then_barrier0
686 ; CHECK-SAME: (ptr [[P:%.*]]) {
687 ; CHECK-NEXT: store i32 0, ptr [[P]], align 4
688 ; CHECK-NEXT: call void @aligned_barrier()
689 ; CHECK-NEXT: ret void
692 call void @aligned_barrier()
695 define internal void @barrier_then_write0(ptr %p) {
696 ; MODULE-LABEL: define {{[^@]+}}@barrier_then_write0
697 ; MODULE-SAME: (ptr [[P:%.*]]) {
698 ; MODULE-NEXT: store i32 0, ptr [[P]], align 4
699 ; MODULE-NEXT: ret void
701 ; CGSCC-LABEL: define {{[^@]+}}@barrier_then_write0
702 ; CGSCC-SAME: (ptr [[P:%.*]]) {
703 ; CGSCC-NEXT: call void @aligned_barrier()
704 ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
705 ; CGSCC-NEXT: ret void
707 call void @aligned_barrier()
711 define internal void @barrier_then_write_then_barrier0(ptr %p) {
712 ; MODULE-LABEL: define {{[^@]+}}@barrier_then_write_then_barrier0
713 ; MODULE-SAME: (ptr [[P:%.*]]) {
714 ; MODULE-NEXT: store i32 0, ptr [[P]], align 4
715 ; MODULE-NEXT: call void @aligned_barrier()
716 ; MODULE-NEXT: ret void
718 ; CGSCC-LABEL: define {{[^@]+}}@barrier_then_write_then_barrier0
719 ; CGSCC-SAME: (ptr [[P:%.*]]) {
720 ; CGSCC-NEXT: call void @aligned_barrier()
721 ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
722 ; CGSCC-NEXT: call void @aligned_barrier()
723 ; CGSCC-NEXT: ret void
725 call void @aligned_barrier()
727 call void @aligned_barrier()
730 define void @multiple_blocks_functions_kernel_effects_0(i1 %c0, i1 %c1, ptr %p) "kernel" {
731 ; MODULE-LABEL: define {{[^@]+}}@multiple_blocks_functions_kernel_effects_0
732 ; MODULE-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) #[[ATTR4]] {
733 ; MODULE-NEXT: call void @barrier_then_write_then_barrier0(ptr [[P]])
734 ; MODULE-NEXT: br i1 [[C0]], label [[T03:%.*]], label [[F03:%.*]]
736 ; MODULE-NEXT: call void @barrier_then_write0(ptr [[P]])
737 ; MODULE-NEXT: br label [[T0B3:%.*]]
739 ; MODULE-NEXT: br label [[M3:%.*]]
741 ; MODULE-NEXT: call void @barrier_then_write0(ptr [[P]])
742 ; MODULE-NEXT: br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
744 ; MODULE-NEXT: br label [[M3]]
746 ; MODULE-NEXT: br label [[M3]]
748 ; MODULE-NEXT: call void @write_then_barrier0(ptr [[P]])
749 ; MODULE-NEXT: ret void
751 ; CGSCC-LABEL: define {{[^@]+}}@multiple_blocks_functions_kernel_effects_0
752 ; CGSCC-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) #[[ATTR4]] {
753 ; CGSCC-NEXT: call void @barrier_then_write_then_barrier0(ptr [[P]])
754 ; CGSCC-NEXT: call void @aligned_barrier()
755 ; CGSCC-NEXT: br i1 [[C0]], label [[T03:%.*]], label [[F03:%.*]]
757 ; CGSCC-NEXT: call void @barrier_then_write0(ptr [[P]])
758 ; CGSCC-NEXT: br label [[T0B3:%.*]]
760 ; CGSCC-NEXT: call void @aligned_barrier()
761 ; CGSCC-NEXT: br label [[M3:%.*]]
763 ; CGSCC-NEXT: call void @barrier_then_write0(ptr [[P]])
764 ; CGSCC-NEXT: br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
766 ; CGSCC-NEXT: call void @aligned_barrier()
767 ; CGSCC-NEXT: br label [[M3]]
769 ; CGSCC-NEXT: call void @aligned_barrier()
770 ; CGSCC-NEXT: br label [[M3]]
772 ; CGSCC-NEXT: call void @write_then_barrier0(ptr [[P]])
773 ; CGSCC-NEXT: ret void
775 call void @barrier_then_write_then_barrier0(ptr %p)
776 call void @aligned_barrier()
777 br i1 %c0, label %t03, label %f03
779 call void @barrier_then_write0(ptr %p)
782 call void @aligned_barrier()
785 call void @aligned_barrier()
786 call void @barrier_then_write0(ptr %p)
787 br i1 %c1, label %t13, label %f13
789 call void @aligned_barrier()
792 call void @aligned_barrier()
795 call void @aligned_barrier()
796 call void @write_then_barrier0(ptr %p)
799 define internal void @write_then_barrier1(ptr %p) {
800 ; CHECK-LABEL: define {{[^@]+}}@write_then_barrier1
801 ; CHECK-SAME: (ptr [[P:%.*]]) {
802 ; CHECK-NEXT: store i32 0, ptr [[P]], align 4
803 ; CHECK-NEXT: call void @aligned_barrier()
804 ; CHECK-NEXT: ret void
807 call void @aligned_barrier()
810 define internal void @barrier_then_write1(ptr %p) {
811 ; MODULE-LABEL: define {{[^@]+}}@barrier_then_write1
812 ; MODULE-SAME: (ptr [[P:%.*]]) {
813 ; MODULE-NEXT: store i32 0, ptr [[P]], align 4
814 ; MODULE-NEXT: ret void
816 ; CGSCC-LABEL: define {{[^@]+}}@barrier_then_write1
817 ; CGSCC-SAME: (ptr [[P:%.*]]) {
818 ; CGSCC-NEXT: call void @aligned_barrier()
819 ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
820 ; CGSCC-NEXT: ret void
822 call void @aligned_barrier()
826 define internal void @barrier_then_write_then_barrier1(ptr %p) {
827 ; CHECK-LABEL: define {{[^@]+}}@barrier_then_write_then_barrier1
828 ; CHECK-SAME: (ptr [[P:%.*]]) {
829 ; CHECK-NEXT: call void @aligned_barrier()
830 ; CHECK-NEXT: store i32 0, ptr [[P]], align 4
831 ; CHECK-NEXT: call void @aligned_barrier()
832 ; CHECK-NEXT: ret void
834 call void @aligned_barrier()
836 call void @aligned_barrier()
839 define void @multiple_blocks_functions_non_kernel_effects_1(i1 %c0, i1 %c1, ptr %p) {
840 ; MODULE-LABEL: define {{[^@]+}}@multiple_blocks_functions_non_kernel_effects_1
841 ; MODULE-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) {
842 ; MODULE-NEXT: call void @barrier_then_write_then_barrier1(ptr [[P]])
843 ; MODULE-NEXT: br i1 [[C0]], label [[T03:%.*]], label [[F03:%.*]]
845 ; MODULE-NEXT: call void @barrier_then_write1(ptr [[P]])
846 ; MODULE-NEXT: br label [[T0B3:%.*]]
848 ; MODULE-NEXT: call void @aligned_barrier()
849 ; MODULE-NEXT: br label [[M3:%.*]]
851 ; MODULE-NEXT: call void @barrier_then_write1(ptr [[P]])
852 ; MODULE-NEXT: br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
854 ; MODULE-NEXT: call void @aligned_barrier()
855 ; MODULE-NEXT: br label [[M3]]
857 ; MODULE-NEXT: call void @aligned_barrier()
858 ; MODULE-NEXT: br label [[M3]]
860 ; MODULE-NEXT: call void @write_then_barrier1(ptr [[P]])
861 ; MODULE-NEXT: ret void
863 ; CGSCC-LABEL: define {{[^@]+}}@multiple_blocks_functions_non_kernel_effects_1
864 ; CGSCC-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) {
865 ; CGSCC-NEXT: call void @barrier_then_write_then_barrier1(ptr [[P]])
866 ; CGSCC-NEXT: call void @aligned_barrier()
867 ; CGSCC-NEXT: br i1 [[C0]], label [[T03:%.*]], label [[F03:%.*]]
869 ; CGSCC-NEXT: call void @barrier_then_write1(ptr [[P]])
870 ; CGSCC-NEXT: br label [[T0B3:%.*]]
872 ; CGSCC-NEXT: call void @aligned_barrier()
873 ; CGSCC-NEXT: br label [[M3:%.*]]
875 ; CGSCC-NEXT: call void @barrier_then_write1(ptr [[P]])
876 ; CGSCC-NEXT: br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
878 ; CGSCC-NEXT: call void @aligned_barrier()
879 ; CGSCC-NEXT: br label [[M3]]
881 ; CGSCC-NEXT: call void @aligned_barrier()
882 ; CGSCC-NEXT: br label [[M3]]
884 ; CGSCC-NEXT: call void @write_then_barrier1(ptr [[P]])
885 ; CGSCC-NEXT: ret void
887 call void @barrier_then_write_then_barrier1(ptr %p)
888 call void @aligned_barrier()
889 br i1 %c0, label %t03, label %f03
891 call void @barrier_then_write1(ptr %p)
894 call void @aligned_barrier()
897 call void @aligned_barrier()
898 call void @barrier_then_write1(ptr %p)
899 br i1 %c1, label %t13, label %f13
901 call void @aligned_barrier()
904 call void @aligned_barrier()
907 call void @aligned_barrier()
908 call void @write_then_barrier1(ptr %p)
912 define internal void @write_then_barrier2(ptr %p) {
913 ; CHECK-LABEL: define {{[^@]+}}@write_then_barrier2
914 ; CHECK-SAME: (ptr [[P:%.*]]) {
915 ; CHECK-NEXT: store i32 0, ptr [[P]], align 4
916 ; CHECK-NEXT: call void @aligned_barrier()
917 ; CHECK-NEXT: ret void
920 call void @aligned_barrier()
923 define internal void @barrier_then_write2(ptr %p) {
924 ; CHECK-LABEL: define {{[^@]+}}@barrier_then_write2
925 ; CHECK-SAME: (ptr [[P:%.*]]) {
926 ; CHECK-NEXT: call void @aligned_barrier()
927 ; CHECK-NEXT: store i32 0, ptr [[P]], align 4
928 ; CHECK-NEXT: ret void
930 call void @aligned_barrier()
934 define internal void @barrier_then_write_then_barrier2(ptr %p) {
935 ; MODULE-LABEL: define {{[^@]+}}@barrier_then_write_then_barrier2
936 ; MODULE-SAME: (ptr [[P:%.*]]) {
937 ; MODULE-NEXT: store i32 0, ptr [[P]], align 4
938 ; MODULE-NEXT: call void @aligned_barrier()
939 ; MODULE-NEXT: ret void
941 ; CGSCC-LABEL: define {{[^@]+}}@barrier_then_write_then_barrier2
942 ; CGSCC-SAME: (ptr [[P:%.*]]) {
943 ; CGSCC-NEXT: call void @aligned_barrier()
944 ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
945 ; CGSCC-NEXT: call void @aligned_barrier()
946 ; CGSCC-NEXT: ret void
948 call void @aligned_barrier()
950 call void @aligned_barrier()
953 define void @multiple_blocks_functions_non_kernel_effects_2(i1 %c0, i1 %c1, ptr %p) "kernel" {
954 ; MODULE-LABEL: define {{[^@]+}}@multiple_blocks_functions_non_kernel_effects_2
955 ; MODULE-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) #[[ATTR4]] {
956 ; MODULE-NEXT: call void @barrier_then_write_then_barrier2(ptr [[P]])
957 ; MODULE-NEXT: store i32 0, ptr [[P]], align 4
958 ; MODULE-NEXT: br i1 [[C0]], label [[T03:%.*]], label [[F03:%.*]]
960 ; MODULE-NEXT: call void @barrier_then_write2(ptr [[P]])
961 ; MODULE-NEXT: br label [[T0B3:%.*]]
963 ; MODULE-NEXT: call void @aligned_barrier()
964 ; MODULE-NEXT: br label [[M3:%.*]]
966 ; MODULE-NEXT: call void @aligned_barrier()
967 ; MODULE-NEXT: call void @barrier_then_write2(ptr [[P]])
968 ; MODULE-NEXT: br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
970 ; MODULE-NEXT: call void @aligned_barrier()
971 ; MODULE-NEXT: br label [[M3]]
973 ; MODULE-NEXT: call void @aligned_barrier()
974 ; MODULE-NEXT: br label [[M3]]
976 ; MODULE-NEXT: call void @write_then_barrier2(ptr [[P]])
977 ; MODULE-NEXT: store i32 0, ptr [[P]], align 4
978 ; MODULE-NEXT: ret void
980 ; CGSCC-LABEL: define {{[^@]+}}@multiple_blocks_functions_non_kernel_effects_2
981 ; CGSCC-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], ptr [[P:%.*]]) #[[ATTR4]] {
982 ; CGSCC-NEXT: call void @barrier_then_write_then_barrier2(ptr [[P]])
983 ; CGSCC-NEXT: call void @aligned_barrier()
984 ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
985 ; CGSCC-NEXT: br i1 [[C0]], label [[T03:%.*]], label [[F03:%.*]]
987 ; CGSCC-NEXT: call void @barrier_then_write2(ptr [[P]])
988 ; CGSCC-NEXT: br label [[T0B3:%.*]]
990 ; CGSCC-NEXT: call void @aligned_barrier()
991 ; CGSCC-NEXT: br label [[M3:%.*]]
993 ; CGSCC-NEXT: call void @aligned_barrier()
994 ; CGSCC-NEXT: call void @barrier_then_write2(ptr [[P]])
995 ; CGSCC-NEXT: br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
997 ; CGSCC-NEXT: call void @aligned_barrier()
998 ; CGSCC-NEXT: br label [[M3]]
1000 ; CGSCC-NEXT: call void @aligned_barrier()
1001 ; CGSCC-NEXT: br label [[M3]]
1003 ; CGSCC-NEXT: call void @write_then_barrier2(ptr [[P]])
1004 ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
1005 ; CGSCC-NEXT: ret void
1007 call void @barrier_then_write_then_barrier2(ptr %p)
1008 call void @aligned_barrier()
1010 br i1 %c0, label %t03, label %f03
1012 call void @barrier_then_write2(ptr %p)
1015 call void @aligned_barrier()
1018 call void @aligned_barrier()
1019 call void @barrier_then_write2(ptr %p)
1020 br i1 %c1, label %t13, label %f13
1022 call void @aligned_barrier()
1025 call void @aligned_barrier()
1028 call void @aligned_barrier()
1029 call void @write_then_barrier2(ptr %p)
1034 ; Verify we do not remove the barrier in the callee.
1035 define internal void @callee_barrier() {
1036 ; CHECK-LABEL: define {{[^@]+}}@callee_barrier() {
1037 ; CHECK-NEXT: call void @aligned_barrier()
1038 ; CHECK-NEXT: ret void
1040 call void @aligned_barrier()
1043 define void @caller_barrier1() "kernel" {
1044 ; CHECK-LABEL: define {{[^@]+}}@caller_barrier1
1045 ; CHECK-SAME: () #[[ATTR4]] {
1046 ; CHECK-NEXT: call void @callee_barrier()
1047 ; CHECK-NEXT: ret void
1049 call void @aligned_barrier()
1050 call void @callee_barrier()
1051 call void @aligned_barrier()
1054 define void @caller_barrier2() "kernel" {
1055 ; CHECK-LABEL: define {{[^@]+}}@caller_barrier2
1056 ; CHECK-SAME: () #[[ATTR4]] {
1057 ; CHECK-NEXT: call void @unknown()
1058 ; CHECK-NEXT: call void @callee_barrier()
1059 ; CHECK-NEXT: call void @unknown()
1060 ; CHECK-NEXT: ret void
1062 call void @unknown()
1063 call void @callee_barrier()
1064 call void @unknown()
1068 !llvm.module.flags = !{!16,!15}
1069 !nvvm.annotations = !{!0,!1,!2,!3,!4,!5,!6,!7,!8,!9,!10,!11,!12,!13,!14,!17,!18,!19,!20,!21,!22,!23,!24,!25}
1071 !0 = !{ptr @pos_empty_1, !"kernel", i32 1}
1072 !1 = !{ptr @pos_empty_2, !"kernel", i32 1}
1073 !2 = !{ptr @pos_empty_3, !"kernel", i32 1}
1074 !3 = !{ptr @pos_empty_4, !"kernel", i32 1}
1075 !4 = !{ptr @pos_empty_5, !"kernel", i32 1}
1076 !5 = !{ptr @pos_empty_6, !"kernel", i32 1}
1077 !17 = !{ptr @pos_empty_7a, !"kernel", i32 1}
1078 !18 = !{ptr @pos_empty_7b, !"kernel", i32 1}
1079 !23 = !{ptr @pos_empty_8, !"kernel", i32 1}
1080 !24 = !{ptr @caller_barrier1, !"kernel", i32 1}
1081 !25 = !{ptr @caller_barrier2, !"kernel", i32 1}
1082 !6 = !{ptr @neg_empty_8, !"kernel", i32 1}
1083 !19 = !{ptr @neg_empty_9, !"kernel", i32 1}
1084 !20 = !{ptr @pos_empty_10, !"kernel", i32 1}
1085 !21 = !{ptr @pos_empty_11, !"kernel", i32 1}
1086 !22 = !{ptr @neg_empty_12, !"kernel", i32 1}
1087 !7 = !{ptr @pos_constant_loads, !"kernel", i32 1}
1088 !8 = !{ptr @neg_loads, !"kernel", i32 1}
1089 !9 = !{ptr @pos_priv_mem, !"kernel", i32 1}
1090 !10 = !{ptr @neg_mem, !"kernel", i32 1}
1091 !11 = !{ptr @pos_multiple, !"kernel", i32 1}
1092 !12 = !{ptr @multiple_blocks_kernel_1, !"kernel", i32 1}
1093 !13 = !{ptr @multiple_blocks_kernel_2, !"kernel", i32 1}
1094 !14 = !{ptr @multiple_blocks_functions_kernel_effects_0, !"kernel", i32 1}
1095 !15 = !{i32 7, !"openmp", i32 50}
1096 !16 = !{i32 7, !"openmp-device", i32 50}
1098 ; CHECK: attributes #[[ATTR0:[0-9]+]] = { "llvm.assume"="ompx_aligned_barrier" }
1099 ; CHECK: attributes #[[ATTR1:[0-9]+]] = { convergent nocallback nounwind }
1100 ; CHECK: attributes #[[ATTR2:[0-9]+]] = { convergent nocallback nofree nounwind willreturn }
1101 ; CHECK: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
1102 ; CHECK: attributes #[[ATTR4]] = { "kernel" }
1103 ; CHECK: attributes #[[ATTR5]] = { nosync memory(none) }
1105 ; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
1106 ; CHECK: [[META1:![0-9]+]] = !{i32 7, !"openmp", i32 50}
1107 ; CHECK: [[META2:![0-9]+]] = !{ptr @pos_empty_1, !"kernel", i32 1}
1108 ; CHECK: [[META3:![0-9]+]] = !{ptr @pos_empty_2, !"kernel", i32 1}
1109 ; CHECK: [[META4:![0-9]+]] = !{ptr @pos_empty_3, !"kernel", i32 1}
1110 ; CHECK: [[META5:![0-9]+]] = !{ptr @pos_empty_4, !"kernel", i32 1}
1111 ; CHECK: [[META6:![0-9]+]] = !{ptr @pos_empty_5, !"kernel", i32 1}
1112 ; CHECK: [[META7:![0-9]+]] = !{ptr @pos_empty_6, !"kernel", i32 1}
1113 ; CHECK: [[META8:![0-9]+]] = !{ptr @neg_empty_8, !"kernel", i32 1}
1114 ; CHECK: [[META9:![0-9]+]] = !{ptr @pos_constant_loads, !"kernel", i32 1}
1115 ; CHECK: [[META10:![0-9]+]] = !{ptr @neg_loads, !"kernel", i32 1}
1116 ; CHECK: [[META11:![0-9]+]] = !{ptr @pos_priv_mem, !"kernel", i32 1}
1117 ; CHECK: [[META12:![0-9]+]] = !{ptr @neg_mem, !"kernel", i32 1}
1118 ; CHECK: [[META13:![0-9]+]] = !{ptr @pos_multiple, !"kernel", i32 1}
1119 ; CHECK: [[META14:![0-9]+]] = !{ptr @multiple_blocks_kernel_1, !"kernel", i32 1}
1120 ; CHECK: [[META15:![0-9]+]] = !{ptr @multiple_blocks_kernel_2, !"kernel", i32 1}
1121 ; CHECK: [[META16:![0-9]+]] = !{ptr @multiple_blocks_functions_kernel_effects_0, !"kernel", i32 1}
1122 ; CHECK: [[META17:![0-9]+]] = !{ptr @pos_empty_7a, !"kernel", i32 1}
1123 ; CHECK: [[META18:![0-9]+]] = !{ptr @pos_empty_7b, !"kernel", i32 1}
1124 ; CHECK: [[META19:![0-9]+]] = !{ptr @neg_empty_9, !"kernel", i32 1}
1125 ; CHECK: [[META20:![0-9]+]] = !{ptr @pos_empty_10, !"kernel", i32 1}
1126 ; CHECK: [[META21:![0-9]+]] = !{ptr @pos_empty_11, !"kernel", i32 1}
1127 ; CHECK: [[META22:![0-9]+]] = !{ptr @neg_empty_12, !"kernel", i32 1}
1128 ; CHECK: [[META23:![0-9]+]] = !{ptr @pos_empty_8, !"kernel", i32 1}
1129 ; CHECK: [[META24:![0-9]+]] = !{ptr @caller_barrier1, !"kernel", i32 1}
1130 ; CHECK: [[META25:![0-9]+]] = !{ptr @caller_barrier2, !"kernel", i32 1}