blob: 8485d8d27d523ebe273110681b8826b6ba41949c [file] [log] [blame]
Alexey Bataev617db5f2017-12-04 15:38:33 +00001// 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
16template <typename T>
17T tmain() {
18 T t_var = T();
19 T vec[] = {1, 2};
20#pragma omp target
21#pragma omp teams
22#pragma omp distribute simd reduction(+: t_var)
23 for (int i = 0; i < 2; ++i) {
24 t_var += (T) i;
25 }
26 return T();
27}
28
29int main() {
30 static int sivar;
31#ifdef LAMBDA
32 // LAMBDA-LABEL: @main
33 // LAMBDA: call void [[OUTER_LAMBDA:@.+]](
34 [&]() {
35 // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
36 // LAMBDA: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 1, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i64* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 0, i32 0)
37 // LAMBDA: call void @[[LOFFL1:.+]](
38 // LAMBDA: ret
39#pragma omp target
40#pragma omp teams
41#pragma omp distribute simd reduction(+: sivar)
42 for (int i = 0; i < 2; ++i) {
43 // LAMBDA: define{{.*}} internal{{.*}} void @[[LOFFL1]](i{{64|32}} [[SIVAR_ARG:%.+]])
44 // LAMBDA: [[SIVAR_ADDR:%.+]] = alloca i{{.+}},
45 // LAMBDA: store{{.+}} [[SIVAR_ARG]], {{.+}} [[SIVAR_ADDR]],
46 // LAMBDA: [[SIVAR_CONV:%.+]] = bitcast{{.+}} [[SIVAR_ADDR]] to
47 // LAMBDA: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} @[[LOUTL1:.+]] to {{.+}}, {{.+}} [[SIVAR_CONV]])
48 // LAMBDA: ret void
49
50 // LAMBDA: define internal void @[[LOUTL1]]({{.+}}, {{.+}}, {{.+}} [[SIVAR_ARG:%.+]])
51 // Skip global and bound tid vars
52 // LAMBDA: {{.+}} = alloca i32*,
53 // LAMBDA: {{.+}} = alloca i32*,
54 // LAMBDA: [[SIVAR_ADDR:%.+]] = alloca i{{.+}}*,
55 // LAMBDA: alloca i{{.+}},
56 // LAMBDA: alloca i{{.+}},
57 // LAMBDA: alloca i{{.+}},
58 // LAMBDA: alloca i{{.+}},
59 // LAMBDA: alloca i{{.+}},
Alexey Bataevc2e88a82017-12-04 21:30:42 +000060 // LAMBDA: alloca i{{.+}},
Alexey Bataev617db5f2017-12-04 15:38:33 +000061 // LAMBDA: [[SIVAR_PRIV:%.+]] = alloca i{{.+}},
62 // LAMBDA: store{{.+}} [[SIVAR_ARG]], {{.+}} [[SIVAR_ADDR]],
63 // LAMBDA: [[SIVAR_REF:%.+]] = load{{.+}}, {{.+}} [[SIVAR_ADDR]]
64 // LAMBDA: store{{.+}} 0, {{.+}} [[SIVAR_PRIV]],
65
66 // LAMBDA: call void @__kmpc_for_static_init_4(
67 // LAMBDA: store{{.+}}, {{.+}} [[SIVAR_PRIV]],
68 // LAMBDA: call void [[INNER_LAMBDA:@.+]](
69 // LAMBDA: call void @__kmpc_for_static_fini(
70 // LAMBDA: [[LAST_ITER:%.+]] = load i32, i32* %
71 // LAMBDA: [[IS_LAST:%.+]] = icmp ne i32 [[LAST_ITER]], 0
72 // LAMBDA: br i1 [[IS_LAST]], label %[[THEN:.+]], label %[[DONE:.+]]
73 // LAMBDA: [[THEN]]
74 // LAMBDA: store i32 2, i32* %
75 // LAMBDA: br label %[[DONE]]
76 // LAMBDA: [[DONE]]
77 // LAMBDA: [[SIVAR_ORIG_VAL:%.+]] = load i32, i32* [[SIVAR_REF]],
78 // LAMBDA: [[SIVAR_PRIV_VAL:%.+]] = load i32, i32* [[SIVAR_PRIV]],
79 // LAMBDA: [[ADD:%.+]] = add nsw i32 [[SIVAR_ORIG_VAL]], [[SIVAR_PRIV_VAL]]
80 // LAMBDA: store i32 [[ADD]], i32* [[SIVAR_REF]],
81 // LAMBDA: ret void
82
83 sivar += i;
84
85 [&]() {
86 // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
87 // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
88
89 sivar += 4;
90 // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
91
92 // LAMBDA: [[SIVAR_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
93 // LAMBDA: [[SIVAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[SIVAR_PTR_REF]]
94 // LAMBDA: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR_REF]]
95 // LAMBDA: [[SIVAR_INC:%.+]] = add{{.+}} [[SIVAR_VAL]], 4
96 // LAMBDA: store i{{[0-9]+}} [[SIVAR_INC]], i{{[0-9]+}}* [[SIVAR_REF]]
97 }();
98 }
99 }();
100 return 0;
101#else
102#pragma omp target
103#pragma omp teams
104#pragma omp distribute simd reduction(+: sivar)
105 for (int i = 0; i < 2; ++i) {
106 sivar += i;
107 }
108 return tmain<int>();
109#endif
110}
111
112// CHECK: define {{.*}}i{{[0-9]+}} @main()
113// CHECK: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 1, i8** %{{[^,]+}}, i8** %{{[^,]+}}, i{{64|32}}* {{.+}}@{{[^,]+}}, i32 0, i32 0), i64* {{.+}}@{{[^,]+}}, i32 0, i32 0), i32 0, i32 0)
114// CHECK: call void @[[OFFL1:.+]](i{{64|32}} %{{.+}})
115// CHECK: {{%.+}} = call{{.*}} i32 @[[TMAIN_INT:.+]]()
116// CHECK: ret
117
118// CHECK: define{{.*}} void @[[OFFL1]](i{{64|32}} [[SIVAR_ARG:%.+]])
119// CHECK: [[SIVAR_ADDR:%.+]] = alloca i{{.+}},
120// CHECK: store{{.+}} [[SIVAR_ARG]], {{.+}} [[SIVAR_ADDR]],
121// CHECK-64: [[SIVAR_CONV:%.+]] = bitcast{{.+}} [[SIVAR_ADDR]] to
122// CHECK-64: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} @[[OUTL1:.+]] to {{.+}}, {{.+}} [[SIVAR_CONV]])
123// CHECK-32: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} @[[OUTL1:.+]] to {{.+}}, {{.+}} [[SIVAR_ADDR]])
124// CHECK: ret void
125
126// CHECK: define internal void @[[OUTL1]]({{.+}}, {{.+}}, {{.+}} [[SIVAR_ARG:%.+]])
127// Skip global and bound tid vars
128// CHECK: {{.+}} = alloca i32*,
129// CHECK: {{.+}} = alloca i32*,
130// CHECK: [[SIVAR_ADDR:%.+]] = alloca i{{.+}}*,
131// CHECK: alloca i{{.+}},
132// CHECK: alloca i{{.+}},
133// CHECK: alloca i{{.+}},
134// CHECK: alloca i{{.+}},
135// CHECK: alloca i{{.+}},
Alexey Bataevc2e88a82017-12-04 21:30:42 +0000136// CHECK: alloca i{{.+}},
Alexey Bataev617db5f2017-12-04 15:38:33 +0000137// CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{.+}},
138// CHECK: store{{.+}} [[SIVAR_ARG]], {{.+}} [[SIVAR_ADDR]],
139// CHECK: [[SIVAR_REF:%.+]] = load{{.+}}, {{.+}} [[SIVAR_ADDR]]
140// CHECK: store{{.+}} 0, {{.+}} [[SIVAR_PRIV]],
141
142// CHECK: call void @__kmpc_for_static_init_4(
143// CHECK: store{{.+}}, {{.+}} [[SIVAR_PRIV]],
144// CHECK: call void @__kmpc_for_static_fini(
145// CHECK: [[LAST_ITER:%.+]] = load i32, i32* %
146// CHECK: [[IS_LAST:%.+]] = icmp ne i32 [[LAST_ITER]], 0
147// CHECK: br i1 [[IS_LAST]], label %[[THEN:.+]], label %[[DONE:.+]]
148// CHECK: [[THEN]]
149// CHECK: store i32 2, i32* %
150// CHECK: br label %[[DONE]]
151// CHECK: [[DONE]]
152// CHECK: [[SIVAR_ORIG_VAL:%.+]] = load i32, i32* [[SIVAR_REF]],
153// CHECK: [[SIVAR_PRIV_VAL:%.+]] = load i32, i32* [[SIVAR_PRIV]],
154// CHECK: [[ADD:%.+]] = add nsw i32 [[SIVAR_ORIG_VAL]], [[SIVAR_PRIV_VAL]]
155// CHECK: store i32 [[ADD]], i32* [[SIVAR_REF]],
156// CHECK: ret void
157
158// CHECK: define{{.*}} i{{[0-9]+}} @[[TMAIN_INT]]()
159// CHECK: call i32 @__tgt_target_teams(i64 -1, i8* @{{[^,]+}}, i32 1,
160// CHECK: call void @[[TOFFL1:.+]]({{.+}})
161// CHECK: ret
162
163// CHECK: define{{.*}} void @[[TOFFL1]](i{{64|32}} [[TVAR_ARG:%.+]])
164// CHECK: [[TVAR_ADDR:%.+]] = alloca i{{.+}},
165// CHECK: store{{.+}} [[TVAR_ARG]], {{.+}} [[TVAR_ADDR]],
166// CHECK-64: [[TVAR_CONV:%.+]] = bitcast{{.+}} [[TVAR_ADDR]] to
167// CHECK-64: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} @[[TOUTL1:.+]] to {{.+}}, {{.+}} [[TVAR_CONV]])
168// CHECK-32: call void {{.+}} @__kmpc_fork_teams({{.+}}, i32 1, {{.+}} @[[TOUTL1:.+]] to {{.+}}, {{.+}} [[TVAR_ADDR]])
169// CHECK: ret void
170
171// CHECK: define internal void @[[TOUTL1]]({{.+}}, {{.+}}, {{.+}} [[TVAR_ARG:%.+]])
172// Skip global and bound tid vars
173// CHECK: {{.+}} = alloca i32*,
174// CHECK: {{.+}} = alloca i32*,
175// CHECK: [[TVAR_ADDR:%.+]] = alloca i{{.+}}*,
176// CHECK: alloca i{{.+}},
177// CHECK: alloca i{{.+}},
178// CHECK: alloca i{{.+}},
179// CHECK: alloca i{{.+}},
180// CHECK: alloca i{{.+}},
Alexey Bataevc2e88a82017-12-04 21:30:42 +0000181// CHECK: alloca i{{.+}},
Alexey Bataev617db5f2017-12-04 15:38:33 +0000182// CHECK: [[TVAR_PRIV:%.+]] = alloca i{{.+}},
183// CHECK: store{{.+}} [[TVAR_ARG]], {{.+}} [[TVAR_ADDR]],
184// CHECK: [[TVAR_REF:%.+]] = load{{.+}}, {{.+}} [[TVAR_ADDR]]
185// CHECK: store{{.+}} 0, {{.+}} [[TVAR_PRIV]],
186
187// CHECK: call void @__kmpc_for_static_init_4(
188// CHECK: store{{.+}}, {{.+}} [[TVAR_PRIV]],
189// CHECK: call void @__kmpc_for_static_fini(
190// CHECK: [[LAST_ITER:%.+]] = load i32, i32* %
191// CHECK: [[IS_LAST:%.+]] = icmp ne i32 [[LAST_ITER]], 0
192// CHECK: br i1 [[IS_LAST]], label %[[THEN:.+]], label %[[DONE:.+]]
193// CHECK: [[THEN]]
194// CHECK: store i32 2, i32* %
195// CHECK: br label %[[DONE]]
196// CHECK: [[DONE]]
197// CHECK: [[TVAR_ORIG_VAL:%.+]] = load i32, i32* [[TVAR_REF]],
198// CHECK: [[TVAR_PRIV_VAL:%.+]] = load i32, i32* [[TVAR_PRIV]],
199// CHECK: [[ADD:%.+]] = add nsw i32 [[TVAR_ORIG_VAL]], [[TVAR_PRIV_VAL]]
200// CHECK: store i32 [[ADD]], i32* [[TVAR_REF]],
201// CHECK: ret void
202
203// CHECK: !{!"llvm.loop.vectorize.enable", i1 true}
204#endif