1 // RUN: %clang_cc1 -verify -fopenmp -DOMP5 -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -DOMP5 -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -DOMP5 -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4
5 // RUN: %clang_cc1 -verify -fopenmp-simd -DOMP5 -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
6 // RUN: %clang_cc1 -fopenmp-simd -DOMP5 -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -DOMP5 -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
8 // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
9 // expected-no-diagnostics
10
11 #ifndef HEADER
12 #define HEADER
13
main()14 int main() {
15 int a = 0;
16 #pragma omp parallel for lastprivate(conditional: a)
17 for (int i = 0; i < 10; ++i) {
18 if (i < 5) {
19 a = 0;
20 #pragma omp parallel reduction(+:a) num_threads(10)
21 a += i;
22 #pragma omp atomic
23 a += i;
24 #pragma omp parallel num_threads(10)
25 #pragma omp atomic
26 a += i;
27 }
28 }
29 return 0;
30 }
31
32 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @{{.+}}, i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*)* [[OUTLINED:@.+]] to void (i32*, i32*, ...)*), i32* %{{.+}})
33
34 // CHECK: define internal void [[OUTLINED]](
35 // CHECK: call void @__kmpc_push_num_threads(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 10)
36 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* @{{.+}} to void (i32*, i32*, ...)*), i32* {{.+}} i32* %{{.+}})
37 // CHECK: call void @__kmpc_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}})
38 // CHECK: [[LAST_IV_VAL:%.+]] = load i32, i32* [[LAST_IV:@.+]],
39 // CHECK: [[RES:%.+]] = icmp sle i32 [[LAST_IV_VAL]], [[IV:%.+]]
40 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]]
41 // CHECK: [[THEN]]:
42 // CHECK: store i32 [[IV]], i32* [[LAST_IV]],
43 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV:%.+]],
44 // CHECK: store i32 [[A_VAL]], i32* [[A_GLOB:@.+]],
45 // CHECK: br label %[[DONE]]
46 // CHECK: [[DONE]]:
47 // CHECK: call void @__kmpc_end_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}})
48 // CHECK: atomicrmw add i32*
49 // CHECK: call void @__kmpc_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}})
50 // CHECK: [[LAST_IV_VAL:%.+]] = load i32, i32* [[LAST_IV:@.+]],
51 // CHECK: [[RES:%.+]] = icmp sle i32 [[LAST_IV_VAL]], [[IV:%.+]]
52 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]]
53 // CHECK: [[THEN]]:
54 // CHECK: store i32 [[IV]], i32* [[LAST_IV]],
55 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV:%.+]],
56 // CHECK: store i32 [[A_VAL]], i32* [[A_GLOB:@.+]],
57 // CHECK: br label %[[DONE]]
58 // CHECK: [[DONE]]:
59 // CHECK: call void @__kmpc_end_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}})
60 // CHECK: call void @__kmpc_push_num_threads(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 10)
61 // CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @{{.+}}, i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i32*)* [[OUTLINED2:@.+]] to void (i32*, i32*, ...)*), i32* {{.+}} i32* %{{.+}})
62 // CHECK: [[FIRED:%.+]] = getelementptr inbounds %struct.{{.+}}, %struct.{{.+}}* %{{.+}}, i{{.+}} 0, i{{.+}} 1
63 // CHECK: [[FIRED_VAL:%.+]] = load i8, i8* [[FIRED]],
64 // CHECK: [[CMP:%.+]] = icmp ne i8 [[FIRED_VAL]], 0
65 // CHECK: br i1 [[CMP]], label %[[CHECK_THEN:.+]], label %[[CHECK_DONE:.+]]
66 // CHECK: [[CHECK_THEN]]:
67 // CHECK: call void @__kmpc_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}})
68 // CHECK: [[LAST_IV_VAL:%.+]] = load i32, i32* [[LAST_IV:@.+]],
69 // CHECK: [[RES:%.+]] = icmp sle i32 [[LAST_IV_VAL]], [[IV:%.+]]
70 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]]
71 // CHECK: [[THEN]]:
72 // CHECK: store i32 [[IV]], i32* [[LAST_IV]],
73 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV:%.+]],
74 // CHECK: store i32 [[A_VAL]], i32* [[A_GLOB:@.+]],
75 // CHECK: br label %[[DONE]]
76 // CHECK: [[DONE]]:
77 // CHECK: call void @__kmpc_end_critical(%struct.ident_t* @{{.+}}, i32 %{{.+}}, [8 x i32]* @{{.+}})
78 // CHECK: br label %[[CHECK_DONE]]
79 // CHECK: [[CHECK_DONE]]:
80 // CHECK: call void @__kmpc_for_static_fini(%struct.ident_t* @{{.+}}, i32 %{{.+}})
81 // CHECK: [[IS_LAST:%.+]] = load i32, i32* %{{.+}},
82 // CHECK: [[RES:%.+]] = icmp ne i32 [[IS_LAST]], 0
83 // CHECK: call void @__kmpc_barrier(%struct.ident_t* @{{.+}}, i32 %{{.+}})
84 // CHECK: br i1 [[RES]], label %[[THEN:.+]], label %[[DONE:.+]]
85 // CHECK: [[THEN]]:
86 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_GLOB]],
87 // CHECK: store i32 [[A_VAL]], i32* [[A_PRIV]],
88 // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PRIV]],
89 // CHECK: store i32 [[A_VAL]], i32* %{{.+}},
90 // CHECK: br label %[[DONE]]
91 // CHECK: [[DONE]]:
92 // CHECK: ret void
93
94 // CHECK: define internal void [[OUTLINED2]](i32* {{.+}}, i32* {{.+}}, i32* {{.+}}, i32* {{.+}})
95 // CHECK: atomicrmw add i32* [[A_SHARED:%.+]], i32 %{{.+}} monotonic
96 // CHECK: [[BASE:%.+]] = bitcast i32* [[A_SHARED]] to [[STRUCT:%struct[.].+]]*
97 // CHECK: [[FIRED:%.+]] = getelementptr inbounds [[STRUCT]], [[STRUCT]]* [[BASE]], i{{.+}} 0, i{{.+}} 1
98 // CHECK: store atomic volatile i8 1, i8* [[FIRED]] unordered,
99 // CHECK: ret void
100
101 #endif // HEADER
102