}
define internal void @write_then_barrier0(i32* %p) {
-; MODULE-LABEL: define {{[^@]+}}@write_then_barrier0
-; MODULE-SAME: (ptr [[P:%.*]]) {
-; MODULE-NEXT: store i32 0, ptr [[P]], align 4
-; MODULE-NEXT: ret void
-;
-; CGSCC-LABEL: define {{[^@]+}}@write_then_barrier0
-; CGSCC-SAME: (ptr [[P:%.*]]) {
-; CGSCC-NEXT: store i32 0, ptr [[P]], align 4
-; CGSCC-NEXT: call void @aligned_barrier()
-; CGSCC-NEXT: ret void
+; CHECK-LABEL: define {{[^@]+}}@write_then_barrier0
+; CHECK-SAME: (ptr [[P:%.*]]) {
+; CHECK-NEXT: store i32 0, ptr [[P]], align 4
+; CHECK-NEXT: call void @aligned_barrier()
+; CHECK-NEXT: ret void
;
store i32 0, i32* %p
call void @aligned_barrier()
ret void
}
+; Verify we do not remove the barrier in the callee.
+define internal void @callee_barrier() {
+; CHECK-LABEL: define {{[^@]+}}@callee_barrier() {
+; CHECK-NEXT: call void @aligned_barrier()
+; CHECK-NEXT: ret void
+;
+ call void @aligned_barrier()
+ ret void
+}
+define void @caller_barrier1() {
+; CHECK-LABEL: define {{[^@]+}}@caller_barrier1() {
+; CHECK-NEXT: call void @callee_barrier()
+; CHECK-NEXT: ret void
+;
+ call void @aligned_barrier()
+ call void @callee_barrier()
+ call void @aligned_barrier()
+ ret void
+}
+define void @caller_barrier2() {
+; CHECK-LABEL: define {{[^@]+}}@caller_barrier2() {
+; CHECK-NEXT: call void @unknown()
+; CHECK-NEXT: call void @callee_barrier()
+; CHECK-NEXT: call void @unknown()
+; CHECK-NEXT: ret void
+;
+ call void @unknown()
+ call void @callee_barrier()
+ call void @unknown()
+ ret void
+}
+
!llvm.module.flags = !{!16,!15}
-!nvvm.annotations = !{!0,!1,!2,!3,!4,!5,!6,!7,!8,!9,!10,!11,!12,!13,!14,!17,!18,!19,!20,!21,!22,!23}
+!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}
!0 = !{void ()* @pos_empty_1, !"kernel", i32 1}
!1 = !{void ()* @pos_empty_2, !"kernel", i32 1}
!17 = !{void ()* @pos_empty_7a, !"kernel", i32 1}
!18 = !{void ()* @pos_empty_7b, !"kernel", i32 1}
!23 = !{void (i1)* @pos_empty_8, !"kernel", i32 1}
+!24 = !{void ()* @caller_barrier1, !"kernel", i32 1}
+!25 = !{void ()* @caller_barrier2, !"kernel", i32 1}
!6 = !{void ()* @neg_empty_8, !"kernel", i32 1}
!19 = !{void (i1)* @neg_empty_9, !"kernel", i32 1}
!20 = !{void ()* @pos_empty_10, !"kernel", i32 1}
; CHECK: [[META21:![0-9]+]] = !{ptr @pos_empty_11, !"kernel", i32 1}
; CHECK: [[META22:![0-9]+]] = !{ptr @neg_empty_12, !"kernel", i32 1}
; CHECK: [[META23:![0-9]+]] = !{ptr @pos_empty_8, !"kernel", i32 1}
+; CHECK: [[META24:![0-9]+]] = !{ptr @caller_barrier1, !"kernel", i32 1}
+; CHECK: [[META25:![0-9]+]] = !{ptr @caller_barrier2, !"kernel", i32 1}
;.