[AMDGPU] Add True16 register classes.
[llvm-project.git] / llvm / test / Transforms / OpenMP / barrier_removal.ll
blobe45f746cbf4395de6520a2e30f8c4a78949672e6
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)
44   ret void
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()
52   ret void
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()
60   ret void
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)
68   ret void
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)
76   ret void
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)
84   ret void
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()
93   call void @unknown()
94   ret void
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()
107   call void @unknown()
108   ret void
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:%.*]]
114 ; CHECK:       t:
115 ; CHECK-NEXT:    br label [[F]]
116 ; CHECK:       f:
117 ; CHECK-NEXT:    ret void
119   br i1 %c, label %t, label %f
121   fence release
122   call void @llvm.amdgcn.s.barrier() "llvm.assume"="ompx_aligned_barrier"
123   br label %f
125   ret void
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
134   call void @unknown()
135   call void @llvm.amdgcn.s.barrier()
136   ret void
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:%.*]]
142 ; CHECK:       t:
143 ; CHECK-NEXT:    call void @llvm.amdgcn.s.barrier()
144 ; CHECK-NEXT:    fence release
145 ; CHECK-NEXT:    br label [[M:%.*]]
146 ; CHECK:       f:
147 ; CHECK-NEXT:    call void @llvm.amdgcn.s.barrier()
148 ; CHECK-NEXT:    fence release
149 ; CHECK-NEXT:    br label [[M]]
150 ; CHECK:       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
158   fence release
159   call void @llvm.amdgcn.s.barrier()
160   fence release
161   br label %m
163   fence release
164   call void @llvm.amdgcn.s.barrier()
165   fence release
166   br label %m
168   fence release
169   call void @llvm.amdgcn.s.barrier()
170   fence release
171   ret void
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:%.*]]
178 ; CHECK:       m:
179 ; CHECK-NEXT:    call void @llvm.amdgcn.s.barrier()
180 ; CHECK-NEXT:    ret void
182   br label %m
184   call void @llvm.amdgcn.s.barrier()
185   ret void
187 define void @pos_empty_11() "kernel" {
188 ; CHECK-LABEL: define {{[^@]+}}@pos_empty_11
189 ; CHECK-SAME: () #[[ATTR4]] {
190 ; CHECK-NEXT:    br label [[M:%.*]]
191 ; CHECK:       m:
192 ; CHECK-NEXT:    ret void
194   br label %m
196   call void @aligned_barrier()
197   call void @llvm.amdgcn.s.barrier()
198   ret void
200 define void @empty() {
201 ; CHECK-LABEL: define {{[^@]+}}@empty() {
202 ; CHECK-NEXT:    ret void
204   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:%.*]]
211 ; MODULE:       t:
212 ; MODULE-NEXT:    call void @llvm.amdgcn.s.barrier()
213 ; MODULE-NEXT:    br label [[M:%.*]]
214 ; MODULE:       f:
215 ; MODULE-NEXT:    br label [[M]]
216 ; MODULE:       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:%.*]]
223 ; CGSCC:       t:
224 ; CGSCC-NEXT:    call void @empty()
225 ; CGSCC-NEXT:    call void @llvm.amdgcn.s.barrier()
226 ; CGSCC-NEXT:    br label [[M:%.*]]
227 ; CGSCC:       f:
228 ; CGSCC-NEXT:    call void @empty()
229 ; CGSCC-NEXT:    br label [[M]]
230 ; CGSCC:       m:
231 ; CGSCC-NEXT:    call void @llvm.amdgcn.s.barrier()
232 ; CGSCC-NEXT:    ret void
234   br i1 %c, label %t, label %f
236   call void @empty()
237   call void @llvm.amdgcn.s.barrier()
238   br label %m
240   call void @empty()
241   br label %m
243   call void @llvm.amdgcn.s.barrier()
244   ret void
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
252   call void @unknown()
253   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()
261   ret void
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()
289   %d = add i32 %a, %b
290   %e = add i32 %d, %c
291   call void @useI32(i32 %e)
292   ret void
294 @G = global i32 42
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()
321   %d = add i32 %a, %b
322   %e = add i32 %d, %c
323   call void @useI32(i32 %e)
324   ret void
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
344   %loc = alloca i32
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()
357   ret void
359 @G1 = global i32 42
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
378   fence seq_cst
379   call void @aligned_barrier()
380   store i32 %a, ptr %arg
381   fence release
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
386   fence acquire
387   call void @aligned_barrier()
388   ret void
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()
404   ret void
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:%.*]]
411 ; CHECK:       t0:
412 ; CHECK-NEXT:    br label [[T0B:%.*]]
413 ; CHECK:       t0b:
414 ; CHECK-NEXT:    br label [[M:%.*]]
415 ; CHECK:       f0:
416 ; CHECK-NEXT:    br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
417 ; CHECK:       t1:
418 ; CHECK-NEXT:    br label [[M]]
419 ; CHECK:       f1:
420 ; CHECK-NEXT:    br label [[M]]
421 ; CHECK:       m:
422 ; CHECK-NEXT:    ret void
424   fence acquire
425   call void @llvm.nvvm.barrier0()
426   fence release
427   call void @aligned_barrier()
428   fence seq_cst
429   br i1 %c0, label %t0, label %f0
431   fence seq_cst
432   call void @aligned_barrier()
433   fence seq_cst
434   br label %t0b
435 t0b:
436   fence seq_cst
437   call void @aligned_barrier()
438   fence seq_cst
439   br label %m
441   fence release
442   call void @aligned_barrier()
443   fence acquire
444   call void @llvm.nvvm.barrier0()
445   fence acquire
446   br i1 %c1, label %t1, label %f1
448   fence acquire
449   call void @aligned_barrier()
450   fence seq_cst
451   br label %m
453   fence seq_cst
454   call void @aligned_barrier()
455   fence acquire
456   br label %m
458   fence seq_cst
459   call void @aligned_barrier()
460   fence seq_cst
461   ret void
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:%.*]]
470 ; CHECK:       t0:
471 ; CHECK-NEXT:    br label [[T0B:%.*]]
472 ; CHECK:       t0b:
473 ; CHECK-NEXT:    br label [[M:%.*]]
474 ; CHECK:       f0:
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:%.*]]
478 ; CHECK:       t1:
479 ; CHECK-NEXT:    br label [[M]]
480 ; CHECK:       f1:
481 ; CHECK-NEXT:    br label [[M]]
482 ; CHECK:       m:
483 ; CHECK-NEXT:    store i32 4, ptr [[P]], align 4
484 ; CHECK-NEXT:    ret void
486   call void @llvm.nvvm.barrier0()
487   store i32 4, ptr %p
488   call void @aligned_barrier()
489   br i1 %c0, label %t0, label %f0
491   call void @aligned_barrier()
492   br label %t0b
493 t0b:
494   call void @aligned_barrier()
495   br label %m
497   call void @aligned_barrier()
498   store i32 4, ptr %p
499   call void @llvm.nvvm.barrier0()
500   br i1 %c1, label %t1, label %f1
502   call void @aligned_barrier()
503   br label %m
505   call void @aligned_barrier()
506   br label %m
508   store i32 4, ptr %p
509   call void @aligned_barrier()
510   ret void
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:%.*]]
517 ; CHECK:       t0:
518 ; CHECK-NEXT:    br label [[T0B:%.*]]
519 ; CHECK:       t0b:
520 ; CHECK-NEXT:    br label [[M:%.*]]
521 ; CHECK:       f0:
522 ; CHECK-NEXT:    br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
523 ; CHECK:       t1:
524 ; CHECK-NEXT:    br label [[M]]
525 ; CHECK:       f1:
526 ; CHECK-NEXT:    br label [[M]]
527 ; CHECK:       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()
535   br label %t0b
536 t0b:
537   call void @aligned_barrier()
538   br label %m
540   call void @aligned_barrier()
541   call void @llvm.nvvm.barrier0()
542   br i1 %c1, label %t1, label %f1
544   call void @aligned_barrier()
545   br label %m
547   call void @aligned_barrier()
548   br label %m
550   call void @aligned_barrier()
551   ret void
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:%.*]]
558 ; CHECK:       t0:
559 ; CHECK-NEXT:    br label [[T0B:%.*]]
560 ; CHECK:       t0b:
561 ; CHECK-NEXT:    br label [[M:%.*]]
562 ; CHECK:       f0:
563 ; CHECK-NEXT:    br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
564 ; CHECK:       t1:
565 ; CHECK-NEXT:    br label [[M]]
566 ; CHECK:       f1:
567 ; CHECK-NEXT:    br label [[M]]
568 ; CHECK:       m:
569 ; CHECK-NEXT:    ret void
571   br i1 %c0, label %t0, label %f0
573   call void @aligned_barrier()
574   br label %t0b
575 t0b:
576   call void @aligned_barrier()
577   br label %m
579   call void @aligned_barrier()
580   call void @llvm.nvvm.barrier0()
581   br i1 %c1, label %t1, label %f1
583   call void @aligned_barrier()
584   br label %m
586   call void @aligned_barrier()
587   br label %m
589   call void @aligned_barrier()
590   ret void
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:%.*]]
597 ; CHECK:       t0:
598 ; CHECK-NEXT:    br label [[T0B:%.*]]
599 ; CHECK:       t0b:
600 ; CHECK-NEXT:    br label [[M:%.*]]
601 ; CHECK:       f0:
602 ; CHECK-NEXT:    br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
603 ; CHECK:       t1:
604 ; CHECK-NEXT:    br label [[M]]
605 ; CHECK:       f1:
606 ; CHECK-NEXT:    br label [[M]]
607 ; CHECK:       m:
608 ; CHECK-NEXT:    ret void
610   br i1 %c0, label %t0, label %f0
612   br label %t0b
613 t0b:
614   br label %m
616   call void @aligned_barrier()
617   call void @llvm.nvvm.barrier0()
618   br i1 %c1, label %t1, label %f1
620   call void @aligned_barrier()
621   br label %m
623   call void @aligned_barrier()
624   br label %m
626   call void @aligned_barrier()
627   ret void
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:%.*]]
636 ; CHECK:       t0:
637 ; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
638 ; CHECK-NEXT:    br label [[T0B:%.*]]
639 ; CHECK:       t0b:
640 ; CHECK-NEXT:    call void @aligned_barrier()
641 ; CHECK-NEXT:    br label [[M:%.*]]
642 ; CHECK:       f0:
643 ; CHECK-NEXT:    store i32 2, ptr [[P]], align 4
644 ; CHECK-NEXT:    br i1 [[C1]], label [[T1:%.*]], label [[F1:%.*]]
645 ; CHECK:       t1:
646 ; CHECK-NEXT:    call void @aligned_barrier()
647 ; CHECK-NEXT:    br label [[M]]
648 ; CHECK:       f1:
649 ; CHECK-NEXT:    call void @aligned_barrier()
650 ; CHECK-NEXT:    br label [[M]]
651 ; CHECK:       m:
652 ; CHECK-NEXT:    store i32 3, ptr [[P]], align 4
653 ; CHECK-NEXT:    ret void
655   call void @aligned_barrier()
656   store i32 0, ptr %p
657   call void @aligned_barrier()
658   br i1 %c0, label %t0, label %f0
660   call void @aligned_barrier()
661   store i32 1, ptr %p
662   br label %t0b
663 t0b:
664   call void @aligned_barrier()
665   br label %m
667   call void @aligned_barrier()
668   call void @llvm.nvvm.barrier0()
669   store i32 2, ptr %p
670   br i1 %c1, label %t1, label %f1
672   call void @aligned_barrier()
673   br label %m
675   call void @aligned_barrier()
676   br label %m
678   call void @aligned_barrier()
679   store i32 3, ptr %p
680   call void @aligned_barrier()
681   ret void
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
691   store i32 0, ptr %p
692   call void @aligned_barrier()
693   ret void
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()
708   store i32 0, ptr %p
709   ret void
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()
726   store i32 0, ptr %p
727   call void @aligned_barrier()
728   ret void
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:%.*]]
735 ; MODULE:       t03:
736 ; MODULE-NEXT:    call void @barrier_then_write0(ptr [[P]])
737 ; MODULE-NEXT:    br label [[T0B3:%.*]]
738 ; MODULE:       t0b3:
739 ; MODULE-NEXT:    br label [[M3:%.*]]
740 ; MODULE:       f03:
741 ; MODULE-NEXT:    call void @barrier_then_write0(ptr [[P]])
742 ; MODULE-NEXT:    br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
743 ; MODULE:       t13:
744 ; MODULE-NEXT:    br label [[M3]]
745 ; MODULE:       f13:
746 ; MODULE-NEXT:    br label [[M3]]
747 ; MODULE:       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:%.*]]
756 ; CGSCC:       t03:
757 ; CGSCC-NEXT:    call void @barrier_then_write0(ptr [[P]])
758 ; CGSCC-NEXT:    br label [[T0B3:%.*]]
759 ; CGSCC:       t0b3:
760 ; CGSCC-NEXT:    call void @aligned_barrier()
761 ; CGSCC-NEXT:    br label [[M3:%.*]]
762 ; CGSCC:       f03:
763 ; CGSCC-NEXT:    call void @barrier_then_write0(ptr [[P]])
764 ; CGSCC-NEXT:    br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
765 ; CGSCC:       t13:
766 ; CGSCC-NEXT:    call void @aligned_barrier()
767 ; CGSCC-NEXT:    br label [[M3]]
768 ; CGSCC:       f13:
769 ; CGSCC-NEXT:    call void @aligned_barrier()
770 ; CGSCC-NEXT:    br label [[M3]]
771 ; CGSCC:       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
778 t03:
779   call void @barrier_then_write0(ptr %p)
780   br label %t0b3
781 t0b3:
782   call void @aligned_barrier()
783   br label %m3
784 f03:
785   call void @aligned_barrier()
786   call void @barrier_then_write0(ptr %p)
787   br i1 %c1, label %t13, label %f13
788 t13:
789   call void @aligned_barrier()
790   br label %m3
791 f13:
792   call void @aligned_barrier()
793   br label %m3
795   call void @aligned_barrier()
796   call void @write_then_barrier0(ptr %p)
797   ret void
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
806   store i32 0, ptr %p
807   call void @aligned_barrier()
808   ret void
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()
823   store i32 0, ptr %p
824   ret void
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()
835   store i32 0, ptr %p
836   call void @aligned_barrier()
837   ret void
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:%.*]]
844 ; MODULE:       t03:
845 ; MODULE-NEXT:    call void @barrier_then_write1(ptr [[P]])
846 ; MODULE-NEXT:    br label [[T0B3:%.*]]
847 ; MODULE:       t0b3:
848 ; MODULE-NEXT:    call void @aligned_barrier()
849 ; MODULE-NEXT:    br label [[M3:%.*]]
850 ; MODULE:       f03:
851 ; MODULE-NEXT:    call void @barrier_then_write1(ptr [[P]])
852 ; MODULE-NEXT:    br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
853 ; MODULE:       t13:
854 ; MODULE-NEXT:    call void @aligned_barrier()
855 ; MODULE-NEXT:    br label [[M3]]
856 ; MODULE:       f13:
857 ; MODULE-NEXT:    call void @aligned_barrier()
858 ; MODULE-NEXT:    br label [[M3]]
859 ; MODULE:       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:%.*]]
868 ; CGSCC:       t03:
869 ; CGSCC-NEXT:    call void @barrier_then_write1(ptr [[P]])
870 ; CGSCC-NEXT:    br label [[T0B3:%.*]]
871 ; CGSCC:       t0b3:
872 ; CGSCC-NEXT:    call void @aligned_barrier()
873 ; CGSCC-NEXT:    br label [[M3:%.*]]
874 ; CGSCC:       f03:
875 ; CGSCC-NEXT:    call void @barrier_then_write1(ptr [[P]])
876 ; CGSCC-NEXT:    br i1 [[C1]], label [[T13:%.*]], label [[F13:%.*]]
877 ; CGSCC:       t13:
878 ; CGSCC-NEXT:    call void @aligned_barrier()
879 ; CGSCC-NEXT:    br label [[M3]]
880 ; CGSCC:       f13:
881 ; CGSCC-NEXT:    call void @aligned_barrier()
882 ; CGSCC-NEXT:    br label [[M3]]
883 ; CGSCC:       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
890 t03:
891   call void @barrier_then_write1(ptr %p)
892   br label %t0b3
893 t0b3:
894   call void @aligned_barrier()
895   br label %m3
896 f03:
897   call void @aligned_barrier()
898   call void @barrier_then_write1(ptr %p)
899   br i1 %c1, label %t13, label %f13
900 t13:
901   call void @aligned_barrier()
902   br label %m3
903 f13:
904   call void @aligned_barrier()
905   br label %m3
907   call void @aligned_barrier()
908   call void @write_then_barrier1(ptr %p)
909   ret void
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
919   store i32 0, ptr %p
920   call void @aligned_barrier()
921   ret void
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()
931   store i32 0, ptr %p
932   ret void
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()
949   store i32 0, ptr %p
950   call void @aligned_barrier()
951   ret void
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:%.*]]
959 ; MODULE:       t03:
960 ; MODULE-NEXT:    call void @barrier_then_write2(ptr [[P]])
961 ; MODULE-NEXT:    br label [[T0B3:%.*]]
962 ; MODULE:       t0b3:
963 ; MODULE-NEXT:    call void @aligned_barrier()
964 ; MODULE-NEXT:    br label [[M3:%.*]]
965 ; MODULE:       f03:
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:%.*]]
969 ; MODULE:       t13:
970 ; MODULE-NEXT:    call void @aligned_barrier()
971 ; MODULE-NEXT:    br label [[M3]]
972 ; MODULE:       f13:
973 ; MODULE-NEXT:    call void @aligned_barrier()
974 ; MODULE-NEXT:    br label [[M3]]
975 ; MODULE:       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:%.*]]
986 ; CGSCC:       t03:
987 ; CGSCC-NEXT:    call void @barrier_then_write2(ptr [[P]])
988 ; CGSCC-NEXT:    br label [[T0B3:%.*]]
989 ; CGSCC:       t0b3:
990 ; CGSCC-NEXT:    call void @aligned_barrier()
991 ; CGSCC-NEXT:    br label [[M3:%.*]]
992 ; CGSCC:       f03:
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:%.*]]
996 ; CGSCC:       t13:
997 ; CGSCC-NEXT:    call void @aligned_barrier()
998 ; CGSCC-NEXT:    br label [[M3]]
999 ; CGSCC:       f13:
1000 ; CGSCC-NEXT:    call void @aligned_barrier()
1001 ; CGSCC-NEXT:    br label [[M3]]
1002 ; CGSCC:       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()
1009   store i32 0, ptr %p
1010   br i1 %c0, label %t03, label %f03
1011 t03:
1012   call void @barrier_then_write2(ptr %p)
1013   br label %t0b3
1014 t0b3:
1015   call void @aligned_barrier()
1016   br label %m3
1017 f03:
1018   call void @aligned_barrier()
1019   call void @barrier_then_write2(ptr %p)
1020   br i1 %c1, label %t13, label %f13
1021 t13:
1022   call void @aligned_barrier()
1023   br label %m3
1024 f13:
1025   call void @aligned_barrier()
1026   br label %m3
1028   call void @aligned_barrier()
1029   call void @write_then_barrier2(ptr %p)
1030   store i32 0, ptr %p
1031   ret void
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()
1041   ret void
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()
1052   ret void
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()
1065   ret void
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}