1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
2; RUN: opt -S -passes=openmp-opt < %s | FileCheck %s
3target triple = "nvptx64"
4
5%struct.ident_t = type { i32, i32, i32, i32, i8* }
6
7@no_spmd_exec_mode = weak constant i8 1
8@spmd_exec_mode = weak constant i8 0
9@parallel_exec_mode = weak constant i8 0
10@G = external global i8
11@llvm.compiler.used = appending global [3 x i8*] [i8* @no_spmd_exec_mode, i8* @spmd_exec_mode, i8* @parallel_exec_mode], section "llvm.metadata"
12
13;.
14; CHECK: @[[NO_SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 1
15; CHECK: @[[SPMD_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 0
16; CHECK: @[[PARALLEL_EXEC_MODE:[a-zA-Z0-9_$"\\.-]+]] = weak constant i8 0
17; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external global i8
18; CHECK: @[[LLVM_COMPILER_USED:[a-zA-Z0-9_$"\\.-]+]] = appending global [3 x i8*] [i8* @no_spmd_exec_mode, i8* @spmd_exec_mode, i8* @parallel_exec_mode], section "llvm.metadata"
19;.
20define weak void @none_spmd() {
21; CHECK-LABEL: define {{[^@]+}}@none_spmd() {
22; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
23; CHECK-NEXT:    call void @none_spmd_helper()
24; CHECK-NEXT:    call void @mixed_helper()
25; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
26; CHECK-NEXT:    ret void
27;
28  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 false, i1 false, i1 false)
29  call void @none_spmd_helper()
30  call void @mixed_helper()
31  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 false, i1 false)
32  ret void
33}
34
35define weak void @spmd() {
36; CHECK-LABEL: define {{[^@]+}}@spmd() {
37; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false)
38; CHECK-NEXT:    call void @spmd_helper()
39; CHECK-NEXT:    call void @mixed_helper()
40; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
41; CHECK-NEXT:    ret void
42;
43  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false)
44  call void @spmd_helper()
45  call void @mixed_helper()
46  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
47  ret void
48}
49
50define weak void @parallel() {
51; CHECK-LABEL: define {{[^@]+}}@parallel() {
52; CHECK-NEXT:    [[I:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* align 536870912 null, i1 true, i1 false, i1 false)
53; CHECK-NEXT:    call void @spmd_helper()
54; CHECK-NEXT:    call void @__kmpc_parallel_51(%struct.ident_t* noalias noundef align 536870912 null, i32 noundef 0, i32 noundef 0, i32 noundef 0, i32 noundef 0, i8* noalias noundef align 536870912 null, i8* noalias noundef align 536870912 null, i8** noalias noundef align 536870912 null, i64 noundef 0)
55; CHECK-NEXT:    call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
56; CHECK-NEXT:    ret void
57;
58  %i = call i32 @__kmpc_target_init(%struct.ident_t* null, i1 true, i1 false, i1 false)
59  call void @spmd_helper()
60  call void @__kmpc_parallel_51(%struct.ident_t* null, i32 0, i32 0, i32 0, i32 0, i8* null, i8* null, i8** null, i64 0)
61  call void @__kmpc_target_deinit(%struct.ident_t* null, i1 true, i1 false)
62  ret void
63}
64
65define internal void @mixed_helper() {
66; CHECK-LABEL: define {{[^@]+}}@mixed_helper() {
67; CHECK-NEXT:    [[LEVEL:%.*]] = call i8 @__kmpc_parallel_level()
68; CHECK-NEXT:    store i8 [[LEVEL]], i8* @G, align 1
69; CHECK-NEXT:    ret void
70;
71  %level = call i8 @__kmpc_parallel_level()
72  store i8 %level, i8* @G
73  ret void
74}
75
76define internal void @none_spmd_helper() {
77; CHECK-LABEL: define {{[^@]+}}@none_spmd_helper() {
78; CHECK-NEXT:    [[LEVEL12:%.*]] = call i8 @__kmpc_parallel_level()
79; CHECK-NEXT:    [[C:%.*]] = icmp eq i8 [[LEVEL12]], 0
80; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
81; CHECK:       t:
82; CHECK-NEXT:    call void @foo()
83; CHECK-NEXT:    ret void
84; CHECK:       f:
85; CHECK-NEXT:    call void @bar()
86; CHECK-NEXT:    ret void
87;
88  %level12 = call i8 @__kmpc_parallel_level()
89  %c = icmp eq i8 %level12, 0
90  br i1 %c, label %t, label %f
91t:
92  call void @foo()
93  ret void
94f:
95  call void @bar()
96  ret void
97}
98
99define internal void @spmd_helper() {
100; CHECK-LABEL: define {{[^@]+}}@spmd_helper() {
101; CHECK-NEXT:    store i8 1, i8* @G, align 1
102; CHECK-NEXT:    ret void
103;
104  %level = call i8 @__kmpc_parallel_level()
105  store i8 %level, i8* @G
106  ret void
107}
108
109define internal void @__kmpc_parallel_51(%struct.ident_t*, i32, i32, i32, i32, i8*, i8*, i8**, i64) {
110; CHECK-LABEL: define {{[^@]+}}@__kmpc_parallel_51
111; CHECK-SAME: (%struct.ident_t* noalias nocapture nofree readnone align 536870912 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]], i8* noalias nocapture nofree readnone align 536870912 [[TMP5:%.*]], i8* noalias nocapture nofree readnone align 536870912 [[TMP6:%.*]], i8** noalias nocapture nofree readnone align 536870912 [[TMP7:%.*]], i64 [[TMP8:%.*]]) {
112; CHECK-NEXT:    call void @parallel_helper()
113; CHECK-NEXT:    ret void
114;
115  call void @parallel_helper()
116  ret void
117}
118
119define internal void @parallel_helper() {
120; CHECK-LABEL: define {{[^@]+}}@parallel_helper() {
121; CHECK-NEXT:    [[LEVEL:%.*]] = call i8 @__kmpc_parallel_level()
122; CHECK-NEXT:    store i8 [[LEVEL]], i8* @G, align 1
123; CHECK-NEXT:    ret void
124;
125  %level = call i8 @__kmpc_parallel_level()
126  store i8 %level, i8* @G
127  ret void
128}
129
130declare void @foo()
131declare void @bar()
132declare i8 @__kmpc_parallel_level()
133declare i32 @__kmpc_target_init(%struct.ident_t*, i1 zeroext, i1 zeroext, i1 zeroext) #1
134declare void @__kmpc_target_deinit(%struct.ident_t* nocapture readnone, i1 zeroext, i1 zeroext) #1
135
136!llvm.module.flags = !{!0, !1}
137!nvvm.annotations = !{!2, !3, !4}
138
139!0 = !{i32 7, !"openmp", i32 50}
140!1 = !{i32 7, !"openmp-device", i32 50}
141!2 = !{void ()* @none_spmd, !"kernel", i32 1}
142!3 = !{void ()* @spmd, !"kernel", i32 1}
143!4 = !{void ()* @parallel, !"kernel", i32 1}
144;.
145; CHECK: [[META0:![0-9]+]] = !{i32 7, !"openmp", i32 50}
146; CHECK: [[META1:![0-9]+]] = !{i32 7, !"openmp-device", i32 50}
147; CHECK: [[META2:![0-9]+]] = !{void ()* @none_spmd, !"kernel", i32 1}
148; CHECK: [[META3:![0-9]+]] = !{void ()* @spmd, !"kernel", i32 1}
149; CHECK: [[META4:![0-9]+]] = !{void ()* @parallel, !"kernel", i32 1}
150;.
151