xref: /llvm-project/clang/test/OpenMP/cancel_codegen.cpp (revision a8a9153a372afcfe2d18399b079bfdc5fd4da626)
1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple x86_64-apple-darwin13.4.0 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -triple x86_64-apple-darwin13.4.0 -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
8 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
9 // expected-no-diagnostics
10 #ifndef HEADER
11 #define HEADER
12 
13 float flag;
14 int main (int argc, char **argv) {
15 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
16 #pragma omp parallel
17 {
18 #pragma omp cancel parallel if(flag)
19   argv[0][0] = argc;
20 #pragma omp barrier
21   argv[0][0] += argc;
22 }
23 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
24 #pragma omp sections
25 {
26 #pragma omp cancel sections
27 }
28 // CHECK: call void @__kmpc_for_static_init_4(
29 // CHECK: call i32 @__kmpc_cancel(
30 // CHECK: call void @__kmpc_for_static_fini(
31 // CHECK: call void @__kmpc_barrier(%ident_t*
32 #pragma omp sections
33 {
34 #pragma omp cancel sections
35 #pragma omp section
36   {
37 #pragma omp cancel sections
38   }
39 }
40 // CHECK: call void @__kmpc_for_static_init_4(
41 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
42 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
43 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
44 // CHECK: [[EXIT]]
45 // CHECK: br label
46 // CHECK: [[CONTINUE]]
47 // CHECK: br label
48 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
49 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
50 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
51 // CHECK: [[EXIT]]
52 // CHECK: br label
53 // CHECK: [[CONTINUE]]
54 // CHECK: br label
55 // CHECK: call void @__kmpc_for_static_fini(
56 #pragma omp for
57 for (int i = 0; i < argc; ++i) {
58 #pragma omp cancel for if(cancel: flag)
59 }
60 // CHECK: call void @__kmpc_for_static_init_4(
61 // CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
62 // CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
63 // CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
64 // CHECK: [[THEN]]
65 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 2)
66 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
67 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
68 // CHECK: [[EXIT]]
69 // CHECK: br label
70 // CHECK: [[CONTINUE]]
71 // CHECK: br label
72 // CHECK: [[ELSE]]
73 // CHECK: br label
74 // CHECK: call void @__kmpc_for_static_fini(
75 // CHECK: call void @__kmpc_barrier(%ident_t*
76 #pragma omp task
77 {
78 #pragma omp cancel taskgroup
79 }
80 // CHECK: call i8* @__kmpc_omp_task_alloc(
81 // CHECK: call i32 @__kmpc_omp_task(
82 #pragma omp parallel sections
83 {
84 #pragma omp cancel sections
85 }
86 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
87 #pragma omp parallel sections
88 {
89 #pragma omp cancel sections
90 #pragma omp section
91   {
92 #pragma omp cancel sections
93   }
94 }
95 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
96 int r = 0;
97 #pragma omp parallel for reduction(+: r)
98 for (int i = 0; i < argc; ++i) {
99 #pragma omp cancel for
100   r += i;
101 }
102 // CHECK: call void (%ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
103   return argc;
104 }
105 
106 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
107 // CHECK: [[FLAG:%.+]] = load float, float* @{{.+}},
108 // CHECK: [[BOOL:%.+]] = fcmp une float [[FLAG]], 0.000000e+00
109 // CHECK: br i1 [[BOOL]], label %[[THEN:[^,]+]], label %[[ELSE:[^,]+]]
110 // CHECK: [[THEN]]
111 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 1)
112 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
113 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
114 // CHECK: [[EXIT]]
115 // CHECK: br label %[[RETURN:.+]]
116 // CHECK: [[ELSE]]
117 // The barrier directive should now call __kmpc_cancel_barrier
118 // CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
119 // CHECK: br label
120 // CHECK: [[RETURN]]
121 // CHECK: ret void
122 
123 // CHECK: define internal i32 @{{[^(]+}}(i32
124 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 {{[^,]+}}, i32 4)
125 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
126 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,]+]],
127 // CHECK: [[EXIT]]
128 // CHECK: br label %[[RETURN:.+]]
129 // CHECK: [[RETURN]]
130 // CHECK: ret i32 0
131 
132 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
133 // CHECK: call void @__kmpc_for_static_init_4(
134 // CHECK: call i32 @__kmpc_cancel(
135 // CHECK: call void @__kmpc_for_static_fini(
136 // CHECK: ret void
137 
138 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
139 // CHECK: call void @__kmpc_for_static_init_4(
140 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
141 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
142 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
143 // CHECK: [[EXIT]]
144 // CHECK: br label
145 // CHECK: [[CONTINUE]]
146 // CHECK: br label
147 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
148 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
149 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
150 // CHECK: [[EXIT]]
151 // CHECK: br label
152 // CHECK: [[CONTINUE]]
153 // CHECK: br label
154 // CHECK: call void @__kmpc_for_static_fini(
155 // CHECK: ret void
156 
157 // CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}},
158 // CHECK: call void @__kmpc_for_static_init_4(
159 // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 2)
160 // CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
161 // CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
162 // CHECK: [[EXIT]]
163 // CHECK: br label
164 // CHECK: [[CONTINUE]]
165 // CHECK: br label
166 // CHECK: call void @__kmpc_for_static_fini(
167 // CHECK: call i32 @__kmpc_reduce_nowait(
168 // CHECK: call void @__kmpc_end_reduce_nowait(
169 // CHECK: call void @__kmpc_for_static_fini(
170 // CHECK: ret void
171 
172 #endif
173