xref: /aosp_15_r20/external/clang/test/OpenMP/target_data_codegen.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 37]
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_begin(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 
53*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_end(i32 [[DEV:%[^,]+]], i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
54*67e74705SXin Li   // CK1-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
55*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP]]
56*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P]]
57*67e74705SXin Li   #pragma omp target data if(1+3-5) device(arg) map(from: gc)
58*67e74705SXin Li   {++arg;}
59*67e74705SXin Li 
60*67e74705SXin Li   // Region 01
61*67e74705SXin Li   // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
62*67e74705SXin Li   #pragma omp target data map(la) if(1+3-4)
63*67e74705SXin Li   {++arg;}
64*67e74705SXin Li 
65*67e74705SXin Li   // Region 02
66*67e74705SXin Li   // CK1: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
67*67e74705SXin Li   // CK1: [[IFTHEN]]
68*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_begin(i32 4, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
69*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
70*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
71*67e74705SXin Li 
72*67e74705SXin Li   // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
73*67e74705SXin Li   // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
74*67e74705SXin Li   // CK1-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
75*67e74705SXin Li   // CK1-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
76*67e74705SXin Li   // CK1-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
77*67e74705SXin Li   // CK1-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
78*67e74705SXin Li   // CK1: br label %[[IFEND:[^,]+]]
79*67e74705SXin Li 
80*67e74705SXin Li   // CK1: [[IFELSE]]
81*67e74705SXin Li   // CK1: br label %[[IFEND]]
82*67e74705SXin Li   // CK1: [[IFEND]]
83*67e74705SXin Li   // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
84*67e74705SXin Li   // CK1: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
85*67e74705SXin Li 
86*67e74705SXin Li   // CK1: [[IFTHEN]]
87*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_end(i32 4, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
88*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP]]
89*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P]]
90*67e74705SXin Li   // CK1: br label %[[IFEND:[^,]+]]
91*67e74705SXin Li   // CK1: [[IFELSE]]
92*67e74705SXin Li   // CK1: br label %[[IFEND]]
93*67e74705SXin Li   // CK1: [[IFEND]]
94*67e74705SXin Li   #pragma omp target data map(to: arg) if(arg) device(4)
95*67e74705SXin Li   {++arg;}
96*67e74705SXin Li 
97*67e74705SXin Li   // Region 03
98*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_begin(i32 -1, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[sz]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
99*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
100*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
101*67e74705SXin Li   // CK1-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
102*67e74705SXin Li 
103*67e74705SXin Li   // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
104*67e74705SXin Li   // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
105*67e74705SXin Li   // CK1-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
106*67e74705SXin Li   // CK1-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
107*67e74705SXin Li   // CK1-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
108*67e74705SXin Li   // CK1-DAG: store i[[sz]] [[CSVAL0:%[^,]+]], i[[sz]]* [[S0]]
109*67e74705SXin Li   // CK1-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8*
110*67e74705SXin Li   // CK1-DAG: [[CPVAL0]] = bitcast float* [[VAR0]] to i8*
111*67e74705SXin Li   // CK1-DAG: [[CSVAL0]] = mul nuw i[[sz]] %{{[^,]+}}, 4
112*67e74705SXin Li   // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
113*67e74705SXin Li 
114*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_end(i32 -1, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[sz]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
115*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP]]
116*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P]]
117*67e74705SXin Li   // CK1-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S]]
118*67e74705SXin Li   #pragma omp target data map(always, to: lb)
119*67e74705SXin Li   {++arg;}
120*67e74705SXin Li 
121*67e74705SXin Li   // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
122*67e74705SXin Li   {++arg;}
123*67e74705SXin Li 
124*67e74705SXin Li   // Region 04
125*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_begin(i32 -1, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE04]]{{.+}})
126*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
127*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
128*67e74705SXin Li 
129*67e74705SXin Li   // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
130*67e74705SXin Li   // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
131*67e74705SXin Li   // CK1-DAG: store i8* bitcast ([[ST]]* @gb to i8*), i8** [[BP0]]
132*67e74705SXin Li   // CK1-DAG: store i8* bitcast (double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1) to i8*), i8** [[P0]]
133*67e74705SXin Li 
134*67e74705SXin Li 
135*67e74705SXin Li   // CK1-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
136*67e74705SXin Li   // CK1-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
137*67e74705SXin Li   // CK1-DAG: store i8* bitcast (double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1) to i8*), i8** [[BP1]]
138*67e74705SXin Li   // CK1-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
139*67e74705SXin Li   // CK1-DAG: [[CPVAL1]] = bitcast double* [[SEC1:%.+]] to i8*
140*67e74705SXin Li   // CK1-DAG: [[SEC1]] = getelementptr inbounds {{.+}}double* [[SEC11:%[^,]+]], i{{.+}} 0
141*67e74705SXin Li   // CK1-DAG: [[SEC11]] = load double*, double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1),
142*67e74705SXin Li 
143*67e74705SXin Li   // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
144*67e74705SXin Li 
145*67e74705SXin Li   // CK1-DAG: call void @__tgt_target_data_end(i32 -1, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE04]]{{.+}})
146*67e74705SXin Li   // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP]]
147*67e74705SXin Li   // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P]]
148*67e74705SXin Li   #pragma omp target data map(to: gb.b[:3])
149*67e74705SXin Li   {++arg;}
150*67e74705SXin Li }
151*67e74705SXin Li #endif
152*67e74705SXin Li ///==========================================================================///
153*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
154*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
155*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
156*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
157*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
158*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
159*67e74705SXin Li #ifdef CK2
160*67e74705SXin Li 
161*67e74705SXin Li // CK2: [[ST:%.+]] = type { i32, double* }
162*67e74705SXin Li template <typename T>
163*67e74705SXin Li struct ST {
164*67e74705SXin Li   T a;
165*67e74705SXin Li   double *b;
166*67e74705SXin Li 
fooST167*67e74705SXin Li   T foo(T arg) {
168*67e74705SXin Li     // Region 00
169*67e74705SXin Li     #pragma omp target data map(always, to: b[1:3]) if(a>123) device(arg)
170*67e74705SXin Li     {arg++;}
171*67e74705SXin Li     return arg;
172*67e74705SXin Li   }
173*67e74705SXin Li };
174*67e74705SXin Li 
175*67e74705SXin Li // CK2: [[SIZE00:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{8|4}}, i{{64|32}} 24]
176*67e74705SXin Li // CK2: [[MTYPE00:@.+]] = {{.+}}constant [2 x i32] [i32 37, i32 21]
177*67e74705SXin Li 
178*67e74705SXin Li // CK2-LABEL: _Z3bari
bar(int arg)179*67e74705SXin Li int bar(int arg){
180*67e74705SXin Li   ST<int> A;
181*67e74705SXin Li   return A.foo(arg);
182*67e74705SXin Li }
183*67e74705SXin Li 
184*67e74705SXin Li // Region 00
185*67e74705SXin Li // CK2: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
186*67e74705SXin Li // CK2: [[IFTHEN]]
187*67e74705SXin Li // CK2-DAG: call void @__tgt_target_data_begin(i32 [[DEV:%[^,]+]], i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE00]]{{.+}})
188*67e74705SXin Li // CK2-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
189*67e74705SXin Li // CK2-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
190*67e74705SXin Li // CK2-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
191*67e74705SXin Li 
192*67e74705SXin Li // CK2-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
193*67e74705SXin Li // CK2-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
194*67e74705SXin Li // CK2-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
195*67e74705SXin Li // CK2-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
196*67e74705SXin Li // CK2-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
197*67e74705SXin Li // CK2-DAG: [[CPVAL0]] = bitcast double** [[SEC0:%[^,]+]] to i8*
198*67e74705SXin Li // CK2-DAG: [[SEC0]] = getelementptr inbounds {{.*}}[[ST]]* [[VAR0]], i32 0, i32 1
199*67e74705SXin Li 
200*67e74705SXin Li 
201*67e74705SXin Li // CK2-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
202*67e74705SXin Li // CK2-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
203*67e74705SXin Li // CK2-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
204*67e74705SXin Li // CK2-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
205*67e74705SXin Li // CK2-DAG: [[CBPVAL1]] = bitcast double** [[SEC0]] to i8*
206*67e74705SXin Li // CK2-DAG: [[CPVAL1]] = bitcast double* [[SEC1:%[^,]+]] to i8*
207*67e74705SXin Li // CK2-DAG: [[SEC1]] = getelementptr inbounds {{.*}}double* [[SEC11:%[^,]+]], i{{.+}} 1
208*67e74705SXin Li // CK2-DAG: [[SEC11]] = load double*, double** [[SEC111:%[^,]+]],
209*67e74705SXin Li // CK2-DAG: [[SEC111]] = getelementptr inbounds {{.*}}[[ST]]* [[VAR0]], i32 0, i32 1
210*67e74705SXin Li 
211*67e74705SXin Li // CK2: br label %[[IFEND:[^,]+]]
212*67e74705SXin Li 
213*67e74705SXin Li // CK2: [[IFELSE]]
214*67e74705SXin Li // CK2: br label %[[IFEND]]
215*67e74705SXin Li // CK2: [[IFEND]]
216*67e74705SXin Li // CK2: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
217*67e74705SXin Li // CK2: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
218*67e74705SXin Li 
219*67e74705SXin Li // CK2: [[IFTHEN]]
220*67e74705SXin Li // CK2-DAG: call void @__tgt_target_data_end(i32 [[DEV:%[^,]+]], i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE00]]{{.+}})
221*67e74705SXin Li // CK2-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
222*67e74705SXin Li // CK2-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP]]
223*67e74705SXin Li // CK2-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P]]
224*67e74705SXin Li // CK2: br label %[[IFEND:[^,]+]]
225*67e74705SXin Li // CK2: [[IFELSE]]
226*67e74705SXin Li // CK2: br label %[[IFEND]]
227*67e74705SXin Li // CK2: [[IFEND]]
228*67e74705SXin Li #endif
229*67e74705SXin Li ///==========================================================================///
230*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
231*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
232*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
233*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
234*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
235*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
236*67e74705SXin Li #ifdef CK3
237*67e74705SXin Li 
238*67e74705SXin Li // CK3-LABEL: no_target_devices
no_target_devices(int arg)239*67e74705SXin Li void no_target_devices(int arg) {
240*67e74705SXin Li   // CK3-NOT: tgt_target_data_begin
241*67e74705SXin Li   // CK3: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
242*67e74705SXin Li   // CK3-NOT: tgt_target_data_end
243*67e74705SXin Li   // CK3: ret
244*67e74705SXin Li   #pragma omp target data map(to: arg) if(arg) device(4)
245*67e74705SXin Li   {++arg;}
246*67e74705SXin Li }
247*67e74705SXin Li #endif
248*67e74705SXin Li #endif
249