Clang Project

clang_source_code/test/OpenMP/cancel_codegen.cpp
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
13float flag;
14int 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 (%struct.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(%struct.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(%struct.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(%struct.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
57for (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(%struct.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(%struct.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 (%struct.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 (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(
96int r = 0;
97#pragma omp parallel for reduction(+: r)
98for (int i = 0; i < argc; ++i) {
99#pragma omp cancel for
100  r += i;
101}
102// CHECK: call void (%struct.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(%struct.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(%struct.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(%struct.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(%struct.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(%struct.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(%struct.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