1*67e74705SXin Li // expected-no-diagnostics
2*67e74705SXin Li #ifndef HEADER
3*67e74705SXin Li #define HEADER
4*67e74705SXin Li
5*67e74705SXin Li ///==========================================================================///
6*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-64
7*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
8*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-64
9*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-32
10*67e74705SXin Li // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
11*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-32
12*67e74705SXin Li #ifdef CK1
13*67e74705SXin Li
14*67e74705SXin Li // CK1: [[ST:%.+]] = type { i32, double* }
15*67e74705SXin Li template <typename T>
16*67e74705SXin Li struct ST {
17*67e74705SXin Li T a;
18*67e74705SXin Li double *b;
19*67e74705SXin Li };
20*67e74705SXin Li
21*67e74705SXin Li ST<int> gb;
22*67e74705SXin Li double gc[100];
23*67e74705SXin Li
24*67e74705SXin Li // CK1: [[SIZE00:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 800]
25*67e74705SXin Li // CK1: [[MTYPE00:@.+]] = {{.+}}constant [1 x i32] [i32 34]
26*67e74705SXin Li
27*67e74705SXin Li // CK1: [[SIZE02:@.+]] = {{.+}}constant [1 x i[[sz]]] [i[[sz]] 4]
28*67e74705SXin Li // CK1: [[MTYPE02:@.+]] = {{.+}}constant [1 x i32] [i32 33]
29*67e74705SXin Li
30*67e74705SXin Li // CK1: [[MTYPE03:@.+]] = {{.+}}constant [1 x i32] [i32 34]
31*67e74705SXin Li
32*67e74705SXin Li // CK1: [[SIZE04:@.+]] = {{.+}}constant [2 x i[[sz]]] [i[[sz]] {{8|4}}, i[[sz]] 24]
33*67e74705SXin Li // CK1: [[MTYPE04:@.+]] = {{.+}}constant [2 x i32] [i32 33, i32 17]
34*67e74705SXin Li
35*67e74705SXin Li // CK1-LABEL: _Z3fooi
foo(int arg)36*67e74705SXin Li void foo(int arg) {
37*67e74705SXin Li int la;
38*67e74705SXin Li float lb[arg];
39*67e74705SXin Li
40*67e74705SXin Li // Region 00
41*67e74705SXin Li // CK1-DAG: call void @__tgt_target_data_update(i32 [[DEV:%[^,]+]], i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
42*67e74705SXin Li // CK1-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
43*67e74705SXin Li // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
44*67e74705SXin Li // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
45*67e74705SXin Li
46*67e74705SXin Li // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
47*67e74705SXin Li // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
48*67e74705SXin Li // CK1-DAG: store i8* bitcast ([100 x double]* @gc to i8*), i8** [[BP0]]
49*67e74705SXin Li // CK1-DAG: store i8* bitcast ([100 x double]* @gc to i8*), i8** [[P0]]
50*67e74705SXin Li
51*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
52*67e74705SXin Li #pragma omp target update if(1+3-5) device(arg) from(gc)
53*67e74705SXin Li {++arg;}
54*67e74705SXin Li
55*67e74705SXin Li // Region 01
56*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
57*67e74705SXin Li #pragma omp target update to(la) if(1+3-4)
58*67e74705SXin Li {++arg;}
59*67e74705SXin Li
60*67e74705SXin Li // Region 02
61*67e74705SXin Li // CK1: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
62*67e74705SXin Li // CK1: [[IFTHEN]]
63*67e74705SXin Li // CK1-DAG: call void @__tgt_target_data_update(i32 4, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
64*67e74705SXin Li // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
65*67e74705SXin Li // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
66*67e74705SXin Li
67*67e74705SXin Li // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
68*67e74705SXin Li // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
69*67e74705SXin Li // CK1-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
70*67e74705SXin Li // CK1-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
71*67e74705SXin Li // CK1-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
72*67e74705SXin Li // CK1-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
73*67e74705SXin Li // CK1: br label %[[IFEND:[^,]+]]
74*67e74705SXin Li
75*67e74705SXin Li // CK1: [[IFELSE]]
76*67e74705SXin Li // CK1: br label %[[IFEND]]
77*67e74705SXin Li // CK1: [[IFEND]]
78*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
79*67e74705SXin Li #pragma omp target update to(arg) if(arg) device(4)
80*67e74705SXin Li {++arg;}
81*67e74705SXin Li
82*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
83*67e74705SXin Li {++arg;}
84*67e74705SXin Li
85*67e74705SXin Li // Region 03
86*67e74705SXin Li // CK1-DAG: call void @__tgt_target_data_update(i32 -1, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[sz]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
87*67e74705SXin Li // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
88*67e74705SXin Li // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
89*67e74705SXin Li // CK1-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
90*67e74705SXin Li
91*67e74705SXin Li // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
92*67e74705SXin Li // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
93*67e74705SXin Li // CK1-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
94*67e74705SXin Li // CK1-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
95*67e74705SXin Li // CK1-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
96*67e74705SXin Li // CK1-DAG: store i[[sz]] [[CSVAL0:%[^,]+]], i[[sz]]* [[S0]]
97*67e74705SXin Li // CK1-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8*
98*67e74705SXin Li // CK1-DAG: [[CPVAL0]] = bitcast float* [[VAR0]] to i8*
99*67e74705SXin Li // CK1-DAG: [[CSVAL0]] = mul nuw i[[sz]] %{{[^,]+}}, 4
100*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
101*67e74705SXin Li // CK1-NOT: __tgt_target_data_end
102*67e74705SXin Li #pragma omp target update from(lb)
103*67e74705SXin Li {++arg;}
104*67e74705SXin Li
105*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
106*67e74705SXin Li {++arg;}
107*67e74705SXin Li
108*67e74705SXin Li // Region 04
109*67e74705SXin Li // CK1-DAG: call void @__tgt_target_data_update(i32 -1, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE04]]{{.+}})
110*67e74705SXin Li // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
111*67e74705SXin Li // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
112*67e74705SXin Li
113*67e74705SXin Li // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
114*67e74705SXin Li // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
115*67e74705SXin Li // CK1-DAG: store i8* bitcast ([[ST]]* @gb to i8*), i8** [[BP0]]
116*67e74705SXin Li // CK1-DAG: store i8* bitcast (double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1) to i8*), i8** [[P0]]
117*67e74705SXin Li
118*67e74705SXin Li
119*67e74705SXin Li // CK1-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
120*67e74705SXin Li // CK1-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
121*67e74705SXin Li // CK1-DAG: store i8* bitcast (double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1) to i8*), i8** [[BP1]]
122*67e74705SXin Li // CK1-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
123*67e74705SXin Li // CK1-DAG: [[CPVAL1]] = bitcast double* [[SEC1:%.+]] to i8*
124*67e74705SXin Li // CK1-DAG: [[SEC1]] = getelementptr inbounds {{.+}}double* [[SEC11:%[^,]+]], i{{.+}} 0
125*67e74705SXin Li // CK1-DAG: [[SEC11]] = load double*, double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1),
126*67e74705SXin Li
127*67e74705SXin Li // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
128*67e74705SXin Li // CK1-NOT: __tgt_target_data_end
129*67e74705SXin Li #pragma omp target update to(gb.b[:3])
130*67e74705SXin Li {++arg;}
131*67e74705SXin Li }
132*67e74705SXin Li #endif
133*67e74705SXin Li ///==========================================================================///
134*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-64
135*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
136*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-64
137*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-32
138*67e74705SXin Li // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
139*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-32
140*67e74705SXin Li #ifdef CK2
141*67e74705SXin Li
142*67e74705SXin Li // CK2: [[ST:%.+]] = type { i32, double* }
143*67e74705SXin Li template <typename T>
144*67e74705SXin Li struct ST {
145*67e74705SXin Li T a;
146*67e74705SXin Li double *b;
147*67e74705SXin Li
fooST148*67e74705SXin Li T foo(T arg) {
149*67e74705SXin Li // Region 00
150*67e74705SXin Li #pragma omp target update from(b[1:3]) if(a>123) device(arg)
151*67e74705SXin Li {arg++;}
152*67e74705SXin Li return arg;
153*67e74705SXin Li }
154*67e74705SXin Li };
155*67e74705SXin Li
156*67e74705SXin Li // CK2: [[SIZE00:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{8|4}}, i{{64|32}} 24]
157*67e74705SXin Li // CK2: [[MTYPE00:@.+]] = {{.+}}constant [2 x i32] [i32 34, i32 18]
158*67e74705SXin Li
159*67e74705SXin Li // CK2-LABEL: _Z3bari
bar(int arg)160*67e74705SXin Li int bar(int arg){
161*67e74705SXin Li ST<int> A;
162*67e74705SXin Li return A.foo(arg);
163*67e74705SXin Li }
164*67e74705SXin Li
165*67e74705SXin Li // Region 00
166*67e74705SXin Li // CK2: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
167*67e74705SXin Li // CK2: [[IFTHEN]]
168*67e74705SXin Li // CK2-DAG: call void @__tgt_target_data_update(i32 [[DEV:%[^,]+]], i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE00]]{{.+}})
169*67e74705SXin Li // CK2-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
170*67e74705SXin Li // CK2-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
171*67e74705SXin Li // CK2-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
172*67e74705SXin Li
173*67e74705SXin Li // CK2-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
174*67e74705SXin Li // CK2-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
175*67e74705SXin Li // CK2-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
176*67e74705SXin Li // CK2-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
177*67e74705SXin Li // CK2-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
178*67e74705SXin Li // CK2-DAG: [[CPVAL0]] = bitcast double** [[SEC0:%[^,]+]] to i8*
179*67e74705SXin Li // CK2-DAG: [[SEC0]] = getelementptr inbounds {{.*}}[[ST]]* [[VAR0]], i32 0, i32 1
180*67e74705SXin Li
181*67e74705SXin Li
182*67e74705SXin Li // CK2-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
183*67e74705SXin Li // CK2-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
184*67e74705SXin Li // CK2-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
185*67e74705SXin Li // CK2-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
186*67e74705SXin Li // CK2-DAG: [[CBPVAL1]] = bitcast double** [[SEC0]] to i8*
187*67e74705SXin Li // CK2-DAG: [[CPVAL1]] = bitcast double* [[SEC1:%[^,]+]] to i8*
188*67e74705SXin Li // CK2-DAG: [[SEC1]] = getelementptr inbounds {{.*}}double* [[SEC11:%[^,]+]], i{{.+}} 1
189*67e74705SXin Li // CK2-DAG: [[SEC11]] = load double*, double** [[SEC111:%[^,]+]],
190*67e74705SXin Li // CK2-DAG: [[SEC111]] = getelementptr inbounds {{.*}}[[ST]]* [[VAR0]], i32 0, i32 1
191*67e74705SXin Li
192*67e74705SXin Li // CK2: br label %[[IFEND:[^,]+]]
193*67e74705SXin Li
194*67e74705SXin Li // CK2: [[IFELSE]]
195*67e74705SXin Li // CK2: br label %[[IFEND]]
196*67e74705SXin Li // CK2: [[IFEND]]
197*67e74705SXin Li // CK2: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
198*67e74705SXin Li #endif
199*67e74705SXin Li ///==========================================================================///
200*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64
201*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
202*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64
203*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -verify -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32
204*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
205*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32
206*67e74705SXin Li #ifdef CK3
207*67e74705SXin Li
208*67e74705SXin Li // CK3-LABEL: no_target_devices
no_target_devices(int arg)209*67e74705SXin Li void no_target_devices(int arg) {
210*67e74705SXin Li // CK3-NOT: tgt_target_data_update
211*67e74705SXin Li // CK3: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
212*67e74705SXin Li // CK3: ret
213*67e74705SXin Li #pragma omp target update to(arg) if(arg) device(4)
214*67e74705SXin Li {++arg;}
215*67e74705SXin Li }
216*67e74705SXin Li #endif
217*67e74705SXin Li ///==========================================================================///
218*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64
219*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
220*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64
221*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32
222*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
223*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32
224*67e74705SXin Li
225*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
226*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -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 --check-prefix TCK4 --check-prefix TCK4-64
227*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
228*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix TCK4 --check-prefix TCK4-64
229*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
230*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix TCK4 --check-prefix TCK4-32
231*67e74705SXin Li // RUN: %clang_cc1 -DCK4 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
232*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix TCK4 --check-prefix TCK4-32
233*67e74705SXin Li #ifdef CK4
234*67e74705SXin Li
235*67e74705SXin Li // CK4-LABEL: device_side_scan
device_side_scan(int arg)236*67e74705SXin Li void device_side_scan(int arg) {
237*67e74705SXin Li // CK4: tgt_target_data_update
238*67e74705SXin Li // CK4: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
239*67e74705SXin Li // CK4: ret
240*67e74705SXin Li // TCK4-NOT: tgt_target_data_update
241*67e74705SXin Li #pragma omp target update from(arg) if(arg) device(4)
242*67e74705SXin Li {++arg;}
243*67e74705SXin Li }
244*67e74705SXin Li #endif
245*67e74705SXin Li #endif
246