1 // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
2 // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
3 // RUN: %clang_cc1 -DCHECK -fopenmp -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
4 // RUN: %clang_cc1 -DCHECK -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
5 // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
6 // RUN: %clang_cc1 -DCHECK -fopenmp -x c++ -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
7 
8 // RUN: %clang_cc1 -DLAMBDA -verify -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix LAMBDA --check-prefix LAMBDA-64
9 // RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
10 // RUN: %clang_cc1 -DLAMBDA -fopenmp -x c++  -std=c++11 -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 LAMBDA --check-prefix LAMBDA-64
11 
12 // expected-no-diagnostics
13 #ifndef HEADER
14 #define HEADER
15 
16 int x;
17 #pragma omp threadprivate(x)
18 
19 template <typename T>
20 T tmain() {
21   int a[2];
22 #pragma omp target
23 #pragma omp teams distribute parallel for copyin(x)
24   for (int i = 0; i < 2; ++i) {
25     a[i] = x;
26   }
27   return T();
28 }
29 
30 int main() {
31   int a[2];
32 #ifdef LAMBDA
33   // LAMBDA-LABEL: @main
34   // LAMBDA: call void [[OUTER_LAMBDA:@.+]](
35   [&]() {
36     // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
37     // LAMBDA: call i32 @__tgt_target_teams(
38     // LAMBDA: call void @[[LOFFL1:.+]](
39     // LAMBDA:  ret
40 #pragma omp target
41 #pragma omp teams distribute parallel for copyin(x)
42   for (int i = 0; i < 2; ++i) {
43     // LAMBDA: define{{.*}} internal{{.*}} void @[[LOFFL1]](
44     // LAMBDA: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 {{.+}}, {{.+}} @[[LOUTL1:.+]] to {{.+}})
45     // LAMBDA: ret void
46 
47     // LAMBDA: define internal void @[[LOUTL1]](
48     // Skip global, bound tid and loop vars
49     // LAMBDA: {{.+}} = alloca i32*,
50     // LAMBDA: {{.+}} = alloca i32*,
51     // LAMBDA: alloca i32,
52     // LAMBDA: alloca i32,
53     // LAMBDA: alloca i32,
54     // LAMBDA: alloca i32,
55     // LAMBDA: alloca i32,
56     a[i] = x;
57 
58     // LAMBDA: call void @__kmpc_for_static_init_4(
59     // LAMBDA: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[LPAR_OUTL:.+]] to
60     // LAMBDA: call void @__kmpc_for_static_fini(
61     // LAMBDA: ret void
62 
63     // LAMBDA: define internal void @[[LPAR_OUTL]]({{.+}})
64     // Skip global, bound tid and loop vars
65     // LAMBDA: {{.+}} = alloca i32*,
66     // LAMBDA: {{.+}} = alloca i32*,
67     // LAMBDA: alloca i{{[0-9]+}},
68     // LAMBDA: alloca i{{[0-9]+}},
69     // LAMBDA: {{%.+}} = alloca [2 x i{{[0-9]+}}]*,
70     // LAMBDA: [[X_ADDR:%.+]] = alloca i{{[0-9]+}}*,
71     // LAMBDA: alloca i32,
72     // LAMBDA: alloca i32,
73     // LAMBDA: alloca i32,
74     // LAMBDA: alloca i32,
75     // LAMBDA: alloca i32,
76 
77     // LAMBDA:  [[X_REF:%.+]] = load {{.+}}, {{.+}} [[X_ADDR]],
78 
79     // LAMBDA: call void @__kmpc_for_static_init_4(
80     // LAMBDA: [[X_VAL:%.+]] = load {{.+}}, {{.+}} [[X_REF]],
81     // LAMBDA: store {{.+}} [[X_VAL]],
82     // LAMBDA: call void [[INNER_LAMBDA:@.+]](
83     // LAMBDA: call void @__kmpc_for_static_fini(
84     // LAMBDA: ret void
85     [&]() {
86       // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
87       // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
88       a[i] = x;
89     }();
90   }
91   }();
92   return 0;
93 #else
94 #pragma omp target
95 #pragma omp teams distribute parallel for copyin(x)
96   for (int i = 0; i < 2; ++i) {
97     a[i] = x;
98   }
99   return tmain<int>();
100   //return 0;
101 #endif
102 }
103 
104 // CHECK: define {{.*}}i{{[0-9]+}} @main()
105 // CHECK: call i32 @__tgt_target_teams(
106 // CHECK: call void @[[OFFL1:.+]](i{{64|32}} %{{.+}})
107 // CHECK: {{%.+}} = call{{.*}} i32 @[[TMAIN_INT:.+]]()
108 // CHECK:  ret
109 
110 // CHECK: define{{.*}} void @[[OFFL1]]({{.+}})
111 // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 {{.+}}, {{.+}} @[[OUTL1:.+]] to {{.+}})
112 // CHECK: ret void
113 
114 // CHECK: define internal void @[[OUTL1]]({{.+}})
115 // Skip global, bound tid and loop vars
116 // CHECK: {{.+}} = alloca i32*,
117 // CHECK: {{.+}} = alloca i32*,
118 // CHECK: {{.+}} = alloca i32,
119 // CHECK: {{.+}} = alloca i32,
120 // CHECK: {{.+}} = alloca i32,
121 // CHECK: {{.+}} = alloca i32,
122 // CHECK: {{.+}} = alloca i32,
123 
124 // CHECK: call void @__kmpc_for_static_init_4(
125 // CHECK: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[PAR_OUTL1:.+]] to
126 // CHECK: call void @__kmpc_for_static_fini(
127 // CHECK: ret void
128 
129 // CHECK: define internal void @[[PAR_OUTL1]]({{.+}})
130 // Skip global, bound tid and loop vars
131 // CHECK: {{.+}} = alloca i32*,
132 // CHECK: {{.+}} = alloca i32*,
133 // CHECK: {{.+}} = alloca i{{[0-9]+}},
134 // CHECK: {{.+}} = alloca i{{[0-9]+}},
135 // CHECK: {{%.+}} = alloca [2 x i{{[0-9]+}}]*,
136 // CHECK: [[X_ADDR:%.+]] = alloca i{{[0-9]+}}*,
137 // CHECK: {{.+}} = alloca i32,
138 // CHECK: {{.+}} = alloca i32,
139 // CHECK: {{.+}} = alloca i32,
140 // CHECK: {{.+}} = alloca i32,
141 // CHECK: {{.+}} = alloca i32,
142 
143 // CHECK:  [[X_REF:%.+]] = load {{.+}}, {{.+}} [[X_ADDR]],
144 // CHECK: call void @__kmpc_for_static_init_4(
145 // CHECK:  [[X_VAL:%.+]] = load {{.+}}, {{.+}} [[X_REF]],
146 // CHECK: store {{.+}} [[X_VAL]],
147 // CHECK: call void @__kmpc_for_static_fini(
148 // CHECK: ret void
149 
150 // CHECK: define{{.*}} i{{[0-9]+}} @[[TMAIN_INT]]()
151 // CHECK: call i32 @__tgt_target_teams(
152 // CHECK: call void @[[TOFFL1:.+]](
153 // CHECK:  ret
154 
155 // CHECK: define {{.*}}void @[[TOFFL1]](
156 // CHECK: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 {{.+}}, {{.+}} @[[TOUTL1:.+]] to {{.+}})
157 // CHECK: ret void
158 
159 // CHECK: define internal void @[[TOUTL1]]({{.+}})
160 // Skip global, bound tid and loop vars
161 // CHECK: {{.+}} = alloca i32*,
162 // CHECK: {{.+}} = alloca i32*,
163 // CHECK: alloca i{{[0-9]+}},
164 // CHECK: alloca i{{[0-9]+}},
165 // CHECK: alloca i{{[0-9]+}},
166 // CHECK: alloca i{{[0-9]+}},
167 // CHECK: alloca i{{[0-9]+}},
168 
169 // CHECK: call void @__kmpc_for_static_init_4(
170 // CHECK: call void {{.+}} @__kmpc_fork_call({{.+}}, {{.+}}, {{.+}} @[[TPAR_OUTL1:.+]] to
171 // CHECK: call void @__kmpc_for_static_fini(
172 // CHECK: ret void
173 
174 // CHECK: define internal void @[[TPAR_OUTL1]]({{.+}})
175 // Skip global, bound tid and loop vars
176 // CHECK: {{.+}} = alloca i32*,
177 // CHECK: {{.+}} = alloca i32*,
178 // prev lb and ub
179 // CHECK: alloca i{{[0-9]+}},
180 // CHECK: alloca i{{[0-9]+}},
181 
182 // CHECK: {{%.+}} = alloca [2 x i{{[0-9]+}}]*,
183 // CHECK: [[X_ADDR:%.+]] = alloca i{{[0-9]+}}*,
184 // iter variables
185 // CHECK: alloca i{{[0-9]+}},
186 // CHECK: alloca i{{[0-9]+}},
187 // CHECK: alloca i{{[0-9]+}},
188 // CHECK: alloca i{{[0-9]+}},
189 // CHECK: alloca i{{[0-9]+}},
190 
191 // CHECK:  [[X_REF:%.+]] = load {{.+}}, {{.+}} [[X_ADDR]],
192 // CHECK: call void @__kmpc_for_static_init_4(
193 // CHECK:  [[X_VAL:%.+]] = load {{.+}}, {{.+}} [[X_REF]],
194 // CHECK: store {{.+}} [[X_VAL]],
195 // CHECK: call void @__kmpc_for_static_fini(
196 // CHECK: ret void
197 
198 
199 #endif
200