1 // Test host code gen
2 
3 // RUN: %clang_cc1  -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
4 // RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
5 // RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
6 // RUN: %clang_cc1  -verify -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
7 // RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
8 // RUN: %clang_cc1  -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
9 
10 // RUN: %clang_cc1  -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s
11 // RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
12 // RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
13 // RUN: %clang_cc1  -verify -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s
14 // RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
15 // RUN: %clang_cc1  -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
16 // SIMD-ONLY1-NOT: {{__kmpc|__tgt}}
17 // expected-no-diagnostics
18 #ifndef HEADER
19 #define HEADER
20 
21 
22 template <typename T>
23 T tmain(T &r) {
24   int n = 1000;
25   // schedule: dynamic chunk
26   #pragma omp target map(tofrom:r)
27   #pragma omp teams
28   #pragma omp distribute parallel for reduction(+:r)
29   for (int i = 0; i < n; ++i)
30     r += (T)i;
31 
32   return r;
33 }
34 
35 int main() {
36   int n = 1000;
37   int r = 0;
38   #pragma omp target map(tofrom:r)
39   #pragma omp teams
40   #pragma omp distribute parallel for reduction(+:r)
41   for (int i = 0; i < n; ++i)
42     r += i;
43 
44   return tmain<int>(r);
45 }
46 
47 // CHECK-LABEL: main
48 // CHECK: call{{.+}} @__tgt_target_teams(
49 // CHECK: call void [[OFFL:@.+]](
50 // CHECK: call{{.+}} [[TMAIN:@.+]](i{{32|64}}
51 // CHECK: ret
52 
53 // CHECK: define{{.+}} [[OFFL]](
54 // CHECK: call{{.+}} @__kmpc_fork_teams({{.+}}, {{.+}}, {{.+}} [[TEOUTL:@.+]] to{{.+}}
55 // CHECK: ret void
56 
57 // CHECK: define{{.+}} [[TEOUTL]](
58 // CHECK: call{{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} [[PAROUTL:@.+]] to{{.+}}
59 // CHECK: ret void
60 
61 // CHECK: define{{.+}} [[PAROUTL]](
62 // CHECK: call{{.+}} @__kmpc_reduce_nowait(
63 // CHECK: call{{.+}} @__kmpc_end_reduce_nowait(
64 // CHECK: ret void
65 
66 // CHECK: define{{.+}} [[TMAIN]](i{{32|64}}
67 // CHECK: call{{.+}} @__tgt_target_teams(
68 // CHECK: call void [[TOFFL:@.+]](
69 // CHECK: ret
70 
71 // CHECK: define{{.+}} [[TOFFL]](
72 // CHECK: call{{.+}} @__kmpc_fork_teams({{.+}}, {{.+}}, {{.+}} [[TEMPLTEOUTL:@.+]] to{{.+}}
73 // CHECK: ret void
74 
75 // CHECK: define{{.+}} [[TEMPLTEOUTL]](
76 // CHECK: call{{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} [[TPAROUTL:@.+]] to{{.+}}
77 // CHECK: ret void
78 
79 // CHECK: define{{.+}} [[TPAROUTL]](
80 // CHECK: call{{.+}} @__kmpc_reduce_nowait(
81 // CHECK: call{{.+}} @__kmpc_end_reduce_nowait(
82 // CHECK: ret void
83 
84 #endif // HEADER
85