1eb61bde8SDave Pagan // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _
2eb61bde8SDave Pagan // Test host codegen.
384a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK
4eb61bde8SDave Pagan // 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
584a3aadfSAaron Ballman // 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 -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK
684a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK
7eb61bde8SDave Pagan // 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
884a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK
9eb61bde8SDave Pagan
1084a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
11eb61bde8SDave Pagan // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
1284a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
1384a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
14eb61bde8SDave Pagan // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
1584a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
16eb61bde8SDave Pagan
17eb61bde8SDave Pagan // Test target codegen - host bc file has to be created first.
1884a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
1984a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix TCHECK
2063ca93c7SSergio Afonso // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
2184a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix TCHECK
2284a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
2384a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix TCHECK
2463ca93c7SSergio Afonso // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
2584a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck %s --check-prefix TCHECK
26eb61bde8SDave Pagan
2784a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
2884a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
2963ca93c7SSergio Afonso // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
3084a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
3184a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
3284a3aadfSAaron Ballman // RUN: %clang_cc1 -verify -Wno-vla -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck --check-prefix SIMD-ONLY1 %s
3363ca93c7SSergio Afonso // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
3484a3aadfSAaron Ballman // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify -Wno-vla %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
35eb61bde8SDave Pagan
36eb61bde8SDave Pagan // expected-no-diagnostics
37eb61bde8SDave Pagan #ifndef HEADER
38eb61bde8SDave Pagan #define HEADER
39eb61bde8SDave Pagan
40eb61bde8SDave Pagan
41eb61bde8SDave Pagan
42eb61bde8SDave Pagan
43eb61bde8SDave Pagan
44eb61bde8SDave Pagan // Check target registration is registered as a Ctor.
45eb61bde8SDave Pagan
46eb61bde8SDave Pagan
47eb61bde8SDave Pagan template<typename tx, typename ty>
48eb61bde8SDave Pagan struct TT{
49eb61bde8SDave Pagan tx X;
50eb61bde8SDave Pagan ty Y;
51eb61bde8SDave Pagan };
52eb61bde8SDave Pagan
53eb61bde8SDave Pagan int global;
54eb61bde8SDave Pagan extern int global;
55eb61bde8SDave Pagan
foo(int n)56eb61bde8SDave Pagan int foo(int n) {
57eb61bde8SDave Pagan int a = 0;
58eb61bde8SDave Pagan short aa = 0;
59eb61bde8SDave Pagan float b[10];
60eb61bde8SDave Pagan float bn[n];
61eb61bde8SDave Pagan double c[5][10];
62eb61bde8SDave Pagan double cn[5][n];
63eb61bde8SDave Pagan TT<long long, char> d;
64eb61bde8SDave Pagan static long *plocal;
65eb61bde8SDave Pagan
66eb61bde8SDave Pagan #pragma omp target parallel loop device(global + a) depend(in: global) depend(out: a, b, cn[4])
67eb61bde8SDave Pagan for (int i = 0; i < 10; ++i) {
68eb61bde8SDave Pagan }
69eb61bde8SDave Pagan
70eb61bde8SDave Pagan
71eb61bde8SDave Pagan
72eb61bde8SDave Pagan
73eb61bde8SDave Pagan
74eb61bde8SDave Pagan
75eb61bde8SDave Pagan
76eb61bde8SDave Pagan #pragma omp target parallel loop device(global + a) nowait depend(inout: global, a, bn) if(target:a)
77eb61bde8SDave Pagan for (int i = 0; i < *plocal; ++i) {
78eb61bde8SDave Pagan static int local1;
79eb61bde8SDave Pagan *plocal = global;
80eb61bde8SDave Pagan local1 = global;
81eb61bde8SDave Pagan }
82eb61bde8SDave Pagan
83eb61bde8SDave Pagan #pragma omp target parallel loop if(0) firstprivate(global) depend(out:global)
84eb61bde8SDave Pagan for (int i = 0; i < global; ++i) {
85eb61bde8SDave Pagan global += 1;
86eb61bde8SDave Pagan }
87eb61bde8SDave Pagan
88eb61bde8SDave Pagan return a;
89eb61bde8SDave Pagan }
90eb61bde8SDave Pagan
91eb61bde8SDave Pagan // Check that the offloading functions are emitted and that the arguments are
92eb61bde8SDave Pagan // correct and loaded correctly for the target regions in foo().
93eb61bde8SDave Pagan
94eb61bde8SDave Pagan
95eb61bde8SDave Pagan
96eb61bde8SDave Pagan
97eb61bde8SDave Pagan
98eb61bde8SDave Pagan // CHECK-64: [[BP1_CAST:%.+]] = bitcast i[[SZ]]* [[BP1_PTR:%.+]] to i32*
99eb61bde8SDave Pagan // CHECK-64: store i32 [[BP1_I32]], i32* [[BP1_CAST]],
100eb61bde8SDave Pagan // CHECK-32: store i32 [[BP1_I32]], i32* [[BP1_PTR:%.+]],
101eb61bde8SDave Pagan
102eb61bde8SDave Pagan // CHECK-64: [[BP1_CAST:%.+]] = bitcast i[[SZ]]* [[BP1_PTR:%.+]] to i32*
103eb61bde8SDave Pagan // CHECK-64: store i32 [[BP1_I32]], i32* [[BP1_CAST]],
104eb61bde8SDave Pagan // CHECK-32: store i32 [[BP1_I32]], i32* [[BP1_PTR:%.+]],
105eb61bde8SDave Pagan
106eb61bde8SDave Pagan // Create stack storage and store argument in there.
107eb61bde8SDave Pagan // CHECK-64: [[AA_CADDR:%.+]] = bitcast i[[SZ]]* [[AA_ADDR]] to i32*
108eb61bde8SDave Pagan // CHECK-64: load i32, i32* [[AA_CADDR]], align
109eb61bde8SDave Pagan // CHECK-32: load i32, i32* [[AA_ADDR]], align
110eb61bde8SDave Pagan
111eb61bde8SDave Pagan // CHECK-64: [[BP1_CAST:%.+]] = bitcast i[[SZ]]* [[BP1_PTR:%.+]] to i32*
112eb61bde8SDave Pagan // CHECK-64: store i32 [[BP1_I32]], i32* [[BP1_CAST]],
113eb61bde8SDave Pagan // CHECK-32: store i32 [[BP1_I32]], i32* [[BP1_PTR:%.+]],
114eb61bde8SDave Pagan
115eb61bde8SDave Pagan
116eb61bde8SDave Pagan #endif
117eb61bde8SDave Pagan // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3fooi_l66
118eb61bde8SDave Pagan // CHECK-SAME: () #[[ATTR2:[0-9]+]] {
119eb61bde8SDave Pagan // CHECK-NEXT: entry:
120eb61bde8SDave Pagan // CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2:[0-9]+]], i32 0, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3fooi_l66.omp_outlined)
121eb61bde8SDave Pagan // CHECK-NEXT: ret void
122eb61bde8SDave Pagan //
123eb61bde8SDave Pagan //
124eb61bde8SDave Pagan //
125eb61bde8SDave Pagan //
126eb61bde8SDave Pagan //
127eb61bde8SDave Pagan //
128eb61bde8SDave Pagan //
129eb61bde8SDave Pagan //
130eb61bde8SDave Pagan //
131eb61bde8SDave Pagan //
132eb61bde8SDave Pagan //
133eb61bde8SDave Pagan //
134eb61bde8SDave Pagan //
135eb61bde8SDave Pagan //
136eb61bde8SDave Pagan //
137eb61bde8SDave Pagan //
138eb61bde8SDave Pagan //
139eb61bde8SDave Pagan //
140eb61bde8SDave Pagan //
141eb61bde8SDave Pagan //
142eb61bde8SDave Pagan //
143eb61bde8SDave Pagan //
144eb61bde8SDave Pagan //
145eb61bde8SDave Pagan //
146eb61bde8SDave Pagan //
147eb61bde8SDave Pagan //
148eb61bde8SDave Pagan //
149eb61bde8SDave Pagan //
150eb61bde8SDave Pagan //
151eb61bde8SDave Pagan //
152eb61bde8SDave Pagan //
153eb61bde8SDave Pagan //
154eb61bde8SDave Pagan //
155eb61bde8SDave Pagan //
156eb61bde8SDave Pagan //
157eb61bde8SDave Pagan //
158eb61bde8SDave Pagan //
159eb61bde8SDave Pagan //
160eb61bde8SDave Pagan //
161eb61bde8SDave Pagan //
162eb61bde8SDave Pagan //
163eb61bde8SDave Pagan //
164eb61bde8SDave Pagan //
165eb61bde8SDave Pagan //
166eb61bde8SDave Pagan //
167eb61bde8SDave Pagan //
168eb61bde8SDave Pagan //
169eb61bde8SDave Pagan //
170eb61bde8SDave Pagan //
171eb61bde8SDave Pagan //
172eb61bde8SDave Pagan //
173eb61bde8SDave Pagan //
174eb61bde8SDave Pagan //
175eb61bde8SDave Pagan //
176eb61bde8SDave Pagan //
177eb61bde8SDave Pagan //
178eb61bde8SDave Pagan //
179*b8cbc5c0SJohannes Doerfert //
180*b8cbc5c0SJohannes Doerfert //
181eb61bde8SDave Pagan //
182eb61bde8SDave Pagan //
183eb61bde8SDave Pagan //
184eb61bde8SDave Pagan //
185eb61bde8SDave Pagan //
186eb61bde8SDave Pagan //
187eb61bde8SDave Pagan //
188eb61bde8SDave Pagan //
189eb61bde8SDave Pagan //
190eb61bde8SDave Pagan //
191eb61bde8SDave Pagan //
192eb61bde8SDave Pagan //
193eb61bde8SDave Pagan //
194eb61bde8SDave Pagan //
195eb61bde8SDave Pagan //
196eb61bde8SDave Pagan //
197eb61bde8SDave Pagan //
198eb61bde8SDave Pagan //// NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
199eb61bde8SDave Pagan // SIMD-ONLY0: {{.*}}
200eb61bde8SDave Pagan // SIMD-ONLY1: {{.*}}
201*b8cbc5c0SJohannes Doerfert // TCHECK: {{.*}}
202