blob: e24e58e10aa24948cb3e07f239dd95197b8f0ffd [file] [log] [blame]
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +00001// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
2// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s
3// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t
4// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - | FileCheck %s
5
Alexey Bataev729e2422019-08-23 16:11:14 +00006// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -fopenmp-version=50 -DOMP5 | FileCheck %s --check-prefix HOST5
7// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -fopenmp-version=50 -DOMP5
8// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -fopenmp-version=50 -DOMP5 | FileCheck %s --check-prefix DEV5
9
10// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - -fopenmp-version=50 -DOMP5 | FileCheck %s --check-prefix SIMD-ONLY
11// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc -fopenmp-version=50 -DOMP5
12// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -fopenmp-version=50 -DOMP5 | FileCheck %s --check-prefix SIMD-ONLY
13
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +000014// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
15// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o -| FileCheck %s --check-prefix SIMD-ONLY
16// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t
17// RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify -o - | FileCheck %s --check-prefix SIMD-ONLY
18
19// expected-no-diagnostics
20
21// SIMD-ONLY-NOT: {{__kmpc|__tgt}}
22
Alexey Bataev2a6f3f52018-11-07 19:11:14 +000023// CHECK-NOT: define {{.*}}{{baz1|baz4|maini1|Base|virtual_}}
Alexey Bataevd2c1dd52018-09-06 17:56:28 +000024// CHECK-DAG: Bake
Alexey Bataevd01b7492018-08-15 19:45:12 +000025// CHECK-NOT: @{{hhh|ggg|fff|eee}} =
26// CHECK-DAG: @aaa = external global i32,
Alexey Bataev6b21c4a2019-05-21 18:20:08 +000027// CHECK-DAG: @bbb ={{ dso_local | }}global i32 0,
Alexey Bataev8259cc32019-03-12 20:05:17 +000028// CHECK-DAG: weak constant %struct.__tgt_offload_entry { i8* bitcast (i32* @bbb to i8*),
Alexey Bataevd01b7492018-08-15 19:45:12 +000029// CHECK-DAG: @ccc = external global i32,
Alexey Bataev6b21c4a2019-05-21 18:20:08 +000030// CHECK-DAG: @ddd ={{ dso_local | }}global i32 0,
Gheorghe-Teodor Bercea625f59d2019-08-01 21:15:58 +000031// CHECK-DAG: @hhh_decl_tgt_ref_ptr = weak global i32* null
32// CHECK-DAG: @ggg_decl_tgt_ref_ptr = weak global i32* null
33// CHECK-DAG: @fff_decl_tgt_ref_ptr = weak global i32* null
34// CHECK-DAG: @eee_decl_tgt_ref_ptr = weak global i32* null
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +000035// CHECK-DAG: @{{.*}}maini1{{.*}}aaa = internal global i64 23,
Alexey Bataev6b21c4a2019-05-21 18:20:08 +000036// CHECK-DAG: @b ={{ dso_local | }}global i32 15,
37// CHECK-DAG: @d ={{ dso_local | }}global i32 0,
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +000038// CHECK-DAG: @c = external global i32,
Alexey Bataev6b21c4a2019-05-21 18:20:08 +000039// CHECK-DAG: @globals ={{ dso_local | }}global %struct.S zeroinitializer,
Alexey Bataev38235142018-07-31 16:40:15 +000040// CHECK-DAG: [[STAT:@.+stat]] = internal global %struct.S zeroinitializer,
41// CHECK-DAG: [[STAT_REF:@.+]] = internal constant %struct.S* [[STAT]]
Alexey Bataev6b21c4a2019-05-21 18:20:08 +000042// CHECK-DAG: @out_decl_target ={{ dso_local | }}global i32 0,
Alexey Bataev729e2422019-08-23 16:11:14 +000043// CHECK-DAG: @llvm.used = appending global [2 x i8*] [i8* bitcast (void ()* @__omp_offloading__{{.+}}_globals_l[[@LINE+84]]_ctor to i8*), i8* bitcast (void ()* @__omp_offloading__{{.+}}_stat_l[[@LINE+85]]_ctor to i8*)],
Alexey Bataev38235142018-07-31 16:40:15 +000044// CHECK-DAG: @llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (%struct.S** [[STAT_REF]] to i8*)],
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +000045
Alexey Bataev6d944102018-05-02 15:45:28 +000046// CHECK-DAG: define {{.*}}i32 @{{.*}}{{foo|bar|baz2|baz3|FA|f_method}}{{.*}}()
Sean Fertiled900dd02018-10-15 15:43:00 +000047// CHECK-DAG: define {{.*}}void @{{.*}}TemplateClass{{.*}}(%class.TemplateClass* %{{.*}})
Alexey Bataev6d944102018-05-02 15:45:28 +000048// CHECK-DAG: define {{.*}}i32 @{{.*}}TemplateClass{{.*}}f_method{{.*}}(%class.TemplateClass* %{{.*}})
Alexey Bataev729e2422019-08-23 16:11:14 +000049// CHECK-DAG: define {{.*}}void @__omp_offloading__{{.*}}_globals_l[[@LINE+78]]_ctor()
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +000050
51#ifndef HEADER
52#define HEADER
53
Alexey Bataevd01b7492018-08-15 19:45:12 +000054#pragma omp declare target
Alexey Bataev8259cc32019-03-12 20:05:17 +000055extern int bbb;
56#pragma omp end declare target
57#pragma omp declare target
58extern int bbb;
59#pragma omp end declare target
60
61#pragma omp declare target
Alexey Bataevd01b7492018-08-15 19:45:12 +000062extern int aaa;
63int bbb = 0;
64extern int ccc;
65int ddd = 0;
66#pragma omp end declare target
67
Alexey Bataev8259cc32019-03-12 20:05:17 +000068#pragma omp declare target
69extern int bbb;
70#pragma omp end declare target
71
Alexey Bataevd01b7492018-08-15 19:45:12 +000072extern int eee;
73int fff = 0;
74extern int ggg;
75int hhh = 0;
76#pragma omp declare target link(eee, fff, ggg, hhh)
77
Alexey Bataevbf8fe712018-08-07 16:14:36 +000078int out_decl_target = 0;
Alexey Bataev729e2422019-08-23 16:11:14 +000079#ifdef OMP5
80#pragma omp declare target(out_decl_target)
81#endif
82
Alexey Bataevbf8fe712018-08-07 16:14:36 +000083#pragma omp declare target
84void lambda () {
85#ifdef __cpp_lambdas
86 (void)[&] { (void)out_decl_target; };
87#else
88#pragma clang __debug captured
89 {
90 (void)out_decl_target;
91 }
92#endif
93};
94#pragma omp end declare target
95
Alexey Bataev6d944102018-05-02 15:45:28 +000096template <typename T>
97class TemplateClass {
98 T a;
99public:
100 TemplateClass() {}
101 T f_method() const { return a; }
102};
103
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000104int foo();
105
Alexey Bataevbd8ff9b2018-08-30 18:56:11 +0000106static int baz1() { return 0; }
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000107
108int baz2();
109
110int baz4() { return 5; }
111
Alexey Bataevfb388282018-05-01 14:09:46 +0000112template <typename T>
113T FA() {
Alexey Bataev6d944102018-05-02 15:45:28 +0000114 TemplateClass<T> s;
115 return s.f_method();
Alexey Bataevfb388282018-05-01 14:09:46 +0000116}
117
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000118#pragma omp declare target
Alexey Bataevdadf2d12018-04-30 18:09:40 +0000119struct S {
120 int a;
121 S(int a) : a(a) {}
122};
123
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000124int foo() { return 0; }
125int b = 15;
126int d;
Alexey Bataeve253f2f2018-05-09 14:15:18 +0000127S globals(d);
Alexey Bataev2f5b2672018-07-27 17:37:32 +0000128static S stat(d);
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000129#pragma omp end declare target
130int c;
131
132int bar() { return 1 + foo() + bar() + baz1() + baz2(); }
133
134int maini1() {
135 int a;
Alexey Bataevd01b7492018-08-15 19:45:12 +0000136 static long aa = 32 + bbb + ccc + fff + ggg;
Alexey Bataev9a700172018-05-08 14:16:57 +0000137// CHECK-DAG: define weak void @__omp_offloading_{{.*}}maini1{{.*}}_l[[@LINE+1]](i32* dereferenceable{{.*}}, i64 {{.*}}, i64 {{.*}})
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000138#pragma omp target map(tofrom \
Alexey Bataev2c1dffe2018-04-16 20:34:41 +0000139 : a, b)
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000140 {
Alexey Bataevdadf2d12018-04-30 18:09:40 +0000141 S s(a);
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000142 static long aaa = 23;
Alexey Bataevfb388282018-05-01 14:09:46 +0000143 a = foo() + bar() + b + c + d + aa + aaa + FA<int>();
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000144 }
145 return baz4();
146}
147
Alexey Bataevfb388282018-05-01 14:09:46 +0000148int baz3() { return 2 + baz2(); }
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000149int baz2() {
Alexey Bataev9a700172018-05-08 14:16:57 +0000150// CHECK-DAG: define weak void @__omp_offloading_{{.*}}baz2{{.*}}_l[[@LINE+1]](i64 {{.*}})
Alexey Bataev4ac68a22018-05-16 15:08:32 +0000151#pragma omp target parallel
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000152 ++c;
153 return 2 + baz3();
154}
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000155
Alexey Bataev7f792ca2018-08-20 18:03:40 +0000156extern int create() throw();
157
158static __typeof(create) __t_create __attribute__((__weakref__("__create")));
159
160int baz5() {
161 bool a;
162// CHECK-DAG: define weak void @__omp_offloading_{{.*}}baz5{{.*}}_l[[@LINE+1]](i64 {{.*}})
163#pragma omp target
164 a = __extension__(void *) & __t_create != 0;
165 return a;
166}
167
Alexey Bataevd2c1dd52018-09-06 17:56:28 +0000168template <typename T>
169struct Base {
170 virtual ~Base() {}
171};
172
173template class Base<int>;
174
175template <typename T>
176struct Bake {
177 virtual ~Bake() {}
178};
179
180#pragma omp declare target
181template class Bake<int>;
182#pragma omp end declare target
183
Alexey Bataevf898d1d2018-09-21 14:55:26 +0000184struct BaseNonT {
185 virtual ~BaseNonT() {}
186};
187
188#pragma omp declare target
189struct BakeNonT {
190 virtual ~BakeNonT() {}
191};
192#pragma omp end declare target
193
Alexey Bataev2a6f3f52018-11-07 19:11:14 +0000194template <typename T>
195struct B {
196 virtual void virtual_foo();
197};
198
199void new_bar() { new B<int>(); }
200
201template <typename T>
202void B<T>::virtual_foo() {
203#pragma omp target
204 {}
205}
206
Alexey Bataev719713a2018-11-28 19:00:07 +0000207struct A {
208 virtual void emitted() {}
209};
210
211template <typename T>
212struct C : public A {
213 virtual void emitted();
214};
215
216template <typename T>
217void C<T>::emitted() {
218#pragma omp target
219 {}
220}
221
222int main() {
223 A *X = new C<int>();
224 X->emitted();
225 return 0;
226}
227
228// CHECK-DAG: define {{.*}}void @__omp_offloading_{{.*}}virtual_foo{{.*}}_l[[@LINE-25]]()
229// CHECK-DAG: define {{.*}}void @__omp_offloading_{{.*}}emitted{{.*}}_l[[@LINE-11]]()
230
Alexey Bataev7f792ca2018-08-20 18:03:40 +0000231// CHECK-DAG: declare extern_weak signext i32 @__create()
232
Alexey Bataev2a6f3f52018-11-07 19:11:14 +0000233// CHECK-NOT: define {{.*}}{{baz1|baz4|maini1|Base|virtual_}}
Alexey Bataevb4dd6d22018-08-29 20:41:37 +0000234
235// CHECK-DAG: !{i32 1, !"aaa", i32 0, i32 {{[0-9]+}}}
236// CHECK-DAG: !{i32 1, !"ccc", i32 0, i32 {{[0-9]+}}}
Alexey Bataev2a6f3f52018-11-07 19:11:14 +0000237// CHECK-DAG: !{{{.+}}virtual_foo
Alexey Bataevb4dd6d22018-08-29 20:41:37 +0000238
Alexey Bataev729e2422019-08-23 16:11:14 +0000239#ifdef OMP5
240void host_fun() {}
241#pragma omp declare target to(host_fun) device_type(host)
242void device_fun() {}
243#pragma omp declare target to(device_fun) device_type(nohost)
244// HOST5-NOT: define {{.*}}void {{.*}}device_fun{{.*}}
245// HOST5: define {{.*}}void {{.*}}host_fun{{.*}}
246// HOST5-NOT: define {{.*}}void {{.*}}device_fun{{.*}}
247
248// DEV5-NOT: define {{.*}}void {{.*}}host_fun{{.*}}
249// DEV5: define {{.*}}void {{.*}}device_fun{{.*}}
250// DEV5-NOT: define {{.*}}void {{.*}}host_fun{{.*}}
251#endif // OMP5
252
Alexey Bataev4f4bf7c2018-03-15 15:47:20 +0000253#endif // HEADER