1532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-version=51 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,NORMAL
2532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
3532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-version=51 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,NORMAL
4532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=51 -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck %s --check-prefix=TERM_DEBUG
5532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER
6532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
7532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-version=51 -fopenmp-enable-irbuilder -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefixes=ALL,IRBUILDER
8e0c2125dScchen
9532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp-simd -fopenmp-version=51 -x c++ -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck --check-prefix SIMD-ONLY0 %s
10532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
11532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -fopenmp-version=51 -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
12532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fopenmp-version=51 -fexceptions -fcxx-exceptions -debug-info-kind=line-tables-only -x c++ -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
13e0c2125dScchen // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
14e0c2125dScchen // expected-no-diagnostics
15e0c2125dScchen #ifndef HEADER
16e0c2125dScchen #define HEADER
17e0c2125dScchen
189ff848c5Scchen // ALL: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* }
19e0c2125dScchen
209ff848c5Scchen // ALL: define {{.*}}void [[FOO:@.+]]()
21e0c2125dScchen
foo()22e0c2125dScchen void foo() { extern void mayThrow(); mayThrow(); }
23e0c2125dScchen
249ff848c5Scchen // ALL-LABEL: @main
25e0c2125dScchen // TERM_DEBUG-LABEL: @main
main()26e0c2125dScchen int main() {
279ff848c5Scchen // ALL: [[A_ADDR:%.+]] = alloca i8
28e0c2125dScchen char a;
29e0c2125dScchen
309ff848c5Scchen // ALL: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
319ff848c5Scchen // ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 0)
329ff848c5Scchen // ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
339ff848c5Scchen // ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
349ff848c5Scchen // ALL: [[THEN]]
359ff848c5Scchen // ALL-NEXT: store i8 2, i8* [[A_ADDR]]
36*ff289feeSMichael Kruse // IRBUILDER-NEXT: br label %[[AFTER:[^ ,]+]]
37*ff289feeSMichael Kruse // IRBUILDER: [[AFTER]]
389ff848c5Scchen // ALL-NEXT: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
399ff848c5Scchen // ALL-NEXT: br label {{%?}}[[EXIT]]
409ff848c5Scchen // ALL: [[EXIT]]
41e0c2125dScchen #pragma omp masked
42e0c2125dScchen a = 2;
439ff848c5Scchen // IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
449ff848c5Scchen // ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 2)
459ff848c5Scchen // ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
469ff848c5Scchen // ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
479ff848c5Scchen // ALL: [[THEN]]
489ff848c5Scchen // IRBUILDER-NEXT: call {{.*}}void [[FOO]]()
499ff848c5Scchen // NORMAL-NEXT: invoke {{.*}}void [[FOO]]()
509ff848c5Scchen // ALL: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
519ff848c5Scchen // ALL-NEXT: br label {{%?}}[[EXIT]]
529ff848c5Scchen // ALL: [[EXIT]]
53e0c2125dScchen #pragma omp masked filter(2)
54e0c2125dScchen foo();
559ff848c5Scchen // ALL: store i32 9, i32* [[X:.+]],
569ff848c5Scchen // ALL: [[X_VAL:%.+]] = load i32, i32* [[X]]
579ff848c5Scchen // IRBUILDER: [[GTID:%.+]] = call {{.*}}i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:@.+]])
589ff848c5Scchen // ALL: [[RES:%.+]] = call {{.*}}i32 @__kmpc_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 [[X_VAL]])
599ff848c5Scchen // ALL-NEXT: [[IS_MASKED:%.+]] = icmp ne i32 [[RES]], 0
609ff848c5Scchen // ALL-NEXT: br i1 [[IS_MASKED]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
619ff848c5Scchen // ALL: [[THEN]]
629ff848c5Scchen // IRBUILDER-NEXT: call {{.*}}void [[FOO]]()
639ff848c5Scchen // NORMAL-NEXT: invoke {{.*}}void [[FOO]]()
649ff848c5Scchen // ALL: call {{.*}}void @__kmpc_end_masked([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
659ff848c5Scchen // ALL-NEXT: br label {{%?}}[[EXIT]]
669ff848c5Scchen // ALL: [[EXIT]]
67e0c2125dScchen int x = 9;
68e0c2125dScchen #pragma omp masked filter(x)
69e0c2125dScchen foo();
709ff848c5Scchen // ALL-NOT: call i32 @__kmpc_masked
719ff848c5Scchen // ALL-NOT: call void @__kmpc_end_masked
72e0c2125dScchen return a;
73e0c2125dScchen }
74e0c2125dScchen
759ff848c5Scchen // ALL-LABEL: lambda_masked
76e0c2125dScchen // TERM_DEBUG-LABEL: lambda_masked
lambda_masked(int a,int b)77e0c2125dScchen void lambda_masked(int a, int b) {
78e0c2125dScchen auto l = [=]() {
79e0c2125dScchen #pragma omp masked
80e0c2125dScchen {
819ff848c5Scchen // ALL: call i32 @__kmpc_masked(
82e0c2125dScchen int c = a + b;
83e0c2125dScchen }
84e0c2125dScchen };
85e0c2125dScchen
86e0c2125dScchen l();
87e0c2125dScchen
88e0c2125dScchen auto l1 = [=]() {
89e0c2125dScchen #pragma omp parallel
90e0c2125dScchen #pragma omp masked filter(1)
91e0c2125dScchen {
929ff848c5Scchen // ALL: call i32 @__kmpc_masked(
93e0c2125dScchen int c = a + b;
94e0c2125dScchen }
95e0c2125dScchen };
96e0c2125dScchen
97e0c2125dScchen l1();
98e0c2125dScchen
99e0c2125dScchen int y = 1;
100e0c2125dScchen auto l2 = [=](int yy) {
101e0c2125dScchen #pragma omp parallel
102e0c2125dScchen #pragma omp masked filter(yy)
103e0c2125dScchen {
1049ff848c5Scchen // ALL: call i32 @__kmpc_masked(
105e0c2125dScchen int c = a + b;
106e0c2125dScchen }
107e0c2125dScchen };
108e0c2125dScchen
109e0c2125dScchen l2(y);
110e0c2125dScchen }
111e0c2125dScchen
1129ff848c5Scchen // ALL-LABEL: parallel_masked
113e0c2125dScchen // TERM_DEBUG-LABEL: parallel_masked
parallel_masked()114e0c2125dScchen void parallel_masked() {
115e0c2125dScchen #pragma omp parallel
116e0c2125dScchen #pragma omp masked filter(1)
1179ff848c5Scchen // TERM_DEBUG-NOT: __kmpc_global_thread_num
118e0c2125dScchen // TERM_DEBUG: call i32 @__kmpc_masked({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
119e0c2125dScchen // TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
120e0c2125dScchen // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
121e0c2125dScchen // TERM_DEBUG-NOT: __kmpc_global_thread_num
122e0c2125dScchen // TERM_DEBUG: call void @__kmpc_end_masked({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
123e0c2125dScchen // TERM_DEBUG: [[TERM_LPAD]]
124e0c2125dScchen // TERM_DEBUG: call void @__clang_call_terminate
125e0c2125dScchen // TERM_DEBUG: unreachable
126e0c2125dScchen foo();
127e0c2125dScchen
128e0c2125dScchen int x;
129e0c2125dScchen #pragma omp parallel
130e0c2125dScchen #pragma omp masked filter(x)
1319ff848c5Scchen // TERM_DEBUG-NOT: __kmpc_global_thread_num
132e0c2125dScchen // TERM_DEBUG: call i32 @__kmpc_masked({{.+}}), !dbg [[DBG_LOC_START:![0-9]+]]
133e0c2125dScchen // TERM_DEBUG: invoke void {{.*}}foo{{.*}}()
134e0c2125dScchen // TERM_DEBUG: unwind label %[[TERM_LPAD:.+]],
135e0c2125dScchen // TERM_DEBUG-NOT: __kmpc_global_thread_num
136e0c2125dScchen // TERM_DEBUG: call void @__kmpc_end_masked({{.+}}), !dbg [[DBG_LOC_END:![0-9]+]]
137e0c2125dScchen // TERM_DEBUG: [[TERM_LPAD]]
138e0c2125dScchen // TERM_DEBUG: call void @__clang_call_terminate
139e0c2125dScchen // TERM_DEBUG: unreachable
140e0c2125dScchen foo();
141e0c2125dScchen }
142e0c2125dScchen // TERM_DEBUG-DAG: [[DBG_LOC_START]] = !DILocation(line: [[@LINE-12]],
143e0c2125dScchen // TERM_DEBUG-DAG: [[DBG_LOC_END]] = !DILocation(line: [[@LINE-3]],
144e0c2125dScchen
145e0c2125dScchen #endif
146