xref: /aosp_15_r20/external/clang/test/OpenMP/target_map_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 /// Implicit maps.
7*67e74705SXin Li ///
8*67e74705SXin Li 
9*67e74705SXin Li ///==========================================================================///
10*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
11*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
12*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
13*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
14*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
15*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
16*67e74705SXin Li #ifdef CK1
17*67e74705SXin Li 
18*67e74705SXin Li // CK1-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
19*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
20*67e74705SXin Li // CK1-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
21*67e74705SXin Li 
22*67e74705SXin Li // CK1-LABEL: implicit_maps_integer
implicit_maps_integer(int a)23*67e74705SXin Li void implicit_maps_integer (int a){
24*67e74705SXin Li   int i = a;
25*67e74705SXin Li 
26*67e74705SXin Li   // CK1-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
27*67e74705SXin Li   // CK1-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
28*67e74705SXin Li   // CK1-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
29*67e74705SXin Li   // CK1-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
30*67e74705SXin Li   // CK1-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
31*67e74705SXin Li   // CK1-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
32*67e74705SXin Li   // CK1-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
33*67e74705SXin Li   // CK1-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
34*67e74705SXin Li   // CK1-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
35*67e74705SXin Li   // CK1-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
36*67e74705SXin Li   // CK1-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
37*67e74705SXin Li   // CK1-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
38*67e74705SXin Li 
39*67e74705SXin Li   // CK1: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
40*67e74705SXin Li   #pragma omp target
41*67e74705SXin Li   {
42*67e74705SXin Li    ++i;
43*67e74705SXin Li   }
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li // CK1: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
47*67e74705SXin Li // CK1: [[ADDR:%.+]] = alloca i[[sz]],
48*67e74705SXin Li // CK1: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
49*67e74705SXin Li // CK1-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
50*67e74705SXin Li // CK1-64: {{.+}} = load i32, i32* [[CADDR]],
51*67e74705SXin Li // CK1-32: {{.+}} = load i32, i32* [[ADDR]],
52*67e74705SXin Li 
53*67e74705SXin Li #endif
54*67e74705SXin Li ///==========================================================================///
55*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
56*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
57*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
58*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
59*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
60*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
61*67e74705SXin Li #ifdef CK2
62*67e74705SXin Li 
63*67e74705SXin Li // CK2-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
64*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
65*67e74705SXin Li // CK2-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
66*67e74705SXin Li 
67*67e74705SXin Li // CK2-LABEL: implicit_maps_integer_reference
implicit_maps_integer_reference(int a)68*67e74705SXin Li void implicit_maps_integer_reference (int a){
69*67e74705SXin Li   int &i = a;
70*67e74705SXin Li   // CK2-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
71*67e74705SXin Li   // CK2-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
72*67e74705SXin Li   // CK2-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
73*67e74705SXin Li   // CK2-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
74*67e74705SXin Li   // CK2-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
75*67e74705SXin Li   // CK2-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
76*67e74705SXin Li   // CK2-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
77*67e74705SXin Li   // CK2-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
78*67e74705SXin Li   // CK2-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
79*67e74705SXin Li   // CK2-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
80*67e74705SXin Li   // CK2-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
81*67e74705SXin Li   // CK2-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
82*67e74705SXin Li 
83*67e74705SXin Li   // CK2: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
84*67e74705SXin Li   #pragma omp target
85*67e74705SXin Li   {
86*67e74705SXin Li    ++i;
87*67e74705SXin Li   }
88*67e74705SXin Li }
89*67e74705SXin Li 
90*67e74705SXin Li // CK2: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
91*67e74705SXin Li // CK2: [[ADDR:%.+]] = alloca i[[sz]],
92*67e74705SXin Li // CK2: [[REF:%.+]] = alloca i32*,
93*67e74705SXin Li // CK2: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
94*67e74705SXin Li // CK2-64: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
95*67e74705SXin Li // CK2-64: store i32* [[CADDR]], i32** [[REF]],
96*67e74705SXin Li // CK2-64: [[RVAL:%.+]] = load i32*, i32** [[REF]],
97*67e74705SXin Li // CK2-64: {{.+}} = load i32, i32* [[RVAL]],
98*67e74705SXin Li // CK2-32: store i32* [[ADDR]], i32** [[REF]],
99*67e74705SXin Li // CK2-32: [[RVAL:%.+]] = load i32*, i32** [[REF]],
100*67e74705SXin Li // CK2-32: {{.+}} = load i32, i32* [[RVAL]],
101*67e74705SXin Li 
102*67e74705SXin Li #endif
103*67e74705SXin Li ///==========================================================================///
104*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64
105*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
106*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 CK3 --check-prefix CK3-64
107*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK3 --check-prefix CK3-32
108*67e74705SXin Li // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
109*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 CK3 --check-prefix CK3-32
110*67e74705SXin Li #ifdef CK3
111*67e74705SXin Li 
112*67e74705SXin Li // CK3-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
113*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
114*67e74705SXin Li // CK3-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
115*67e74705SXin Li 
116*67e74705SXin Li // CK3-LABEL: implicit_maps_parameter
implicit_maps_parameter(int a)117*67e74705SXin Li void implicit_maps_parameter (int a){
118*67e74705SXin Li 
119*67e74705SXin Li   // CK3-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
120*67e74705SXin Li   // CK3-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
121*67e74705SXin Li   // CK3-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
122*67e74705SXin Li   // CK3-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
123*67e74705SXin Li   // CK3-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
124*67e74705SXin Li   // CK3-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
125*67e74705SXin Li   // CK3-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
126*67e74705SXin Li   // CK3-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
127*67e74705SXin Li   // CK3-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
128*67e74705SXin Li   // CK3-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
129*67e74705SXin Li   // CK3-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
130*67e74705SXin Li   // CK3-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
131*67e74705SXin Li 
132*67e74705SXin Li   // CK3: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
133*67e74705SXin Li   #pragma omp target
134*67e74705SXin Li   {
135*67e74705SXin Li    ++a;
136*67e74705SXin Li   }
137*67e74705SXin Li }
138*67e74705SXin Li 
139*67e74705SXin Li // CK3: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
140*67e74705SXin Li // CK3: [[ADDR:%.+]] = alloca i[[sz]],
141*67e74705SXin Li // CK3: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
142*67e74705SXin Li // CK3-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
143*67e74705SXin Li // CK3-64: {{.+}} = load i32, i32* [[CADDR]],
144*67e74705SXin Li // CK3-32: {{.+}} = load i32, i32* [[ADDR]],
145*67e74705SXin Li 
146*67e74705SXin Li #endif
147*67e74705SXin Li ///==========================================================================///
148*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
149*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
150*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
151*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
152*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
153*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
154*67e74705SXin Li #ifdef CK4
155*67e74705SXin Li 
156*67e74705SXin Li // CK4-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
157*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
158*67e74705SXin Li // CK4-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
159*67e74705SXin Li 
160*67e74705SXin Li // CK4-LABEL: implicit_maps_nested_integer
implicit_maps_nested_integer(int a)161*67e74705SXin Li void implicit_maps_nested_integer (int a){
162*67e74705SXin Li   int i = a;
163*67e74705SXin Li 
164*67e74705SXin Li   // The captures in parallel are by reference. Only the capture in target is by
165*67e74705SXin Li   // copy.
166*67e74705SXin Li 
167*67e74705SXin Li   // CK4: call void {{.+}}@__kmpc_fork_call({{.+}} [[KERNELP1:@.+]] to void (i32*, i32*, ...)*), i32* {{.+}})
168*67e74705SXin Li   // CK4: define internal void [[KERNELP1]](i32* {{[^,]+}}, i32* {{[^,]+}}, i32* {{[^,]+}})
169*67e74705SXin Li   #pragma omp parallel
170*67e74705SXin Li   {
171*67e74705SXin Li     // CK4-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
172*67e74705SXin Li     // CK4-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
173*67e74705SXin Li     // CK4-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
174*67e74705SXin Li     // CK4-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
175*67e74705SXin Li     // CK4-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
176*67e74705SXin Li     // CK4-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
177*67e74705SXin Li     // CK4-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
178*67e74705SXin Li     // CK4-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
179*67e74705SXin Li     // CK4-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
180*67e74705SXin Li     // CK4-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
181*67e74705SXin Li     // CK4-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
182*67e74705SXin Li     // CK4-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
183*67e74705SXin Li 
184*67e74705SXin Li     // CK4: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
185*67e74705SXin Li     #pragma omp target
186*67e74705SXin Li     {
187*67e74705SXin Li       #pragma omp parallel
188*67e74705SXin Li       {
189*67e74705SXin Li         ++i;
190*67e74705SXin Li       }
191*67e74705SXin Li     }
192*67e74705SXin Li   }
193*67e74705SXin Li }
194*67e74705SXin Li 
195*67e74705SXin Li // CK4: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
196*67e74705SXin Li // CK4: [[ADDR:%.+]] = alloca i[[sz]],
197*67e74705SXin Li // CK4: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
198*67e74705SXin Li // CK4-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
199*67e74705SXin Li // CK4-64: call void {{.+}}@__kmpc_fork_call({{.+}} [[KERNELP2:@.+]] to void (i32*, i32*, ...)*), i32* [[CADDR]])
200*67e74705SXin Li // CK4-32: call void {{.+}}@__kmpc_fork_call({{.+}} [[KERNELP2:@.+]] to void (i32*, i32*, ...)*), i32* [[ADDR]])
201*67e74705SXin Li // CK4: define internal void [[KERNELP2]](i32* {{[^,]+}}, i32* {{[^,]+}}, i32* {{[^,]+}})
202*67e74705SXin Li #endif
203*67e74705SXin Li ///==========================================================================///
204*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK5 --check-prefix CK5-64
205*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
206*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 CK5 --check-prefix CK5-64
207*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK5 --check-prefix CK5-32
208*67e74705SXin Li // RUN: %clang_cc1 -DCK5 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
209*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 CK5 --check-prefix CK5-32
210*67e74705SXin Li #ifdef CK5
211*67e74705SXin Li 
212*67e74705SXin Li // CK5-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
213*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
214*67e74705SXin Li // CK5-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
215*67e74705SXin Li 
216*67e74705SXin Li // CK5-LABEL: implicit_maps_nested_integer_and_enum
implicit_maps_nested_integer_and_enum(int a)217*67e74705SXin Li void implicit_maps_nested_integer_and_enum (int a){
218*67e74705SXin Li   enum Bla {
219*67e74705SXin Li     SomeEnum = 0x09
220*67e74705SXin Li   };
221*67e74705SXin Li 
222*67e74705SXin Li   // Using an enum should not change the mapping information.
223*67e74705SXin Li   int  i = a;
224*67e74705SXin Li 
225*67e74705SXin Li   // CK5-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
226*67e74705SXin Li   // CK5-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
227*67e74705SXin Li   // CK5-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
228*67e74705SXin Li   // CK5-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
229*67e74705SXin Li   // CK5-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
230*67e74705SXin Li   // CK5-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
231*67e74705SXin Li   // CK5-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
232*67e74705SXin Li   // CK5-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
233*67e74705SXin Li   // CK5-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
234*67e74705SXin Li   // CK5-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
235*67e74705SXin Li   // CK5-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
236*67e74705SXin Li   // CK5-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
237*67e74705SXin Li 
238*67e74705SXin Li   // CK5: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
239*67e74705SXin Li   #pragma omp target
240*67e74705SXin Li   {
241*67e74705SXin Li     ++i;
242*67e74705SXin Li     i += SomeEnum;
243*67e74705SXin Li   }
244*67e74705SXin Li }
245*67e74705SXin Li 
246*67e74705SXin Li // CK5: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
247*67e74705SXin Li // CK5: [[ADDR:%.+]] = alloca i[[sz]],
248*67e74705SXin Li // CK5: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
249*67e74705SXin Li // CK5-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
250*67e74705SXin Li // CK5-64: {{.+}} = load i32, i32* [[CADDR]],
251*67e74705SXin Li // CK5-32: {{.+}} = load i32, i32* [[ADDR]],
252*67e74705SXin Li 
253*67e74705SXin Li #endif
254*67e74705SXin Li ///==========================================================================///
255*67e74705SXin Li // RUN: %clang_cc1 -DCK6 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK6 --check-prefix CK6-64
256*67e74705SXin Li // RUN: %clang_cc1 -DCK6 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
257*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 CK6 --check-prefix CK6-64
258*67e74705SXin Li // RUN: %clang_cc1 -DCK6 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK6 --check-prefix CK6-32
259*67e74705SXin Li // RUN: %clang_cc1 -DCK6 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
260*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 CK6 --check-prefix CK6-32
261*67e74705SXin Li #ifdef CK6
262*67e74705SXin Li // CK6-DAG: [[GBL:@Gi]] = global i32 0
263*67e74705SXin Li // CK6-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
264*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
265*67e74705SXin Li // CK6-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
266*67e74705SXin Li 
267*67e74705SXin Li // CK6-LABEL: implicit_maps_host_global
268*67e74705SXin Li int Gi;
implicit_maps_host_global(int a)269*67e74705SXin Li void implicit_maps_host_global (int a){
270*67e74705SXin Li   // CK6-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
271*67e74705SXin Li   // CK6-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
272*67e74705SXin Li   // CK6-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
273*67e74705SXin Li   // CK6-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
274*67e74705SXin Li   // CK6-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
275*67e74705SXin Li   // CK6-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
276*67e74705SXin Li   // CK6-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
277*67e74705SXin Li   // CK6-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
278*67e74705SXin Li   // CK6-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
279*67e74705SXin Li   // CK6-64-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
280*67e74705SXin Li   // CK6-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
281*67e74705SXin Li   // CK6-64-DAG: store i32 [[GBLVAL:%.+]], i32* [[CADDR]],
282*67e74705SXin Li   // CK6-64-DAG: [[GBLVAL]] = load i32, i32* [[GBL]],
283*67e74705SXin Li   // CK6-32-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[GBLVAL:%.+]],
284*67e74705SXin Li 
285*67e74705SXin Li   // CK6: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
286*67e74705SXin Li   #pragma omp target
287*67e74705SXin Li   {
288*67e74705SXin Li     ++Gi;
289*67e74705SXin Li   }
290*67e74705SXin Li }
291*67e74705SXin Li 
292*67e74705SXin Li // CK6: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
293*67e74705SXin Li // CK6: [[ADDR:%.+]] = alloca i[[sz]],
294*67e74705SXin Li // CK6: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
295*67e74705SXin Li // CK6-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
296*67e74705SXin Li // CK6-64: {{.+}} = load i32, i32* [[CADDR]],
297*67e74705SXin Li // CK6-32: {{.+}} = load i32, i32* [[ADDR]],
298*67e74705SXin Li 
299*67e74705SXin Li #endif
300*67e74705SXin Li ///==========================================================================///
301*67e74705SXin Li // RUN: %clang_cc1 -DCK7 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK7 --check-prefix CK7-64
302*67e74705SXin Li // RUN: %clang_cc1 -DCK7 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
303*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 CK7  --check-prefix CK7-64
304*67e74705SXin Li // RUN: %clang_cc1 -DCK7 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK7  --check-prefix CK7-32
305*67e74705SXin Li // RUN: %clang_cc1 -DCK7 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
306*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 CK7  --check-prefix CK7-32
307*67e74705SXin Li #ifdef CK7
308*67e74705SXin Li 
309*67e74705SXin Li // For a 32-bit targets, the value doesn't fit the size of the pointer,
310*67e74705SXin Li // therefore it is passed by reference with a map 'to' specification.
311*67e74705SXin Li 
312*67e74705SXin Li // CK7-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 8]
313*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
314*67e74705SXin Li // CK7-64-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
315*67e74705SXin Li // Map types: OMP_MAP_TO  | OMP_MAP_IS_FIRST = 33
316*67e74705SXin Li // CK7-32-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 33]
317*67e74705SXin Li 
318*67e74705SXin Li // CK7-LABEL: implicit_maps_double
implicit_maps_double(int a)319*67e74705SXin Li void implicit_maps_double (int a){
320*67e74705SXin Li   double d = (double)a;
321*67e74705SXin Li 
322*67e74705SXin Li   // CK7-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
323*67e74705SXin Li   // CK7-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
324*67e74705SXin Li   // CK7-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
325*67e74705SXin Li   // CK7-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
326*67e74705SXin Li   // CK7-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
327*67e74705SXin Li 
328*67e74705SXin Li   // CK7-64-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
329*67e74705SXin Li   // CK7-64-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
330*67e74705SXin Li   // CK7-64-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
331*67e74705SXin Li   // CK7-64-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
332*67e74705SXin Li   // CK7-64-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
333*67e74705SXin Li   // CK7-64-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to double*
334*67e74705SXin Li   // CK7-64-64-DAG: store double {{.+}}, double* [[CADDR]],
335*67e74705SXin Li 
336*67e74705SXin Li   // CK7-32-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
337*67e74705SXin Li   // CK7-32-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
338*67e74705SXin Li   // CK7-32-DAG: [[VALBP]] = bitcast double* [[DECL:%.+]] to i8*
339*67e74705SXin Li   // CK7-32-DAG: [[VALP]] = bitcast double* [[DECL]] to i8*
340*67e74705SXin Li 
341*67e74705SXin Li   // CK7-64: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
342*67e74705SXin Li   // CK7-32: call void [[KERNEL:@.+]](double* [[DECL]])
343*67e74705SXin Li   #pragma omp target
344*67e74705SXin Li   {
345*67e74705SXin Li     d += 1.0;
346*67e74705SXin Li   }
347*67e74705SXin Li }
348*67e74705SXin Li 
349*67e74705SXin Li // CK7-64: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
350*67e74705SXin Li // CK7-64: [[ADDR:%.+]] = alloca i[[sz]],
351*67e74705SXin Li // CK7-64: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
352*67e74705SXin Li // CK7-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to double*
353*67e74705SXin Li // CK7-64: {{.+}} = load double, double* [[CADDR]],
354*67e74705SXin Li 
355*67e74705SXin Li // CK7-32: define internal void [[KERNEL]](double* {{.+}}[[ARG:%.+]])
356*67e74705SXin Li // CK7-32: [[ADDR:%.+]] = alloca double*,
357*67e74705SXin Li // CK7-32: store double* [[ARG]], double** [[ADDR]],
358*67e74705SXin Li // CK7-32: [[REF:%.+]] = load double*, double** [[ADDR]],
359*67e74705SXin Li // CK7-32: {{.+}} = load double, double* [[REF]],
360*67e74705SXin Li 
361*67e74705SXin Li #endif
362*67e74705SXin Li ///==========================================================================///
363*67e74705SXin Li // RUN: %clang_cc1 -DCK8 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK8
364*67e74705SXin Li // RUN: %clang_cc1 -DCK8 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
365*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 CK8
366*67e74705SXin Li // RUN: %clang_cc1 -DCK8 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK8
367*67e74705SXin Li // RUN: %clang_cc1 -DCK8 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
368*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 CK8
369*67e74705SXin Li #ifdef CK8
370*67e74705SXin Li 
371*67e74705SXin Li // CK8-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
372*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288
373*67e74705SXin Li // CK8-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
374*67e74705SXin Li 
375*67e74705SXin Li // CK8-LABEL: implicit_maps_float
implicit_maps_float(int a)376*67e74705SXin Li void implicit_maps_float (int a){
377*67e74705SXin Li   float f = (float)a;
378*67e74705SXin Li 
379*67e74705SXin Li   // CK8-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
380*67e74705SXin Li   // CK8-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
381*67e74705SXin Li   // CK8-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
382*67e74705SXin Li   // CK8-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
383*67e74705SXin Li   // CK8-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
384*67e74705SXin Li   // CK8-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
385*67e74705SXin Li   // CK8-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
386*67e74705SXin Li   // CK8-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
387*67e74705SXin Li   // CK8-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
388*67e74705SXin Li   // CK8-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
389*67e74705SXin Li   // CK8-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to float*
390*67e74705SXin Li   // CK8-DAG: store float {{.+}}, float* [[CADDR]],
391*67e74705SXin Li 
392*67e74705SXin Li   // CK8: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
393*67e74705SXin Li   #pragma omp target
394*67e74705SXin Li   {
395*67e74705SXin Li     f += 1.0;
396*67e74705SXin Li   }
397*67e74705SXin Li }
398*67e74705SXin Li 
399*67e74705SXin Li // CK8: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
400*67e74705SXin Li // CK8: [[ADDR:%.+]] = alloca i[[sz]],
401*67e74705SXin Li // CK8: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
402*67e74705SXin Li // CK8: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to float*
403*67e74705SXin Li // CK8: {{.+}} = load float, float* [[CADDR]],
404*67e74705SXin Li 
405*67e74705SXin Li #endif
406*67e74705SXin Li ///==========================================================================///
407*67e74705SXin Li // RUN: %clang_cc1 -DCK9 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK9
408*67e74705SXin Li // RUN: %clang_cc1 -DCK9 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
409*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 CK9
410*67e74705SXin Li // RUN: %clang_cc1 -DCK9 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK9
411*67e74705SXin Li // RUN: %clang_cc1 -DCK9 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
412*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 CK9
413*67e74705SXin Li #ifdef CK9
414*67e74705SXin Li 
415*67e74705SXin Li // CK9-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 16]
416*67e74705SXin Li // Map types: OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35
417*67e74705SXin Li // CK9-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 35]
418*67e74705SXin Li 
419*67e74705SXin Li // CK9-LABEL: implicit_maps_array
implicit_maps_array(int a)420*67e74705SXin Li void implicit_maps_array (int a){
421*67e74705SXin Li   double darr[2] = {(double)a, (double)a};
422*67e74705SXin Li 
423*67e74705SXin Li   // CK9-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
424*67e74705SXin Li   // CK9-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
425*67e74705SXin Li   // CK9-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
426*67e74705SXin Li   // CK9-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
427*67e74705SXin Li   // CK9-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
428*67e74705SXin Li   // CK9-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
429*67e74705SXin Li   // CK9-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
430*67e74705SXin Li   // CK9-DAG: [[VALBP]] = bitcast [2 x double]* [[DECL:%.+]] to i8*
431*67e74705SXin Li   // CK9-DAG: [[VALP]] = bitcast [2 x double]* [[DECL]] to i8*
432*67e74705SXin Li 
433*67e74705SXin Li   // CK9: call void [[KERNEL:@.+]]([2 x double]* [[DECL]])
434*67e74705SXin Li   #pragma omp target
435*67e74705SXin Li   {
436*67e74705SXin Li     darr[0] += 1.0;
437*67e74705SXin Li     darr[1] += 1.0;
438*67e74705SXin Li   }
439*67e74705SXin Li }
440*67e74705SXin Li 
441*67e74705SXin Li // CK9: define internal void [[KERNEL]]([2 x double]* {{.+}}[[ARG:%.+]])
442*67e74705SXin Li // CK9: [[ADDR:%.+]] = alloca [2 x double]*,
443*67e74705SXin Li // CK9: store [2 x double]* [[ARG]], [2 x double]** [[ADDR]],
444*67e74705SXin Li // CK9: [[REF:%.+]] = load [2 x double]*, [2 x double]** [[ADDR]],
445*67e74705SXin Li // CK9: {{.+}} = getelementptr inbounds [2 x double], [2 x double]* [[REF]], i[[sz]] 0, i[[sz]] 0
446*67e74705SXin Li #endif
447*67e74705SXin Li ///==========================================================================///
448*67e74705SXin Li // RUN: %clang_cc1 -DCK10 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK10
449*67e74705SXin Li // RUN: %clang_cc1 -DCK10 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
450*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 CK10
451*67e74705SXin Li // RUN: %clang_cc1 -DCK10 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK10
452*67e74705SXin Li // RUN: %clang_cc1 -DCK10 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
453*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 CK10
454*67e74705SXin Li #ifdef CK10
455*67e74705SXin Li 
456*67e74705SXin Li // CK10-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] zeroinitializer
457*67e74705SXin Li // Map types: OMP_MAP_IS_FIRST = 32
458*67e74705SXin Li // CK10-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 32]
459*67e74705SXin Li 
460*67e74705SXin Li // CK10-LABEL: implicit_maps_pointer
implicit_maps_pointer()461*67e74705SXin Li void implicit_maps_pointer (){
462*67e74705SXin Li   double *ddyn;
463*67e74705SXin Li 
464*67e74705SXin Li   // CK10-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
465*67e74705SXin Li   // CK10-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
466*67e74705SXin Li   // CK10-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
467*67e74705SXin Li   // CK10-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
468*67e74705SXin Li   // CK10-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
469*67e74705SXin Li   // CK10-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
470*67e74705SXin Li   // CK10-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
471*67e74705SXin Li   // CK10-DAG: [[VALBP]] = bitcast double* [[PTR:%.+]] to i8*
472*67e74705SXin Li   // CK10-DAG: [[VALP]] = bitcast double* [[PTR]] to i8*
473*67e74705SXin Li 
474*67e74705SXin Li   // CK10: call void [[KERNEL:@.+]](double* [[PTR]])
475*67e74705SXin Li   #pragma omp target
476*67e74705SXin Li   {
477*67e74705SXin Li     ddyn[0] += 1.0;
478*67e74705SXin Li     ddyn[1] += 1.0;
479*67e74705SXin Li   }
480*67e74705SXin Li }
481*67e74705SXin Li 
482*67e74705SXin Li // CK10: define internal void [[KERNEL]](double* {{.*}}[[ARG:%.+]])
483*67e74705SXin Li // CK10: [[ADDR:%.+]] = alloca double*,
484*67e74705SXin Li // CK10: store double* [[ARG]], double** [[ADDR]],
485*67e74705SXin Li // CK10: [[REF:%.+]] = load double*, double** [[ADDR]],
486*67e74705SXin Li // CK10: {{.+}} = getelementptr inbounds double, double* [[REF]], i[[sz]] 0
487*67e74705SXin Li 
488*67e74705SXin Li #endif
489*67e74705SXin Li ///==========================================================================///
490*67e74705SXin Li // RUN: %clang_cc1 -DCK11 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK11
491*67e74705SXin Li // RUN: %clang_cc1 -DCK11 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
492*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 CK11
493*67e74705SXin Li // RUN: %clang_cc1 -DCK11 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK11
494*67e74705SXin Li // RUN: %clang_cc1 -DCK11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
495*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 CK11
496*67e74705SXin Li #ifdef CK11
497*67e74705SXin Li 
498*67e74705SXin Li // CK11-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 16]
499*67e74705SXin Li // Map types: OMP_MAP_TO + OMP_MAP_IS_FIRST = 33
500*67e74705SXin Li // CK11-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 33]
501*67e74705SXin Li 
502*67e74705SXin Li // CK11-LABEL: implicit_maps_double_complex
implicit_maps_double_complex(int a)503*67e74705SXin Li void implicit_maps_double_complex (int a){
504*67e74705SXin Li   double _Complex dc = (double)a;
505*67e74705SXin Li 
506*67e74705SXin Li   // CK11-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
507*67e74705SXin Li   // CK11-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
508*67e74705SXin Li   // CK11-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
509*67e74705SXin Li   // CK11-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
510*67e74705SXin Li   // CK11-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
511*67e74705SXin Li   // CK11-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
512*67e74705SXin Li   // CK11-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
513*67e74705SXin Li   // CK11-DAG: [[VALBP]] = bitcast { double, double }* [[PTR:%.+]] to i8*
514*67e74705SXin Li   // CK11-DAG: [[VALP]] = bitcast { double, double }* [[PTR]] to i8*
515*67e74705SXin Li 
516*67e74705SXin Li   // CK11: call void [[KERNEL:@.+]]({ double, double }* [[PTR]])
517*67e74705SXin Li   #pragma omp target
518*67e74705SXin Li   {
519*67e74705SXin Li    dc *= dc;
520*67e74705SXin Li   }
521*67e74705SXin Li }
522*67e74705SXin Li 
523*67e74705SXin Li // CK11: define internal void [[KERNEL]]({ double, double }* {{.*}}[[ARG:%.+]])
524*67e74705SXin Li // CK11: [[ADDR:%.+]] = alloca { double, double }*,
525*67e74705SXin Li // CK11: store { double, double }* [[ARG]], { double, double }** [[ADDR]],
526*67e74705SXin Li // CK11: [[REF:%.+]] = load { double, double }*, { double, double }** [[ADDR]],
527*67e74705SXin Li // CK11: {{.+}} = getelementptr inbounds { double, double }, { double, double }* [[REF]], i32 0, i32 0
528*67e74705SXin Li #endif
529*67e74705SXin Li ///==========================================================================///
530*67e74705SXin Li // RUN: %clang_cc1 -DCK12 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK12 --check-prefix CK12-64
531*67e74705SXin Li // RUN: %clang_cc1 -DCK12 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
532*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 CK12 --check-prefix CK12-64
533*67e74705SXin Li // RUN: %clang_cc1 -DCK12 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK12 --check-prefix CK12-32
534*67e74705SXin Li // RUN: %clang_cc1 -DCK12 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
535*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 CK12 --check-prefix CK12-32
536*67e74705SXin Li #ifdef CK12
537*67e74705SXin Li 
538*67e74705SXin Li // For a 32-bit targets, the value doesn't fit the size of the pointer,
539*67e74705SXin Li // therefore it is passed by reference with a map 'to' specification.
540*67e74705SXin Li 
541*67e74705SXin Li // CK12-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 8]
542*67e74705SXin Li // Map types: OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288
543*67e74705SXin Li // CK12-64-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
544*67e74705SXin Li // Map types: OMP_MAP_TO + OMP_MAP_IS_FIRST = 33
545*67e74705SXin Li // CK12-32-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 33]
546*67e74705SXin Li 
547*67e74705SXin Li // CK12-LABEL: implicit_maps_float_complex
implicit_maps_float_complex(int a)548*67e74705SXin Li void implicit_maps_float_complex (int a){
549*67e74705SXin Li   float _Complex fc = (float)a;
550*67e74705SXin Li 
551*67e74705SXin Li   // CK12-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
552*67e74705SXin Li   // CK12-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
553*67e74705SXin Li   // CK12-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
554*67e74705SXin Li   // CK12-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
555*67e74705SXin Li   // CK12-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
556*67e74705SXin Li 
557*67e74705SXin Li   // CK12-64-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
558*67e74705SXin Li   // CK12-64-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
559*67e74705SXin Li   // CK12-64-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
560*67e74705SXin Li   // CK12-64-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
561*67e74705SXin Li   // CK12-64-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
562*67e74705SXin Li   // CK12-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to { float, float }*
563*67e74705SXin Li   // CK12-64-DAG: store { float, float } {{.+}}, { float, float }* [[CADDR]],
564*67e74705SXin Li 
565*67e74705SXin Li   // CK12-32-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
566*67e74705SXin Li   // CK12-32-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
567*67e74705SXin Li   // CK12-32-DAG: [[VALBP]] = bitcast { float, float }* [[DECL:%.+]] to i8*
568*67e74705SXin Li   // CK12-32-DAG: [[VALP]] = bitcast { float, float }* [[DECL]] to i8*
569*67e74705SXin Li 
570*67e74705SXin Li   // CK12-64: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
571*67e74705SXin Li   // CK12-32: call void [[KERNEL:@.+]]({ float, float }* [[DECL]])
572*67e74705SXin Li   #pragma omp target
573*67e74705SXin Li   {
574*67e74705SXin Li     fc *= fc;
575*67e74705SXin Li   }
576*67e74705SXin Li }
577*67e74705SXin Li 
578*67e74705SXin Li // CK12-64: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
579*67e74705SXin Li // CK12-64: [[ADDR:%.+]] = alloca i[[sz]],
580*67e74705SXin Li // CK12-64: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
581*67e74705SXin Li // CK12-64: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to { float, float }*
582*67e74705SXin Li // CK12-64: {{.+}} = getelementptr inbounds { float, float }, { float, float }* [[CADDR]], i32 0, i32 0
583*67e74705SXin Li 
584*67e74705SXin Li // CK12-32: define internal void [[KERNEL]]({ float, float }* {{.+}}[[ARG:%.+]])
585*67e74705SXin Li // CK12-32: [[ADDR:%.+]] = alloca { float, float }*,
586*67e74705SXin Li // CK12-32: store { float, float }* [[ARG]], { float, float }** [[ADDR]],
587*67e74705SXin Li // CK12-32: [[REF:%.+]] = load { float, float }*, { float, float }** [[ADDR]],
588*67e74705SXin Li // CK12-32: {{.+}} = getelementptr inbounds { float, float }, { float, float }* [[REF]], i32 0, i32 0
589*67e74705SXin Li #endif
590*67e74705SXin Li ///==========================================================================///
591*67e74705SXin Li // RUN: %clang_cc1 -DCK13 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK13
592*67e74705SXin Li // RUN: %clang_cc1 -DCK13 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
593*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 CK13
594*67e74705SXin Li // RUN: %clang_cc1 -DCK13 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK13
595*67e74705SXin Li // RUN: %clang_cc1 -DCK13 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
596*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 CK13
597*67e74705SXin Li #ifdef CK13
598*67e74705SXin Li 
599*67e74705SXin Li // We don't have a constant map size for VLAs.
600*67e74705SXin Li // Map types:
601*67e74705SXin Li //  - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 (vla size)
602*67e74705SXin Li //  - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 (vla size)
603*67e74705SXin Li //  - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35
604*67e74705SXin Li // CK13-DAG: [[TYPES:@.+]] = {{.+}}constant [3 x i32] [i32 288, i32 288, i32 35]
605*67e74705SXin Li 
606*67e74705SXin Li // CK13-LABEL: implicit_maps_variable_length_array
implicit_maps_variable_length_array(int a)607*67e74705SXin Li void implicit_maps_variable_length_array (int a){
608*67e74705SXin Li   double vla[2][a];
609*67e74705SXin Li 
610*67e74705SXin Li   // CK13-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 3, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], i[[sz:64|32]]* [[SGEP:%[^,]+]], {{.+}}[[TYPES]]{{.+}})
611*67e74705SXin Li   // CK13-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
612*67e74705SXin Li   // CK13-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
613*67e74705SXin Li   // CK13-DAG: [[SGEP]] = getelementptr inbounds {{.+}}[[SS:%[^,]+]], i32 0, i32 0
614*67e74705SXin Li 
615*67e74705SXin Li   // CK13-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
616*67e74705SXin Li   // CK13-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
617*67e74705SXin Li   // CK13-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[SS]], i32 0, i32 0
618*67e74705SXin Li   // CK13-DAG: store i8* inttoptr (i[[sz]] 2 to i8*), i8** [[BP0]],
619*67e74705SXin Li   // CK13-DAG: store i8* inttoptr (i[[sz]] 2 to i8*), i8** [[P0]],
620*67e74705SXin Li   // CK13-DAG: store i[[sz]] {{8|4}}, i[[sz]]* [[S0]],
621*67e74705SXin Li 
622*67e74705SXin Li   // CK13-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1
623*67e74705SXin Li   // CK13-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1
624*67e74705SXin Li   // CK13-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[SS]], i32 0, i32 1
625*67e74705SXin Li   // CK13-DAG: store i8* [[VALBP1:%.+]], i8** [[BP1]],
626*67e74705SXin Li   // CK13-DAG: store i8* [[VALP1:%.+]], i8** [[P1]],
627*67e74705SXin Li   // CK13-DAG: [[VALBP1]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
628*67e74705SXin Li   // CK13-DAG: [[VALP1]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
629*67e74705SXin Li   // CK13-DAG: store i[[sz]] {{8|4}}, i[[sz]]* [[S1]],
630*67e74705SXin Li 
631*67e74705SXin Li   // CK13-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 2
632*67e74705SXin Li   // CK13-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 2
633*67e74705SXin Li   // CK13-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[SS]], i32 0, i32 2
634*67e74705SXin Li   // CK13-DAG: store i8* [[VALBP2:%.+]], i8** [[BP2]],
635*67e74705SXin Li   // CK13-DAG: store i8* [[VALP2:%.+]], i8** [[P2]],
636*67e74705SXin Li   // CK13-DAG: store i[[sz]] [[VALS2:%.+]], i[[sz]]* [[S2]],
637*67e74705SXin Li   // CK13-DAG: [[VALBP2]] = bitcast double* [[DECL:%.+]] to i8*
638*67e74705SXin Li   // CK13-DAG: [[VALP2]] = bitcast double* [[DECL]] to i8*
639*67e74705SXin Li   // CK13-DAG: [[VALS2]] = mul nuw i[[sz]] %{{.+}}, 8
640*67e74705SXin Li 
641*67e74705SXin Li   // CK13: call void [[KERNEL:@.+]](i[[sz]] {{.+}}, i[[sz]] {{.+}}, double* [[DECL]])
642*67e74705SXin Li   #pragma omp target
643*67e74705SXin Li   {
644*67e74705SXin Li     vla[1][3] += 1.0;
645*67e74705SXin Li   }
646*67e74705SXin Li }
647*67e74705SXin Li 
648*67e74705SXin Li // CK13: define internal void [[KERNEL]](i[[sz]] [[VLA0:%.+]], i[[sz]] [[VLA1:%.+]], double* {{.+}}[[ARG:%.+]])
649*67e74705SXin Li // CK13: [[ADDR0:%.+]] = alloca i[[sz]],
650*67e74705SXin Li // CK13: [[ADDR1:%.+]] = alloca i[[sz]],
651*67e74705SXin Li // CK13: [[ADDR2:%.+]] = alloca double*,
652*67e74705SXin Li // CK13: store i[[sz]] [[VLA0]], i[[sz]]* [[ADDR0]],
653*67e74705SXin Li // CK13: store i[[sz]] [[VLA1]], i[[sz]]* [[ADDR1]],
654*67e74705SXin Li // CK13: store double* [[ARG]], double** [[ADDR2]],
655*67e74705SXin Li // CK13: {{.+}} = load i[[sz]],  i[[sz]]* [[ADDR0]],
656*67e74705SXin Li // CK13: {{.+}} = load i[[sz]],  i[[sz]]* [[ADDR1]],
657*67e74705SXin Li // CK13: [[REF:%.+]] = load double*, double** [[ADDR2]],
658*67e74705SXin Li // CK13: {{.+}} = getelementptr inbounds double, double* [[REF]], i[[sz]] %{{.+}}
659*67e74705SXin Li #endif
660*67e74705SXin Li ///==========================================================================///
661*67e74705SXin Li // RUN: %clang_cc1 -DCK14 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK14 --check-prefix CK14-64
662*67e74705SXin Li // RUN: %clang_cc1 -DCK14 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
663*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 CK14 --check-prefix CK14-64
664*67e74705SXin Li // RUN: %clang_cc1 -DCK14 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK14 --check-prefix CK14-32
665*67e74705SXin Li // RUN: %clang_cc1 -DCK14 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
666*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 CK14 --check-prefix CK14-32
667*67e74705SXin Li #ifdef CK14
668*67e74705SXin Li 
669*67e74705SXin Li // CK14-DAG: [[ST:%.+]] = type { i32, double }
670*67e74705SXin Li // CK14-DAG: [[SIZES:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{16|12}}, i{{64|32}} 4]
671*67e74705SXin Li // Map types:
672*67e74705SXin Li // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35
673*67e74705SXin Li // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288
674*67e74705SXin Li // CK14-DAG: [[TYPES:@.+]] = {{.+}}constant [2 x i32] [i32 35, i32 288]
675*67e74705SXin Li 
676*67e74705SXin Li class SSS {
677*67e74705SXin Li public:
678*67e74705SXin Li   int a;
679*67e74705SXin Li   double b;
680*67e74705SXin Li 
foo(int c)681*67e74705SXin Li   void foo(int c) {
682*67e74705SXin Li     #pragma omp target
683*67e74705SXin Li     {
684*67e74705SXin Li       a += c;
685*67e74705SXin Li       b += (double)c;
686*67e74705SXin Li     }
687*67e74705SXin Li   }
688*67e74705SXin Li 
SSS(int a,double b)689*67e74705SXin Li   SSS(int a, double b) : a(a), b(b) {}
690*67e74705SXin Li };
691*67e74705SXin Li 
692*67e74705SXin Li // CK14-LABEL: implicit_maps_class
implicit_maps_class(int a)693*67e74705SXin Li void implicit_maps_class (int a){
694*67e74705SXin Li   SSS sss(a, (double)a);
695*67e74705SXin Li 
696*67e74705SXin Li   // CK14: define {{.*}}void @{{.+}}foo{{.+}}([[ST]]* {{[^,]+}}, i32 {{[^,]+}})
697*67e74705SXin Li   // CK14-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 2, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
698*67e74705SXin Li   // CK14-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
699*67e74705SXin Li   // CK14-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
700*67e74705SXin Li 
701*67e74705SXin Li   // CK14-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
702*67e74705SXin Li   // CK14-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
703*67e74705SXin Li   // CK14-DAG: store i8* [[VALBP0:%.+]], i8** [[BP0]],
704*67e74705SXin Li   // CK14-DAG: store i8* [[VALP0:%.+]], i8** [[P0]],
705*67e74705SXin Li   // CK14-DAG: [[VALBP0]] = bitcast [[ST]]* [[DECL:%.+]] to i8*
706*67e74705SXin Li   // CK14-DAG: [[VALP0]] = bitcast [[ST]]* [[DECL]] to i8*
707*67e74705SXin Li 
708*67e74705SXin Li   // CK14-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1
709*67e74705SXin Li   // CK14-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1
710*67e74705SXin Li   // CK14-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
711*67e74705SXin Li   // CK14-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
712*67e74705SXin Li   // CK14-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
713*67e74705SXin Li   // CK14-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
714*67e74705SXin Li   // CK14-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
715*67e74705SXin Li   // CK14-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
716*67e74705SXin Li   // CK14-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
717*67e74705SXin Li 
718*67e74705SXin Li   // CK14: call void [[KERNEL:@.+]]([[ST]]* [[DECL]], i[[sz]] {{.+}})
719*67e74705SXin Li   sss.foo(123);
720*67e74705SXin Li }
721*67e74705SXin Li 
722*67e74705SXin Li // CK14: define internal void [[KERNEL]]([[ST]]* [[THIS:%.+]], i[[sz]] [[ARG:%.+]])
723*67e74705SXin Li // CK14: [[ADDR0:%.+]] = alloca [[ST]]*,
724*67e74705SXin Li // CK14: [[ADDR1:%.+]] = alloca i[[sz]],
725*67e74705SXin Li // CK14: store [[ST]]* [[THIS]], [[ST]]** [[ADDR0]],
726*67e74705SXin Li // CK14: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR1]],
727*67e74705SXin Li // CK14: [[REF0:%.+]] = load [[ST]]*, [[ST]]** [[ADDR0]],
728*67e74705SXin Li // CK14-64: [[CADDR1:%.+]] = bitcast i[[sz]]* [[ADDR1]] to i32*
729*67e74705SXin Li // CK14-64: {{.+}} = load i32,  i32* [[CADDR1]],
730*67e74705SXin Li // CK14-32: {{.+}} = load i32, i32* [[ADDR1]],
731*67e74705SXin Li // CK14: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF0]], i32 0, i32 0
732*67e74705SXin Li 
733*67e74705SXin Li #endif
734*67e74705SXin Li ///==========================================================================///
735*67e74705SXin Li // RUN: %clang_cc1 -DCK15 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK15 --check-prefix CK15-64
736*67e74705SXin Li // RUN: %clang_cc1 -DCK15 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
737*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 CK15 --check-prefix CK15-64
738*67e74705SXin Li // RUN: %clang_cc1 -DCK15 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK15 --check-prefix CK15-32
739*67e74705SXin Li // RUN: %clang_cc1 -DCK15 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
740*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 CK15 --check-prefix CK15-32
741*67e74705SXin Li #ifdef CK15
742*67e74705SXin Li 
743*67e74705SXin Li // CK15: [[ST:%.+]] = type { i32, double, i32* }
744*67e74705SXin Li // CK15: [[SIZES:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{24|16}}, i{{64|32}} 4]
745*67e74705SXin Li // Map types:
746*67e74705SXin Li // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35
747*67e74705SXin Li // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288
748*67e74705SXin Li // CK15: [[TYPES:@.+]] = {{.+}}constant [2 x i32] [i32 35, i32 288]
749*67e74705SXin Li 
750*67e74705SXin Li // CK15: [[SIZES2:@.+]] = {{.+}}constant [2 x i[[sz]]] [i{{64|32}} {{24|16}}, i{{64|32}} 4]
751*67e74705SXin Li // Map types:
752*67e74705SXin Li // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35
753*67e74705SXin Li // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288
754*67e74705SXin Li // CK15: [[TYPES2:@.+]] = {{.+}}constant [2 x i32] [i32 35, i32 288]
755*67e74705SXin Li 
756*67e74705SXin Li template<int x>
757*67e74705SXin Li class SSST {
758*67e74705SXin Li public:
759*67e74705SXin Li   int a;
760*67e74705SXin Li   double b;
761*67e74705SXin Li   int &r;
762*67e74705SXin Li 
foo(int c)763*67e74705SXin Li   void foo(int c) {
764*67e74705SXin Li     #pragma omp target
765*67e74705SXin Li     {
766*67e74705SXin Li       a += c + x;
767*67e74705SXin Li       b += (double)(c + x);
768*67e74705SXin Li       r += x;
769*67e74705SXin Li     }
770*67e74705SXin Li   }
771*67e74705SXin Li   template<int y>
bar(int c)772*67e74705SXin Li   void bar(int c) {
773*67e74705SXin Li     #pragma omp target
774*67e74705SXin Li     {
775*67e74705SXin Li       a += c + x + y;
776*67e74705SXin Li       b += (double)(c + x + y);
777*67e74705SXin Li       r += x + y;
778*67e74705SXin Li     }
779*67e74705SXin Li   }
780*67e74705SXin Li 
SSST(int a,double b,int & r)781*67e74705SXin Li   SSST(int a, double b, int &r) : a(a), b(b), r(r) {}
782*67e74705SXin Li };
783*67e74705SXin Li 
784*67e74705SXin Li // CK15-LABEL: implicit_maps_templated_class
implicit_maps_templated_class(int a)785*67e74705SXin Li void implicit_maps_templated_class (int a){
786*67e74705SXin Li   SSST<123> ssst(a, (double)a, a);
787*67e74705SXin Li 
788*67e74705SXin Li   // CK15: define {{.*}}void @{{.+}}foo{{.+}}([[ST]]* {{[^,]+}}, i32 {{[^,]+}})
789*67e74705SXin Li   // CK15-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 2, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
790*67e74705SXin Li   // CK15-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
791*67e74705SXin Li   // CK15-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
792*67e74705SXin Li 
793*67e74705SXin Li   // CK15-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
794*67e74705SXin Li   // CK15-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
795*67e74705SXin Li   // CK15-DAG: store i8* [[VALBP0:%.+]], i8** [[BP0]],
796*67e74705SXin Li   // CK15-DAG: store i8* [[VALP0:%.+]], i8** [[P0]],
797*67e74705SXin Li   // CK15-DAG: [[VALBP0]] = bitcast [[ST]]* [[DECL:%.+]] to i8*
798*67e74705SXin Li   // CK15-DAG: [[VALP0]] = bitcast [[ST]]* [[DECL]] to i8*
799*67e74705SXin Li 
800*67e74705SXin Li   // CK15-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1
801*67e74705SXin Li   // CK15-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1
802*67e74705SXin Li   // CK15-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
803*67e74705SXin Li   // CK15-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
804*67e74705SXin Li   // CK15-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
805*67e74705SXin Li   // CK15-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
806*67e74705SXin Li   // CK15-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
807*67e74705SXin Li   // CK15-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
808*67e74705SXin Li   // CK15-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
809*67e74705SXin Li 
810*67e74705SXin Li   // CK15: call void [[KERNEL:@.+]]([[ST]]* [[DECL]], i[[sz]] {{.+}})
811*67e74705SXin Li   ssst.foo(456);
812*67e74705SXin Li 
813*67e74705SXin Li   // CK15: define {{.*}}void @{{.+}}bar{{.+}}([[ST]]* {{[^,]+}}, i32 {{[^,]+}})
814*67e74705SXin Li   // CK15-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 2, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES2]]{{.+}}, {{.+}}[[TYPES2]]{{.+}})
815*67e74705SXin Li   // CK15-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
816*67e74705SXin Li   // CK15-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
817*67e74705SXin Li 
818*67e74705SXin Li   // CK15-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
819*67e74705SXin Li   // CK15-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
820*67e74705SXin Li   // CK15-DAG: store i8* [[VALBP0:%.+]], i8** [[BP0]],
821*67e74705SXin Li   // CK15-DAG: store i8* [[VALP0:%.+]], i8** [[P0]],
822*67e74705SXin Li   // CK15-DAG: [[VALBP0]] = bitcast [[ST]]* [[DECL:%.+]] to i8*
823*67e74705SXin Li   // CK15-DAG: [[VALP0]] = bitcast [[ST]]* [[DECL]] to i8*
824*67e74705SXin Li 
825*67e74705SXin Li   // CK15-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1
826*67e74705SXin Li   // CK15-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1
827*67e74705SXin Li   // CK15-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
828*67e74705SXin Li   // CK15-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
829*67e74705SXin Li   // CK15-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
830*67e74705SXin Li   // CK15-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
831*67e74705SXin Li   // CK15-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
832*67e74705SXin Li   // CK15-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
833*67e74705SXin Li   // CK15-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
834*67e74705SXin Li 
835*67e74705SXin Li   // CK15: call void [[KERNEL2:@.+]]([[ST]]* [[DECL]], i[[sz]] {{.+}})
836*67e74705SXin Li   ssst.bar<210>(789);
837*67e74705SXin Li }
838*67e74705SXin Li 
839*67e74705SXin Li // CK15: define internal void [[KERNEL]]([[ST]]* [[THIS:%.+]], i[[sz]] [[ARG:%.+]])
840*67e74705SXin Li // CK15: [[ADDR0:%.+]] = alloca [[ST]]*,
841*67e74705SXin Li // CK15: [[ADDR1:%.+]] = alloca i[[sz]],
842*67e74705SXin Li // CK15: store [[ST]]* [[THIS]], [[ST]]** [[ADDR0]],
843*67e74705SXin Li // CK15: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR1]],
844*67e74705SXin Li // CK15: [[REF0:%.+]] = load [[ST]]*, [[ST]]** [[ADDR0]],
845*67e74705SXin Li // CK15-64: [[CADDR1:%.+]] = bitcast i[[sz]]* [[ADDR1]] to i32*
846*67e74705SXin Li // CK15-64: {{.+}} = load i32,  i32* [[CADDR1]],
847*67e74705SXin Li // CK15-32: {{.+}} = load i32, i32* [[ADDR1]],
848*67e74705SXin Li // CK15: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF0]], i32 0, i32 0
849*67e74705SXin Li 
850*67e74705SXin Li // CK15: define internal void [[KERNEL2]]([[ST]]* [[THIS:%.+]], i[[sz]] [[ARG:%.+]])
851*67e74705SXin Li // CK15: [[ADDR0:%.+]] = alloca [[ST]]*,
852*67e74705SXin Li // CK15: [[ADDR1:%.+]] = alloca i[[sz]],
853*67e74705SXin Li // CK15: store [[ST]]* [[THIS]], [[ST]]** [[ADDR0]],
854*67e74705SXin Li // CK15: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR1]],
855*67e74705SXin Li // CK15: [[REF0:%.+]] = load [[ST]]*, [[ST]]** [[ADDR0]],
856*67e74705SXin Li // CK15-64: [[CADDR1:%.+]] = bitcast i[[sz]]* [[ADDR1]] to i32*
857*67e74705SXin Li // CK15-64: {{.+}} = load i32,  i32* [[CADDR1]],
858*67e74705SXin Li // CK15-32: {{.+}} = load i32, i32* [[ADDR1]],
859*67e74705SXin Li // CK15: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF0]], i32 0, i32 0
860*67e74705SXin Li 
861*67e74705SXin Li #endif
862*67e74705SXin Li ///==========================================================================///
863*67e74705SXin Li // RUN: %clang_cc1 -DCK16 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK16 --check-prefix CK16-64
864*67e74705SXin Li // RUN: %clang_cc1 -DCK16 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
865*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 CK16 --check-prefix CK16-64
866*67e74705SXin Li // RUN: %clang_cc1 -DCK16 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK16 --check-prefix CK16-32
867*67e74705SXin Li // RUN: %clang_cc1 -DCK16 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
868*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 CK16 --check-prefix CK16-32
869*67e74705SXin Li #ifdef CK16
870*67e74705SXin Li 
871*67e74705SXin Li // CK16-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
872*67e74705SXin Li // Map types:
873*67e74705SXin Li // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288
874*67e74705SXin Li // CK16-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
875*67e74705SXin Li 
876*67e74705SXin Li template<int y>
foo(int d)877*67e74705SXin Li int foo(int d) {
878*67e74705SXin Li   int res = d;
879*67e74705SXin Li   #pragma omp target
880*67e74705SXin Li   {
881*67e74705SXin Li     res += y;
882*67e74705SXin Li   }
883*67e74705SXin Li   return res;
884*67e74705SXin Li }
885*67e74705SXin Li // CK16-LABEL: implicit_maps_templated_function
implicit_maps_templated_function(int a)886*67e74705SXin Li void implicit_maps_templated_function (int a){
887*67e74705SXin Li   int i = a;
888*67e74705SXin Li 
889*67e74705SXin Li   // CK16: define {{.*}}i32 @{{.+}}foo{{.+}}(i32 {{[^,]+}})
890*67e74705SXin Li   // CK16-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
891*67e74705SXin Li   // CK16-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
892*67e74705SXin Li   // CK16-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
893*67e74705SXin Li 
894*67e74705SXin Li   // CK16-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
895*67e74705SXin Li   // CK16-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
896*67e74705SXin Li   // CK16-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
897*67e74705SXin Li   // CK16-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
898*67e74705SXin Li   // CK16-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
899*67e74705SXin Li   // CK16-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
900*67e74705SXin Li   // CK16-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
901*67e74705SXin Li   // CK16-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
902*67e74705SXin Li   // CK16-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
903*67e74705SXin Li 
904*67e74705SXin Li   // CK16: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
905*67e74705SXin Li   i = foo<543>(i);
906*67e74705SXin Li }
907*67e74705SXin Li // CK16: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
908*67e74705SXin Li // CK16: [[ADDR:%.+]] = alloca i[[sz]],
909*67e74705SXin Li // CK16: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
910*67e74705SXin Li // CK16-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
911*67e74705SXin Li // CK16-64: {{.+}} = load i32, i32* [[CADDR]],
912*67e74705SXin Li // CK16-32: {{.+}} = load i32, i32* [[ADDR]],
913*67e74705SXin Li 
914*67e74705SXin Li #endif
915*67e74705SXin Li ///==========================================================================///
916*67e74705SXin Li // RUN: %clang_cc1 -DCK17 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK17
917*67e74705SXin Li // RUN: %clang_cc1 -DCK17 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
918*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 CK17
919*67e74705SXin Li // RUN: %clang_cc1 -DCK17 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK17
920*67e74705SXin Li // RUN: %clang_cc1 -DCK17 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
921*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 CK17
922*67e74705SXin Li #ifdef CK17
923*67e74705SXin Li 
924*67e74705SXin Li // CK17-DAG: [[ST:%.+]] = type { i32, double }
925*67e74705SXin Li // CK17-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} {{16|12}}]
926*67e74705SXin Li // Map types: OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35
927*67e74705SXin Li // CK17-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 35]
928*67e74705SXin Li 
929*67e74705SXin Li class SSS {
930*67e74705SXin Li public:
931*67e74705SXin Li   int a;
932*67e74705SXin Li   double b;
933*67e74705SXin Li };
934*67e74705SXin Li 
935*67e74705SXin Li // CK17-LABEL: implicit_maps_struct
implicit_maps_struct(int a)936*67e74705SXin Li void implicit_maps_struct (int a){
937*67e74705SXin Li   SSS s = {a, (double)a};
938*67e74705SXin Li 
939*67e74705SXin Li   // CK17-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
940*67e74705SXin Li   // CK17-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
941*67e74705SXin Li   // CK17-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
942*67e74705SXin Li   // CK17-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
943*67e74705SXin Li   // CK17-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
944*67e74705SXin Li   // CK17-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
945*67e74705SXin Li   // CK17-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
946*67e74705SXin Li   // CK17-DAG: [[VALBP]] = bitcast [[ST]]* [[DECL:%.+]] to i8*
947*67e74705SXin Li   // CK17-DAG: [[VALP]] = bitcast [[ST]]* [[DECL]] to i8*
948*67e74705SXin Li 
949*67e74705SXin Li   // CK17: call void [[KERNEL:@.+]]([[ST]]* [[DECL]])
950*67e74705SXin Li   #pragma omp target
951*67e74705SXin Li   {
952*67e74705SXin Li     s.a += 1;
953*67e74705SXin Li     s.b += 1.0;
954*67e74705SXin Li   }
955*67e74705SXin Li }
956*67e74705SXin Li 
957*67e74705SXin Li // CK17: define internal void [[KERNEL]]([[ST]]* {{.+}}[[ARG:%.+]])
958*67e74705SXin Li // CK17: [[ADDR:%.+]] = alloca [[ST]]*,
959*67e74705SXin Li // CK17: store [[ST]]* [[ARG]], [[ST]]** [[ADDR]],
960*67e74705SXin Li // CK17: [[REF:%.+]] = load [[ST]]*, [[ST]]** [[ADDR]],
961*67e74705SXin Li // CK17: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF]], i32 0, i32 0
962*67e74705SXin Li #endif
963*67e74705SXin Li ///==========================================================================///
964*67e74705SXin Li // RUN: %clang_cc1 -DCK18 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK18 --check-prefix CK18-64
965*67e74705SXin Li // RUN: %clang_cc1 -DCK18 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
966*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 CK18 --check-prefix CK18-64
967*67e74705SXin Li // RUN: %clang_cc1 -DCK18 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK18 --check-prefix CK18-32
968*67e74705SXin Li // RUN: %clang_cc1 -DCK18 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
969*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 CK18 --check-prefix CK18-32
970*67e74705SXin Li #ifdef CK18
971*67e74705SXin Li 
972*67e74705SXin Li // CK18-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4]
973*67e74705SXin Li // Map types:
974*67e74705SXin Li // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288
975*67e74705SXin Li // CK18-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288]
976*67e74705SXin Li 
977*67e74705SXin Li template<typename T>
foo(T d)978*67e74705SXin Li int foo(T d) {
979*67e74705SXin Li   #pragma omp target
980*67e74705SXin Li   {
981*67e74705SXin Li     d += (T)1;
982*67e74705SXin Li   }
983*67e74705SXin Li   return d;
984*67e74705SXin Li }
985*67e74705SXin Li // CK18-LABEL: implicit_maps_template_type_capture
implicit_maps_template_type_capture(int a)986*67e74705SXin Li void implicit_maps_template_type_capture (int a){
987*67e74705SXin Li   int i = a;
988*67e74705SXin Li 
989*67e74705SXin Li   // CK18: define {{.*}}i32 @{{.+}}foo{{.+}}(i32 {{[^,]+}})
990*67e74705SXin Li   // CK18-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}})
991*67e74705SXin Li   // CK18-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
992*67e74705SXin Li   // CK18-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
993*67e74705SXin Li 
994*67e74705SXin Li   // CK18-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
995*67e74705SXin Li   // CK18-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
996*67e74705SXin Li   // CK18-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
997*67e74705SXin Li   // CK18-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
998*67e74705SXin Li   // CK18-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
999*67e74705SXin Li   // CK18-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8*
1000*67e74705SXin Li   // CK18-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]],
1001*67e74705SXin Li   // CK18-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32*
1002*67e74705SXin Li   // CK18-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
1003*67e74705SXin Li 
1004*67e74705SXin Li   // CK18: call void [[KERNEL:@.+]](i[[sz]] [[VAL]])
1005*67e74705SXin Li   i = foo(i);
1006*67e74705SXin Li }
1007*67e74705SXin Li // CK18: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]])
1008*67e74705SXin Li // CK18: [[ADDR:%.+]] = alloca i[[sz]],
1009*67e74705SXin Li // CK18: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]],
1010*67e74705SXin Li // CK18-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32*
1011*67e74705SXin Li // CK18-64: {{.+}} = load i32, i32* [[CADDR]],
1012*67e74705SXin Li // CK18-32: {{.+}} = load i32, i32* [[ADDR]],
1013*67e74705SXin Li 
1014*67e74705SXin Li #endif
1015*67e74705SXin Li ///==========================================================================///
1016*67e74705SXin Li // RUN: %clang_cc1 -DCK19 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK19 --check-prefix CK19-64
1017*67e74705SXin Li // RUN: %clang_cc1 -DCK19 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
1018*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 CK19 --check-prefix CK19-64
1019*67e74705SXin Li // RUN: %clang_cc1 -DCK19 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK19 --check-prefix CK19-32
1020*67e74705SXin Li // RUN: %clang_cc1 -DCK19 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
1021*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 CK19 --check-prefix CK19-32
1022*67e74705SXin Li #ifdef CK19
1023*67e74705SXin Li 
1024*67e74705SXin Li // CK19: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
1025*67e74705SXin Li // CK19: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
1026*67e74705SXin Li 
1027*67e74705SXin Li // CK19: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400]
1028*67e74705SXin Li // CK19: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
1029*67e74705SXin Li 
1030*67e74705SXin Li // CK19: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240]
1031*67e74705SXin Li // CK19: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
1032*67e74705SXin Li 
1033*67e74705SXin Li // CK19: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240]
1034*67e74705SXin Li // CK19: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1035*67e74705SXin Li 
1036*67e74705SXin Li // CK19: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400]
1037*67e74705SXin Li // CK19: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
1038*67e74705SXin Li 
1039*67e74705SXin Li // CK19: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
1040*67e74705SXin Li // CK19: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
1041*67e74705SXin Li 
1042*67e74705SXin Li // CK19: [[MTYPE06:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1043*67e74705SXin Li 
1044*67e74705SXin Li // CK19: [[MTYPE07:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
1045*67e74705SXin Li 
1046*67e74705SXin Li // CK19: [[SIZE08:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
1047*67e74705SXin Li // CK19: [[MTYPE08:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1048*67e74705SXin Li 
1049*67e74705SXin Li // CK19: [[SIZE09:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}]
1050*67e74705SXin Li // CK19: [[MTYPE09:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
1051*67e74705SXin Li 
1052*67e74705SXin Li // CK19: [[SIZE10:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240]
1053*67e74705SXin Li // CK19: [[MTYPE10:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1054*67e74705SXin Li 
1055*67e74705SXin Li // CK19: [[SIZE11:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240]
1056*67e74705SXin Li // CK19: [[MTYPE11:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
1057*67e74705SXin Li 
1058*67e74705SXin Li // CK19: [[SIZE12:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
1059*67e74705SXin Li // CK19: [[MTYPE12:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
1060*67e74705SXin Li 
1061*67e74705SXin Li // CK19: [[MTYPE13:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
1062*67e74705SXin Li 
1063*67e74705SXin Li // CK19: [[MTYPE14:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
1064*67e74705SXin Li 
1065*67e74705SXin Li // CK19: [[SIZE15:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
1066*67e74705SXin Li // CK19: [[MTYPE15:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
1067*67e74705SXin Li 
1068*67e74705SXin Li // CK19: [[MTYPE16:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 33]
1069*67e74705SXin Li 
1070*67e74705SXin Li // CK19: [[SIZE17:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 240]
1071*67e74705SXin Li // CK19: [[MTYPE17:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 34]
1072*67e74705SXin Li 
1073*67e74705SXin Li // CK19: [[SIZE18:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 240]
1074*67e74705SXin Li // CK19: [[MTYPE18:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 35]
1075*67e74705SXin Li 
1076*67e74705SXin Li // CK19: [[MTYPE19:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 32]
1077*67e74705SXin Li 
1078*67e74705SXin Li // CK19: [[SIZE20:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
1079*67e74705SXin Li // CK19: [[MTYPE20:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 33]
1080*67e74705SXin Li 
1081*67e74705SXin Li // CK19: [[MTYPE21:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 35]
1082*67e74705SXin Li 
1083*67e74705SXin Li // CK19: [[SIZE22:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
1084*67e74705SXin Li // CK19: [[MTYPE22:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 35]
1085*67e74705SXin Li 
1086*67e74705SXin Li // CK19: [[SIZE23:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
1087*67e74705SXin Li // CK19: [[MTYPE23:@.+]] = private {{.*}}constant [1 x i32] [i32 39]
1088*67e74705SXin Li 
1089*67e74705SXin Li // CK19: [[SIZE24:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 480]
1090*67e74705SXin Li // CK19: [[MTYPE24:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1091*67e74705SXin Li 
1092*67e74705SXin Li // CK19: [[SIZE25:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16]
1093*67e74705SXin Li // CK19: [[MTYPE25:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1094*67e74705SXin Li 
1095*67e74705SXin Li // CK19: [[SIZE26:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 24]
1096*67e74705SXin Li // CK19: [[MTYPE26:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1097*67e74705SXin Li 
1098*67e74705SXin Li // CK19: [[SIZE27:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
1099*67e74705SXin Li // CK19: [[MTYPE27:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1100*67e74705SXin Li 
1101*67e74705SXin Li // CK19: [[SIZE28:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 16]
1102*67e74705SXin Li // CK19: [[MTYPE28:@.+]] = private {{.*}}constant [3 x i32] [i32 35, i32 19, i32 19]
1103*67e74705SXin Li 
1104*67e74705SXin Li // CK19: [[SIZE29:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 4]
1105*67e74705SXin Li // CK19: [[MTYPE29:@.+]] = private {{.*}}constant [3 x i32] [i32 35, i32 19, i32 19]
1106*67e74705SXin Li 
1107*67e74705SXin Li // CK19: [[MTYPE30:@.+]] = private {{.*}}constant [4 x i32] [i32 288, i32 288, i32 288, i32 35]
1108*67e74705SXin Li 
1109*67e74705SXin Li // CK19: [[SIZE31:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 40]
1110*67e74705SXin Li // CK19: [[MTYPE31:@.+]] = private {{.*}}constant [4 x i32] [i32 288, i32 288, i32 288, i32 35]
1111*67e74705SXin Li 
1112*67e74705SXin Li // CK19: [[SIZE32:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 13728]
1113*67e74705SXin Li // CK19: [[MTYPE32:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1114*67e74705SXin Li 
1115*67e74705SXin Li // CK19: [[SIZE33:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 13728]
1116*67e74705SXin Li // CK19: [[MTYPE33:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1117*67e74705SXin Li 
1118*67e74705SXin Li // CK19: [[SIZE34:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 13728]
1119*67e74705SXin Li // CK19: [[MTYPE34:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1120*67e74705SXin Li 
1121*67e74705SXin Li // CK19: [[MTYPE35:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1122*67e74705SXin Li 
1123*67e74705SXin Li // CK19: [[SIZE36:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 208]
1124*67e74705SXin Li // CK19: [[MTYPE36:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1125*67e74705SXin Li 
1126*67e74705SXin Li // CK19: [[MTYPE37:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35]
1127*67e74705SXin Li 
1128*67e74705SXin Li // CK19: [[MTYPE38:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35]
1129*67e74705SXin Li 
1130*67e74705SXin Li // CK19: [[MTYPE39:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35]
1131*67e74705SXin Li 
1132*67e74705SXin Li // CK19: [[MTYPE40:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35]
1133*67e74705SXin Li 
1134*67e74705SXin Li // CK19: [[SIZE41:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 208]
1135*67e74705SXin Li // CK19: [[MTYPE41:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35]
1136*67e74705SXin Li 
1137*67e74705SXin Li // CK19: [[SIZE42:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 104]
1138*67e74705SXin Li // CK19: [[MTYPE42:@.+]] = private {{.*}}constant [3 x i32] [i32 35, i32 19, i32 19]
1139*67e74705SXin Li 
1140*67e74705SXin Li // CK19: [[MTYPE43:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
1141*67e74705SXin Li 
1142*67e74705SXin Li // CK19-LABEL: explicit_maps_single
explicit_maps_single(int ii)1143*67e74705SXin Li void explicit_maps_single (int ii){
1144*67e74705SXin Li   // Map of a scalar.
1145*67e74705SXin Li   int a = ii;
1146*67e74705SXin Li 
1147*67e74705SXin Li   // Region 00
1148*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
1149*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1150*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1151*67e74705SXin Li 
1152*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1153*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1154*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1155*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1156*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
1157*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
1158*67e74705SXin Li 
1159*67e74705SXin Li   // CK19: call void [[CALL00:@.+]](i32* {{[^,]+}})
1160*67e74705SXin Li   #pragma omp target map(alloc:a)
1161*67e74705SXin Li   {
1162*67e74705SXin Li     ++a;
1163*67e74705SXin Li   }
1164*67e74705SXin Li 
1165*67e74705SXin Li   // Map of an array.
1166*67e74705SXin Li   int arra[100];
1167*67e74705SXin Li 
1168*67e74705SXin Li   // Region 01
1169*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
1170*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1171*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1172*67e74705SXin Li 
1173*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1174*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1175*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1176*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1177*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1178*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [100 x i32]* [[VAR0]] to i8*
1179*67e74705SXin Li 
1180*67e74705SXin Li   // CK19: call void [[CALL01:@.+]]([100 x i32]* {{[^,]+}})
1181*67e74705SXin Li   #pragma omp target map(to:arra)
1182*67e74705SXin Li   {
1183*67e74705SXin Li     arra[50]++;
1184*67e74705SXin Li   }
1185*67e74705SXin Li 
1186*67e74705SXin Li   // Region 02
1187*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
1188*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1189*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1190*67e74705SXin Li 
1191*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1192*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1193*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1194*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1195*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1196*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1197*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 20
1198*67e74705SXin Li 
1199*67e74705SXin Li   // CK19: call void [[CALL02:@.+]]([100 x i32]* {{[^,]+}})
1200*67e74705SXin Li   #pragma omp target map(from:arra[20:60])
1201*67e74705SXin Li   {
1202*67e74705SXin Li     arra[50]++;
1203*67e74705SXin Li   }
1204*67e74705SXin Li 
1205*67e74705SXin Li   // Region 03
1206*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
1207*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1208*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1209*67e74705SXin Li 
1210*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1211*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1212*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1213*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1214*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1215*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1216*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 0
1217*67e74705SXin Li 
1218*67e74705SXin Li   // CK19: call void [[CALL03:@.+]]([100 x i32]* {{[^,]+}})
1219*67e74705SXin Li   #pragma omp target map(tofrom:arra[:60])
1220*67e74705SXin Li   {
1221*67e74705SXin Li     arra[50]++;
1222*67e74705SXin Li   }
1223*67e74705SXin Li 
1224*67e74705SXin Li   // Region 04
1225*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}})
1226*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1227*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1228*67e74705SXin Li 
1229*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1230*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1231*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1232*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1233*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1234*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1235*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 0
1236*67e74705SXin Li 
1237*67e74705SXin Li   // CK19: call void [[CALL04:@.+]]([100 x i32]* {{[^,]+}})
1238*67e74705SXin Li   #pragma omp target map(alloc:arra[:])
1239*67e74705SXin Li   {
1240*67e74705SXin Li     arra[50]++;
1241*67e74705SXin Li   }
1242*67e74705SXin Li 
1243*67e74705SXin Li   // Region 05
1244*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}})
1245*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1246*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1247*67e74705SXin Li 
1248*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1249*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1250*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1251*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1252*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1253*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1254*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 15
1255*67e74705SXin Li 
1256*67e74705SXin Li   // CK19: call void [[CALL05:@.+]]([100 x i32]* {{[^,]+}})
1257*67e74705SXin Li   #pragma omp target map(to:arra[15])
1258*67e74705SXin Li   {
1259*67e74705SXin Li     arra[15]++;
1260*67e74705SXin Li   }
1261*67e74705SXin Li 
1262*67e74705SXin Li   // Region 06
1263*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE06]]{{.+}})
1264*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1265*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1266*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1267*67e74705SXin Li 
1268*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1269*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1270*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1271*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1272*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1273*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]]
1274*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1275*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1276*67e74705SXin Li   // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4
1277*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} %{{.*}}
1278*67e74705SXin Li 
1279*67e74705SXin Li   // CK19: call void [[CALL06:@.+]]([100 x i32]* {{[^,]+}})
1280*67e74705SXin Li   #pragma omp target map(tofrom:arra[ii:ii+23])
1281*67e74705SXin Li   {
1282*67e74705SXin Li     arra[50]++;
1283*67e74705SXin Li   }
1284*67e74705SXin Li 
1285*67e74705SXin Li   // Region 07
1286*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE07]]{{.+}})
1287*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1288*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1289*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1290*67e74705SXin Li 
1291*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1292*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1293*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1294*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1295*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1296*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]]
1297*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1298*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1299*67e74705SXin Li   // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4
1300*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 0
1301*67e74705SXin Li 
1302*67e74705SXin Li   // CK19: call void [[CALL07:@.+]]([100 x i32]* {{[^,]+}})
1303*67e74705SXin Li   #pragma omp target map(alloc:arra[:ii])
1304*67e74705SXin Li   {
1305*67e74705SXin Li     arra[50]++;
1306*67e74705SXin Li   }
1307*67e74705SXin Li 
1308*67e74705SXin Li   // Region 08
1309*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE08]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE08]]{{.+}})
1310*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1311*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1312*67e74705SXin Li 
1313*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1314*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1315*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1316*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1317*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8*
1318*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1319*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} %{{.*}}
1320*67e74705SXin Li 
1321*67e74705SXin Li   // CK19: call void [[CALL08:@.+]]([100 x i32]* {{[^,]+}})
1322*67e74705SXin Li   #pragma omp target map(tofrom:arra[ii])
1323*67e74705SXin Li   {
1324*67e74705SXin Li     arra[15]++;
1325*67e74705SXin Li   }
1326*67e74705SXin Li 
1327*67e74705SXin Li   // Map of a pointer.
1328*67e74705SXin Li   int *pa;
1329*67e74705SXin Li 
1330*67e74705SXin Li   // Region 09
1331*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE09]]{{.+}})
1332*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1333*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1334*67e74705SXin Li 
1335*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1336*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1337*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1338*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1339*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32** [[VAR0:%.+]] to i8*
1340*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32** [[VAR0]] to i8*
1341*67e74705SXin Li 
1342*67e74705SXin Li   // CK19: call void [[CALL09:@.+]](i32** {{[^,]+}})
1343*67e74705SXin Li   #pragma omp target map(from:pa)
1344*67e74705SXin Li   {
1345*67e74705SXin Li     pa[50]++;
1346*67e74705SXin Li   }
1347*67e74705SXin Li 
1348*67e74705SXin Li   // Region 10
1349*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE10]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE10]]{{.+}})
1350*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1351*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1352*67e74705SXin Li 
1353*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1354*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1355*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1356*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1357*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
1358*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1359*67e74705SXin Li   // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
1360*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 20
1361*67e74705SXin Li   // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
1362*67e74705SXin Li 
1363*67e74705SXin Li   // CK19: call void [[CALL10:@.+]](i32* {{[^,]+}})
1364*67e74705SXin Li   #pragma omp target map(tofrom:pa[20:60])
1365*67e74705SXin Li   {
1366*67e74705SXin Li     pa[50]++;
1367*67e74705SXin Li   }
1368*67e74705SXin Li 
1369*67e74705SXin Li   // Region 11
1370*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE11]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE11]]{{.+}})
1371*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1372*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1373*67e74705SXin Li 
1374*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1375*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1376*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1377*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1378*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
1379*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1380*67e74705SXin Li   // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
1381*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0
1382*67e74705SXin Li   // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
1383*67e74705SXin Li 
1384*67e74705SXin Li   // CK19: call void [[CALL11:@.+]](i32* {{[^,]+}})
1385*67e74705SXin Li   #pragma omp target map(alloc:pa[:60])
1386*67e74705SXin Li   {
1387*67e74705SXin Li     pa[50]++;
1388*67e74705SXin Li   }
1389*67e74705SXin Li 
1390*67e74705SXin Li   // Region 12
1391*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE12]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE12]]{{.+}})
1392*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1393*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1394*67e74705SXin Li 
1395*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1396*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1397*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1398*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1399*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
1400*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1401*67e74705SXin Li   // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
1402*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 15
1403*67e74705SXin Li   // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
1404*67e74705SXin Li 
1405*67e74705SXin Li   // CK19: call void [[CALL12:@.+]](i32* {{[^,]+}})
1406*67e74705SXin Li   #pragma omp target map(to:pa[15])
1407*67e74705SXin Li   {
1408*67e74705SXin Li     pa[15]++;
1409*67e74705SXin Li   }
1410*67e74705SXin Li 
1411*67e74705SXin Li   // Region 13
1412*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE13]]{{.+}})
1413*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1414*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1415*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1416*67e74705SXin Li 
1417*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1418*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1419*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1420*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1421*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1422*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]]
1423*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
1424*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1425*67e74705SXin Li   // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4
1426*67e74705SXin Li   // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
1427*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} %{{.*}}
1428*67e74705SXin Li   // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
1429*67e74705SXin Li 
1430*67e74705SXin Li   // CK19: call void [[CALL13:@.+]](i32* {{[^,]+}})
1431*67e74705SXin Li   #pragma omp target map(alloc:pa[ii-23:ii])
1432*67e74705SXin Li   {
1433*67e74705SXin Li     pa[50]++;
1434*67e74705SXin Li   }
1435*67e74705SXin Li 
1436*67e74705SXin Li   // Region 14
1437*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE14]]{{.+}})
1438*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1439*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1440*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1441*67e74705SXin Li 
1442*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1443*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1444*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1445*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1446*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1447*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]]
1448*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
1449*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1450*67e74705SXin Li   // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4
1451*67e74705SXin Li   // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
1452*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0
1453*67e74705SXin Li   // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
1454*67e74705SXin Li 
1455*67e74705SXin Li   // CK19: call void [[CALL14:@.+]](i32* {{[^,]+}})
1456*67e74705SXin Li   #pragma omp target map(to:pa[:ii])
1457*67e74705SXin Li   {
1458*67e74705SXin Li     pa[50]++;
1459*67e74705SXin Li   }
1460*67e74705SXin Li 
1461*67e74705SXin Li   // Region 15
1462*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE15]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE15]]{{.+}})
1463*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1464*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1465*67e74705SXin Li 
1466*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1467*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1468*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1469*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1470*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
1471*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1472*67e74705SXin Li   // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
1473*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} %{{.*}}
1474*67e74705SXin Li   // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
1475*67e74705SXin Li 
1476*67e74705SXin Li   // CK19: call void [[CALL15:@.+]](i32* {{[^,]+}})
1477*67e74705SXin Li   #pragma omp target map(from:pa[ii+12])
1478*67e74705SXin Li   {
1479*67e74705SXin Li     pa[15]++;
1480*67e74705SXin Li   }
1481*67e74705SXin Li 
1482*67e74705SXin Li   // Map of a variable-size array.
1483*67e74705SXin Li   int va[ii];
1484*67e74705SXin Li 
1485*67e74705SXin Li   // Region 16
1486*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE16]]{{.+}})
1487*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1488*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1489*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1490*67e74705SXin Li 
1491*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1492*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1493*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1494*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1495*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1496*67e74705SXin Li   // CK19-DAG: store i{{.+}} {{8|4}}, i{{.+}}* [[S0]]
1497*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1498*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1499*67e74705SXin Li 
1500*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1501*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1502*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
1503*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1504*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1505*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL1:%[^,]+]], i{{.+}}* [[S1]]
1506*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1507*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[VAR1]] to i8*
1508*67e74705SXin Li   // CK19-DAG: [[CSVAL1]] = mul nuw i{{.+}} %{{.*}}, 4
1509*67e74705SXin Li 
1510*67e74705SXin Li   // CK19: call void [[CALL16:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1511*67e74705SXin Li   #pragma omp target map(to:va)
1512*67e74705SXin Li   {
1513*67e74705SXin Li    va[50]++;
1514*67e74705SXin Li   }
1515*67e74705SXin Li 
1516*67e74705SXin Li   // Region 17
1517*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE17]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE17]]{{.+}})
1518*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1519*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1520*67e74705SXin Li 
1521*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1522*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1523*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1524*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1525*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1526*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1527*67e74705SXin Li 
1528*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1529*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1530*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1531*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1532*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1533*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
1534*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 20
1535*67e74705SXin Li 
1536*67e74705SXin Li   // CK19: call void [[CALL17:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1537*67e74705SXin Li   #pragma omp target map(from:va[20:60])
1538*67e74705SXin Li   {
1539*67e74705SXin Li    va[50]++;
1540*67e74705SXin Li   }
1541*67e74705SXin Li 
1542*67e74705SXin Li   // Region 18
1543*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE18]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE18]]{{.+}})
1544*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1545*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1546*67e74705SXin Li 
1547*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1548*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1549*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1550*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1551*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1552*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1553*67e74705SXin Li 
1554*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1555*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1556*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1557*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1558*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1559*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
1560*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 0
1561*67e74705SXin Li 
1562*67e74705SXin Li   // CK19: call void [[CALL18:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1563*67e74705SXin Li   #pragma omp target map(tofrom:va[:60])
1564*67e74705SXin Li   {
1565*67e74705SXin Li    va[50]++;
1566*67e74705SXin Li   }
1567*67e74705SXin Li 
1568*67e74705SXin Li   // Region 19
1569*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE19]]{{.+}})
1570*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1571*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1572*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1573*67e74705SXin Li 
1574*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1575*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1576*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1577*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1578*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1579*67e74705SXin Li   // CK19-DAG: store i{{.+}} {{8|4}}, i{{.+}}* [[S0]]
1580*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1581*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1582*67e74705SXin Li 
1583*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1584*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1585*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
1586*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1587*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1588*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL1:%[^,]+]], i{{.+}}* [[S1]]
1589*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1590*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
1591*67e74705SXin Li   // CK19-DAG: [[CSVAL1]] = mul nuw i{{.+}} %{{.*}}, 4
1592*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 0
1593*67e74705SXin Li 
1594*67e74705SXin Li   // CK19: call void [[CALL19:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1595*67e74705SXin Li   #pragma omp target map(alloc:va[:])
1596*67e74705SXin Li   {
1597*67e74705SXin Li    va[50]++;
1598*67e74705SXin Li   }
1599*67e74705SXin Li 
1600*67e74705SXin Li   // Region 20
1601*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE20]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE20]]{{.+}})
1602*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1603*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1604*67e74705SXin Li 
1605*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1606*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1607*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1608*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1609*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1610*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1611*67e74705SXin Li 
1612*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1613*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1614*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1615*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1616*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1617*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
1618*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 15
1619*67e74705SXin Li 
1620*67e74705SXin Li   // CK19: call void [[CALL20:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1621*67e74705SXin Li   #pragma omp target map(to:va[15])
1622*67e74705SXin Li   {
1623*67e74705SXin Li    va[15]++;
1624*67e74705SXin Li   }
1625*67e74705SXin Li 
1626*67e74705SXin Li   // Region 21
1627*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE21]]{{.+}})
1628*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1629*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1630*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1631*67e74705SXin Li 
1632*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1633*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1634*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1635*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1636*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1637*67e74705SXin Li   // CK19-DAG: store i{{.+}} {{8|4}}, i{{.+}}* [[S0]]
1638*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1639*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1640*67e74705SXin Li 
1641*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1642*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1643*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
1644*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1645*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1646*67e74705SXin Li   // CK19-DAG: store i{{.+}} [[CSVAL1:%[^,]+]], i{{.+}}* [[S1]]
1647*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1648*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
1649*67e74705SXin Li   // CK19-DAG: [[CSVAL1]] = mul nuw i{{.+}} %{{.*}}, 4
1650*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} %{{.+}}
1651*67e74705SXin Li 
1652*67e74705SXin Li   // CK19: call void [[CALL21:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1653*67e74705SXin Li   #pragma omp target map(tofrom:va[ii:ii+23])
1654*67e74705SXin Li   {
1655*67e74705SXin Li    va[50]++;
1656*67e74705SXin Li   }
1657*67e74705SXin Li 
1658*67e74705SXin Li   // Region 22
1659*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE22]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE22]]{{.+}})
1660*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1661*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1662*67e74705SXin Li 
1663*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1664*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1665*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1666*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1667*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8*
1668*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8*
1669*67e74705SXin Li 
1670*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1671*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1672*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1673*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1674*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
1675*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
1676*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} %{{.+}}
1677*67e74705SXin Li 
1678*67e74705SXin Li   // CK19: call void [[CALL22:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}})
1679*67e74705SXin Li   #pragma omp target map(tofrom:va[ii])
1680*67e74705SXin Li   {
1681*67e74705SXin Li    va[15]++;
1682*67e74705SXin Li   }
1683*67e74705SXin Li 
1684*67e74705SXin Li   // Always.
1685*67e74705SXin Li   // Region 23
1686*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE23]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE23]]{{.+}})
1687*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1688*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1689*67e74705SXin Li 
1690*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1691*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1692*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1693*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1694*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
1695*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
1696*67e74705SXin Li 
1697*67e74705SXin Li   // CK19: call void [[CALL23:@.+]](i32* {{[^,]+}})
1698*67e74705SXin Li   #pragma omp target map(always, tofrom: a)
1699*67e74705SXin Li   {
1700*67e74705SXin Li    a++;
1701*67e74705SXin Li   }
1702*67e74705SXin Li 
1703*67e74705SXin Li   // Multidimensional arrays.
1704*67e74705SXin Li   int marr[4][5][6];
1705*67e74705SXin Li   int ***mptr;
1706*67e74705SXin Li 
1707*67e74705SXin Li   // Region 24
1708*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE24]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE24]]{{.+}})
1709*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1710*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1711*67e74705SXin Li 
1712*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1713*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1714*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1715*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1716*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8*
1717*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0]] to i8*
1718*67e74705SXin Li 
1719*67e74705SXin Li   // CK19: call void [[CALL24:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}})
1720*67e74705SXin Li   #pragma omp target map(tofrom: marr)
1721*67e74705SXin Li   {
1722*67e74705SXin Li    marr[1][2][3]++;
1723*67e74705SXin Li   }
1724*67e74705SXin Li 
1725*67e74705SXin Li   // Region 25
1726*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE25]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE25]]{{.+}})
1727*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1728*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1729*67e74705SXin Li 
1730*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1731*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1732*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1733*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1734*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8*
1735*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1736*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[6 x i32]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 2
1737*67e74705SXin Li   // CK19-DAG: [[SEC00]] = getelementptr {{.*}}[5 x [6 x i32]]* [[SEC000:[^,]+]], i{{.+}} 0, i{{.+}} 2
1738*67e74705SXin Li   // CK19-DAG: [[SEC000]] = getelementptr {{.*}}[4 x [5 x [6 x i32]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
1739*67e74705SXin Li 
1740*67e74705SXin Li   // CK19: call void [[CALL25:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}})
1741*67e74705SXin Li   #pragma omp target map(tofrom: marr[1][2][2:4])
1742*67e74705SXin Li   {
1743*67e74705SXin Li    marr[1][2][3]++;
1744*67e74705SXin Li   }
1745*67e74705SXin Li 
1746*67e74705SXin Li   // Region 26
1747*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE26]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE26]]{{.+}})
1748*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1749*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1750*67e74705SXin Li 
1751*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1752*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1753*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1754*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1755*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8*
1756*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1757*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[6 x i32]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 0
1758*67e74705SXin Li   // CK19-DAG: [[SEC00]] = getelementptr {{.*}}[5 x [6 x i32]]* [[SEC000:[^,]+]], i{{.+}} 0, i{{.+}} 2
1759*67e74705SXin Li   // CK19-DAG: [[SEC000]] = getelementptr {{.*}}[4 x [5 x [6 x i32]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
1760*67e74705SXin Li 
1761*67e74705SXin Li   // CK19: call void [[CALL26:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}})
1762*67e74705SXin Li   #pragma omp target map(tofrom: marr[1][2][:])
1763*67e74705SXin Li   {
1764*67e74705SXin Li    marr[1][2][3]++;
1765*67e74705SXin Li   }
1766*67e74705SXin Li 
1767*67e74705SXin Li   // Region 27
1768*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE27]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE27]]{{.+}})
1769*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1770*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1771*67e74705SXin Li 
1772*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1773*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1774*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1775*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1776*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8*
1777*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
1778*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[6 x i32]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 3
1779*67e74705SXin Li   // CK19-DAG: [[SEC00]] = getelementptr {{.*}}[5 x [6 x i32]]* [[SEC000:[^,]+]], i{{.+}} 0, i{{.+}} 2
1780*67e74705SXin Li   // CK19-DAG: [[SEC000]] = getelementptr {{.*}}[4 x [5 x [6 x i32]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
1781*67e74705SXin Li 
1782*67e74705SXin Li   // CK19: call void [[CALL27:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}})
1783*67e74705SXin Li   #pragma omp target map(tofrom: marr[1][2][3])
1784*67e74705SXin Li   {
1785*67e74705SXin Li    marr[1][2][3]++;
1786*67e74705SXin Li   }
1787*67e74705SXin Li 
1788*67e74705SXin Li   // Region 28
1789*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE28]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE28]]{{.+}})
1790*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1791*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1792*67e74705SXin Li 
1793*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1794*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1795*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1796*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1797*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32*** [[VAR0:%.+]] to i8*
1798*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32*** [[SEC0:%.+]] to i8*
1799*67e74705SXin Li   // CK19-DAG: [[VAR0]] = load i32***, i32**** [[PTR:%[^,]+]],
1800*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32*** [[SEC00:[^,]+]], i{{.+}} 1
1801*67e74705SXin Li   // CK19-DAG: [[SEC00]] = load i32***, i32**** [[PTR]],
1802*67e74705SXin Li 
1803*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1804*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1805*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1806*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1807*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32*** [[SEC0]] to i8*
1808*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32** [[SEC1:%.+]] to i8*
1809*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32** [[SEC11:[^,]+]], i{{.+}} 2
1810*67e74705SXin Li   // CK19-DAG: [[SEC11]] = load i32**, i32*** [[SEC111:%[^,]+]],
1811*67e74705SXin Li   // CK19-DAG: [[SEC111]] = getelementptr {{.*}}i32*** [[SEC1111:[^,]+]], i{{.+}} 1
1812*67e74705SXin Li   // CK19-DAG: [[SEC1111]] = load i32***, i32**** [[PTR]],
1813*67e74705SXin Li 
1814*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
1815*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
1816*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
1817*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
1818*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast i32** [[SEC1]] to i8*
1819*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast i32* [[SEC2:%.+]] to i8*
1820*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.*}}i32* [[SEC22:[^,]+]], i{{.+}} 2
1821*67e74705SXin Li   // CK19-DAG: [[SEC22]] = load i32*, i32** [[SEC222:%[^,]+]],
1822*67e74705SXin Li   // CK19-DAG: [[SEC222]] = getelementptr {{.*}}i32** [[SEC2222:[^,]+]], i{{.+}} 2
1823*67e74705SXin Li   // CK19-DAG: [[SEC2222]] = load i32**, i32*** [[SEC22222:%[^,]+]],
1824*67e74705SXin Li   // CK19-DAG: [[SEC22222]] = getelementptr {{.*}}i32*** [[SEC222222:[^,]+]], i{{.+}} 1
1825*67e74705SXin Li   // CK19-DAG: [[SEC222222]] = load i32***, i32**** [[PTR]],
1826*67e74705SXin Li 
1827*67e74705SXin Li   // CK19: call void [[CALL28:@.+]](i32*** {{[^,]+}})
1828*67e74705SXin Li   #pragma omp target map(tofrom: mptr[1][2][2:4])
1829*67e74705SXin Li   {
1830*67e74705SXin Li     mptr[1][2][3]++;
1831*67e74705SXin Li   }
1832*67e74705SXin Li 
1833*67e74705SXin Li   // Region 29
1834*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE29]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE29]]{{.+}})
1835*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1836*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1837*67e74705SXin Li 
1838*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1839*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1840*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1841*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1842*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast i32*** [[VAR0:%.+]] to i8*
1843*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast i32*** [[SEC0:%.+]] to i8*
1844*67e74705SXin Li   // CK19-DAG: [[VAR0]] = load i32***, i32**** [[PTR:%[^,]+]],
1845*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32*** [[SEC00:[^,]+]], i{{.+}} 1
1846*67e74705SXin Li   // CK19-DAG: [[SEC00]] = load i32***, i32**** [[PTR]],
1847*67e74705SXin Li 
1848*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1849*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1850*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1851*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1852*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast i32*** [[SEC0]] to i8*
1853*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast i32** [[SEC1:%.+]] to i8*
1854*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32** [[SEC11:[^,]+]], i{{.+}} 2
1855*67e74705SXin Li   // CK19-DAG: [[SEC11]] = load i32**, i32*** [[SEC111:%[^,]+]],
1856*67e74705SXin Li   // CK19-DAG: [[SEC111]] = getelementptr {{.*}}i32*** [[SEC1111:[^,]+]], i{{.+}} 1
1857*67e74705SXin Li   // CK19-DAG: [[SEC1111]] = load i32***, i32**** [[PTR]],
1858*67e74705SXin Li 
1859*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
1860*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
1861*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
1862*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
1863*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast i32** [[SEC1]] to i8*
1864*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast i32* [[SEC2:%.+]] to i8*
1865*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.*}}i32* [[SEC22:[^,]+]], i{{.+}} 3
1866*67e74705SXin Li   // CK19-DAG: [[SEC22]] = load i32*, i32** [[SEC222:%[^,]+]],
1867*67e74705SXin Li   // CK19-DAG: [[SEC222]] = getelementptr {{.*}}i32** [[SEC2222:[^,]+]], i{{.+}} 2
1868*67e74705SXin Li   // CK19-DAG: [[SEC2222]] = load i32**, i32*** [[SEC22222:%[^,]+]],
1869*67e74705SXin Li   // CK19-DAG: [[SEC22222]] = getelementptr {{.*}}i32*** [[SEC222222:[^,]+]], i{{.+}} 1
1870*67e74705SXin Li   // CK19-DAG: [[SEC222222]] = load i32***, i32**** [[PTR]],
1871*67e74705SXin Li 
1872*67e74705SXin Li   // CK19: call void [[CALL29:@.+]](i32*** {{[^,]+}})
1873*67e74705SXin Li   #pragma omp target map(tofrom: mptr[1][2][3])
1874*67e74705SXin Li   {
1875*67e74705SXin Li     mptr[1][2][3]++;
1876*67e74705SXin Li   }
1877*67e74705SXin Li 
1878*67e74705SXin Li   // Multidimensional VLA.
1879*67e74705SXin Li   double mva[23][ii][ii+5];
1880*67e74705SXin Li 
1881*67e74705SXin Li   // Region 30
1882*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE30]]{{.+}})
1883*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1884*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1885*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
1886*67e74705SXin Li   //
1887*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1888*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1889*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
1890*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[BP0]]
1891*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[P0]]
1892*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]]
1893*67e74705SXin Li   //
1894*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1895*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1896*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
1897*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1898*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1899*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]]
1900*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
1901*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
1902*67e74705SXin Li   // CK19-64-DAG: [[VAR1]] = zext i32 %{{[^,]+}} to i64
1903*67e74705SXin Li   // CK19-64-DAG: [[VAR11]] = zext i32 %{{[^,]+}} to i64
1904*67e74705SXin Li   //
1905*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
1906*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
1907*67e74705SXin Li   // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2
1908*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
1909*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
1910*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S2]]
1911*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = inttoptr i[[Z]] [[VAR2:%.+]] to i8*
1912*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = inttoptr i[[Z]] [[VAR22:%.+]] to i8*
1913*67e74705SXin Li   // CK19-64-DAG: [[VAR2]] = zext i32 %{{[^,]+}} to i64
1914*67e74705SXin Li   // CK19-64-DAG: [[VAR22]] = zext i32 %{{[^,]+}} to i64
1915*67e74705SXin Li   //
1916*67e74705SXin Li   // CK19-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3
1917*67e74705SXin Li   // CK19-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3
1918*67e74705SXin Li   // CK19-DAG: [[S3:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 3
1919*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]
1920*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]
1921*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL3:%[^,]+]], i[[Z]]* [[S3]]
1922*67e74705SXin Li   // CK19-DAG: [[CBPVAL3]] = bitcast double* [[VAR3:%.+]] to i8*
1923*67e74705SXin Li   // CK19-DAG: [[CPVAL3]] = bitcast double* [[VAR3]] to i8*
1924*67e74705SXin Li   // CK19-DAG: [[CSVAL3]] = mul nuw i[[Z]] %{{[^,]+}}, {{8|4}}
1925*67e74705SXin Li 
1926*67e74705SXin Li   // CK19: call void [[CALL30:@.+]](i[[Z]] 23, i[[Z]] %{{[^,]+}}, i[[Z]] %{{[^,]+}}, double* %{{[^,]+}})
1927*67e74705SXin Li   #pragma omp target map(tofrom: mva)
1928*67e74705SXin Li   {
1929*67e74705SXin Li     mva[1][2][3]++;
1930*67e74705SXin Li   }
1931*67e74705SXin Li 
1932*67e74705SXin Li   // Region 31
1933*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE31]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE31]]{{.+}})
1934*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1935*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1936*67e74705SXin Li   //
1937*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1938*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1939*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[BP0]]
1940*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[P0]]
1941*67e74705SXin Li   //
1942*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1943*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1944*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1945*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1946*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
1947*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
1948*67e74705SXin Li   //
1949*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
1950*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
1951*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
1952*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
1953*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = inttoptr i[[Z]] [[VAR2:%.+]] to i8*
1954*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = inttoptr i[[Z]] [[VAR22:%.+]] to i8*
1955*67e74705SXin Li   //
1956*67e74705SXin Li   // CK19-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3
1957*67e74705SXin Li   // CK19-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3
1958*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]
1959*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]
1960*67e74705SXin Li   // CK19-DAG: [[CBPVAL3]] = bitcast double* [[VAR3:%.+]] to i8*
1961*67e74705SXin Li   // CK19-DAG: [[CPVAL3]] = bitcast double* [[SEC3:%.+]] to i8*
1962*67e74705SXin Li   // CK19-DAG: [[SEC3]] = getelementptr {{.*}}double* [[SEC33:%.+]], i[[Z]] 0
1963*67e74705SXin Li   // CK19-DAG: [[SEC33]] = getelementptr {{.*}}double* [[SEC333:%.+]], i[[Z]] [[IDX3:%.+]]
1964*67e74705SXin Li   // CK19-DAG: [[IDX3]] = mul nsw i[[Z]] %{{[^,]+}}, %{{[^,]+}}
1965*67e74705SXin Li   // CK19-DAG: [[SEC333]] = getelementptr {{.*}}double* [[VAR3]], i[[Z]] [[IDX33:%.+]]
1966*67e74705SXin Li   // CK19-DAG: [[IDX33]] = mul nsw i[[Z]] 1, %{{[^,]+}}
1967*67e74705SXin Li 
1968*67e74705SXin Li   // CK19: call void [[CALL31:@.+]](i[[Z]] 23, i[[Z]] %{{[^,]+}}, i[[Z]] %{{[^,]+}}, double* %{{[^,]+}})
1969*67e74705SXin Li   #pragma omp target map(tofrom: mva[1][ii-2][:5])
1970*67e74705SXin Li   {
1971*67e74705SXin Li     mva[1][2][3]++;
1972*67e74705SXin Li   }
1973*67e74705SXin Li 
1974*67e74705SXin Li   // Multidimensional array sections.
1975*67e74705SXin Li   double marras[11][12][13];
1976*67e74705SXin Li   double mvlaas[11][ii][13];
1977*67e74705SXin Li   double ***mptras;
1978*67e74705SXin Li 
1979*67e74705SXin Li   // Region 32
1980*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE32]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE32]]{{.+}})
1981*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1982*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1983*67e74705SXin Li 
1984*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1985*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1986*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1987*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1988*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8*
1989*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0]] to i8*
1990*67e74705SXin Li 
1991*67e74705SXin Li   // CK19: call void [[CALL32:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}})
1992*67e74705SXin Li   #pragma omp target map(marras)
1993*67e74705SXin Li   {
1994*67e74705SXin Li     marras[1][2][3]++;
1995*67e74705SXin Li   }
1996*67e74705SXin Li 
1997*67e74705SXin Li   // Region 33
1998*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE33]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE33]]{{.+}})
1999*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2000*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2001*67e74705SXin Li 
2002*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2003*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2004*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2005*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2006*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8*
2007*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [12 x [13 x double]]* [[SEC0:%.+]] to i8*
2008*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 0
2009*67e74705SXin Li 
2010*67e74705SXin Li   // CK19: call void [[CALL33:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}})
2011*67e74705SXin Li   #pragma omp target map(marras[:])
2012*67e74705SXin Li   {
2013*67e74705SXin Li     marras[1][2][3]++;
2014*67e74705SXin Li   }
2015*67e74705SXin Li 
2016*67e74705SXin Li   // Region 34
2017*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE34]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE34]]{{.+}})
2018*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2019*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2020*67e74705SXin Li 
2021*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2022*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2023*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2024*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2025*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8*
2026*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [12 x [13 x double]]* [[SEC0:%.+]] to i8*
2027*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 0
2028*67e74705SXin Li 
2029*67e74705SXin Li   // CK19: call void [[CALL34:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}})
2030*67e74705SXin Li   #pragma omp target map(marras[:][:][:])
2031*67e74705SXin Li   {
2032*67e74705SXin Li     marras[1][2][3]++;
2033*67e74705SXin Li   }
2034*67e74705SXin Li 
2035*67e74705SXin Li   // Region 35
2036*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE35]]{{.+}})
2037*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2038*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2039*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
2040*67e74705SXin Li   //
2041*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2042*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2043*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
2044*67e74705SXin Li 
2045*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2046*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2047*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL0:%[^,]+]], i[[Z]]* [[S0]]
2048*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8*
2049*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [13 x double]* [[SEC0:%.+]] to i8*
2050*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[12 x [13 x double]]* [[SEC00:%[^,]+]], i[[Z]] 0, i[[Z]] 0
2051*67e74705SXin Li   // CK19-DAG: [[SEC00]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 1
2052*67e74705SXin Li   // CK19-DAG: [[CSVAL0]] = mul nuw i[[Z]] %{{[^,]+}}, 104
2053*67e74705SXin Li 
2054*67e74705SXin Li   // CK19: call void [[CALL35:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}})
2055*67e74705SXin Li   #pragma omp target map(marras[1][:ii][:])
2056*67e74705SXin Li   {
2057*67e74705SXin Li     marras[1][2][3]++;
2058*67e74705SXin Li   }
2059*67e74705SXin Li 
2060*67e74705SXin Li   // Region 36
2061*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE36]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE36]]{{.+}})
2062*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2063*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2064*67e74705SXin Li 
2065*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2066*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2067*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2068*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2069*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8*
2070*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [13 x double]* [[SEC0:%.+]] to i8*
2071*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[13 x double]* [[SEC00:%[^,]+]], i{{.+}} 0
2072*67e74705SXin Li   // CK19-DAG: [[SEC00]] = getelementptr {{.+}}[12 x [13 x double]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 0
2073*67e74705SXin Li   // CK19-DAG: [[SEC000]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 0
2074*67e74705SXin Li 
2075*67e74705SXin Li   // CK19: call void [[CALL36:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}})
2076*67e74705SXin Li   #pragma omp target map(marras[:1][:2][:13])
2077*67e74705SXin Li   {
2078*67e74705SXin Li     marras[1][2][3]++;
2079*67e74705SXin Li   }
2080*67e74705SXin Li 
2081*67e74705SXin Li   // Region 37
2082*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE37]]{{.+}})
2083*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2084*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2085*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
2086*67e74705SXin Li   //
2087*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2088*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2089*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
2090*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]]
2091*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]]
2092*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]]
2093*67e74705SXin Li   //
2094*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2095*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2096*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
2097*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2098*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2099*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]]
2100*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
2101*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
2102*67e74705SXin Li   //
2103*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
2104*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
2105*67e74705SXin Li   // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2
2106*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
2107*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
2108*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]]
2109*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8*
2110*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[VAR2]] to i8*
2111*67e74705SXin Li   // CK19-DAG: [[CSVAL2]] = mul nuw i[[Z]] %{{[^,]+}}, 104
2112*67e74705SXin Li 
2113*67e74705SXin Li   // CK19: call void [[CALL37:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}})
2114*67e74705SXin Li   #pragma omp target map(mvlaas)
2115*67e74705SXin Li   {
2116*67e74705SXin Li     mvlaas[1][2][3]++;
2117*67e74705SXin Li   }
2118*67e74705SXin Li 
2119*67e74705SXin Li   // Region 38
2120*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE38]]{{.+}})
2121*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2122*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2123*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
2124*67e74705SXin Li   //
2125*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2126*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2127*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
2128*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]]
2129*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]]
2130*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]]
2131*67e74705SXin Li   //
2132*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2133*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2134*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
2135*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2136*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2137*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]]
2138*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
2139*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
2140*67e74705SXin Li   //
2141*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
2142*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
2143*67e74705SXin Li   // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2
2144*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
2145*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
2146*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]]
2147*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8*
2148*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8*
2149*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC22:%[^,]+]]
2150*67e74705SXin Li   // CK19-DAG: [[SEC22]] = mul nsw i[[Z]] 0, %{{[^,]+}}
2151*67e74705SXin Li   // CK19-DAG: [[CSVAL2]] = mul nuw i[[Z]] %{{[^,]+}}, 104
2152*67e74705SXin Li 
2153*67e74705SXin Li   // CK19: call void [[CALL38:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}})
2154*67e74705SXin Li   #pragma omp target map(mvlaas[:])
2155*67e74705SXin Li   {
2156*67e74705SXin Li     mvlaas[1][2][3]++;
2157*67e74705SXin Li   }
2158*67e74705SXin Li 
2159*67e74705SXin Li   // Region 39
2160*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE39]]{{.+}})
2161*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2162*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2163*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
2164*67e74705SXin Li   //
2165*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2166*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2167*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
2168*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]]
2169*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]]
2170*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]]
2171*67e74705SXin Li   //
2172*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2173*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2174*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
2175*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2176*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2177*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]]
2178*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
2179*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
2180*67e74705SXin Li   //
2181*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
2182*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
2183*67e74705SXin Li   // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2
2184*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
2185*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
2186*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]]
2187*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8*
2188*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8*
2189*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC22:%[^,]+]]
2190*67e74705SXin Li   // CK19-DAG: [[SEC22]] = mul nsw i[[Z]] 0, %{{[^,]+}}
2191*67e74705SXin Li   // CK19-DAG: [[CSVAL2]] = mul nuw i[[Z]] %{{[^,]+}}, 104
2192*67e74705SXin Li 
2193*67e74705SXin Li   // CK19: call void [[CALL39:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}})
2194*67e74705SXin Li   #pragma omp target map(mvlaas[:][:][:])
2195*67e74705SXin Li   {
2196*67e74705SXin Li     mvlaas[1][2][3]++;
2197*67e74705SXin Li   }
2198*67e74705SXin Li 
2199*67e74705SXin Li   // Region 40
2200*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE40]]{{.+}})
2201*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2202*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2203*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
2204*67e74705SXin Li   //
2205*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2206*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2207*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
2208*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]]
2209*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]]
2210*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]]
2211*67e74705SXin Li   //
2212*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2213*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2214*67e74705SXin Li   // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1
2215*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2216*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2217*67e74705SXin Li   // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]]
2218*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
2219*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
2220*67e74705SXin Li   //
2221*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
2222*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
2223*67e74705SXin Li   // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2
2224*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
2225*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
2226*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]]
2227*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8*
2228*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8*
2229*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[SEC22:%[^,]+]], i[[Z]] 0
2230*67e74705SXin Li   // CK19-DAG: [[SEC22]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC222:%[^,]+]]
2231*67e74705SXin Li   // CK19-DAG: [[SEC222]] = mul nsw i[[Z]] 1, %{{[^,]+}}
2232*67e74705SXin Li 
2233*67e74705SXin Li   // CK19: call void [[CALL40:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}})
2234*67e74705SXin Li   #pragma omp target map(mvlaas[1][:ii][:])
2235*67e74705SXin Li   {
2236*67e74705SXin Li     mvlaas[1][2][3]++;
2237*67e74705SXin Li   }
2238*67e74705SXin Li 
2239*67e74705SXin Li   // Region 41
2240*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE41]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE41]]{{.+}})
2241*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2242*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2243*67e74705SXin Li   //
2244*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2245*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2246*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]]
2247*67e74705SXin Li   // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]]
2248*67e74705SXin Li   //
2249*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2250*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2251*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2252*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2253*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8*
2254*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8*
2255*67e74705SXin Li   //
2256*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
2257*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
2258*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
2259*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
2260*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8*
2261*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8*
2262*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[SEC22:%[^,]+]], i[[Z]] 0
2263*67e74705SXin Li   // CK19-DAG: [[SEC22]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC222:%[^,]+]]
2264*67e74705SXin Li   // CK19-DAG: [[SEC222]] = mul nsw i[[Z]] 0, %{{[^,]+}}
2265*67e74705SXin Li 
2266*67e74705SXin Li   // CK19: call void [[CALL41:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}})
2267*67e74705SXin Li   #pragma omp target map(mvlaas[:1][:2][:13])
2268*67e74705SXin Li   {
2269*67e74705SXin Li     mvlaas[1][2][3]++;
2270*67e74705SXin Li   }
2271*67e74705SXin Li 
2272*67e74705SXin Li   // Region 42
2273*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE42]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE42]]{{.+}})
2274*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2275*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2276*67e74705SXin Li 
2277*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2278*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2279*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2280*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2281*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast double*** [[VAR0:%.+]] to i8*
2282*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast double*** [[SEC0:%.+]] to i8*
2283*67e74705SXin Li   // CK19-DAG: [[VAR0]] = load double***, double**** [[PTR:%[^,]+]],
2284*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.*}}double*** [[SEC00:[^,]+]], i{{.+}} 0
2285*67e74705SXin Li   // CK19-DAG: [[SEC00]] = load double***, double**** [[PTR]],
2286*67e74705SXin Li 
2287*67e74705SXin Li   // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2288*67e74705SXin Li   // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2289*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2290*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2291*67e74705SXin Li   // CK19-DAG: [[CBPVAL1]] = bitcast double*** [[SEC0]] to i8*
2292*67e74705SXin Li   // CK19-DAG: [[CPVAL1]] = bitcast double** [[SEC1:%.+]] to i8*
2293*67e74705SXin Li   // CK19-DAG: [[SEC1]] = getelementptr {{.*}}double** [[SEC11:[^,]+]], i{{.+}} 2
2294*67e74705SXin Li   // CK19-DAG: [[SEC11]] = load double**, double*** [[SEC111:%[^,]+]],
2295*67e74705SXin Li   // CK19-DAG: [[SEC111]] = getelementptr {{.*}}double*** [[SEC1111:[^,]+]], i{{.+}} 0
2296*67e74705SXin Li   // CK19-DAG: [[SEC1111]] = load double***, double**** [[PTR]],
2297*67e74705SXin Li 
2298*67e74705SXin Li   // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
2299*67e74705SXin Li   // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
2300*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
2301*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
2302*67e74705SXin Li   // CK19-DAG: [[CBPVAL2]] = bitcast double** [[SEC1]] to i8*
2303*67e74705SXin Li   // CK19-DAG: [[CPVAL2]] = bitcast double* [[SEC2:%.+]] to i8*
2304*67e74705SXin Li   // CK19-DAG: [[SEC2]] = getelementptr {{.*}}double* [[SEC22:[^,]+]], i{{.+}} 0
2305*67e74705SXin Li   // CK19-DAG: [[SEC22]] = load double*, double** [[SEC222:%[^,]+]],
2306*67e74705SXin Li   // CK19-DAG: [[SEC222]] = getelementptr {{.*}}double** [[SEC2222:[^,]+]], i{{.+}} 2
2307*67e74705SXin Li   // CK19-DAG: [[SEC2222]] = load double**, double*** [[SEC22222:%[^,]+]],
2308*67e74705SXin Li   // CK19-DAG: [[SEC22222]] = getelementptr {{.*}}double*** [[SEC222222:[^,]+]], i{{.+}} 0
2309*67e74705SXin Li   // CK19-DAG: [[SEC222222]] = load double***, double**** [[PTR]],
2310*67e74705SXin Li 
2311*67e74705SXin Li   // CK19: call void [[CALL42:@.+]](double*** {{[^,]+}})
2312*67e74705SXin Li   #pragma omp target map(mptras[:1][2][:13])
2313*67e74705SXin Li   {
2314*67e74705SXin Li     mptras[1][2][3]++;
2315*67e74705SXin Li   }
2316*67e74705SXin Li 
2317*67e74705SXin Li   // Region 43 - the memory is not contiguous for this map - will map the whole last dimension.
2318*67e74705SXin Li   // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE43]]{{.+}})
2319*67e74705SXin Li   // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2320*67e74705SXin Li   // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2321*67e74705SXin Li   // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
2322*67e74705SXin Li   //
2323*67e74705SXin Li   // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2324*67e74705SXin Li   // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2325*67e74705SXin Li   // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
2326*67e74705SXin Li 
2327*67e74705SXin Li   // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2328*67e74705SXin Li   // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2329*67e74705SXin Li   // CK19-DAG: store i[[Z]] [[CSVAL0:%[^,]+]], i[[Z]]* [[S0]]
2330*67e74705SXin Li   // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8*
2331*67e74705SXin Li   // CK19-DAG: [[CPVAL0]] = bitcast [13 x double]* [[SEC0:%.+]] to i8*
2332*67e74705SXin Li   // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[12 x [13 x double]]* [[SEC00:%[^,]+]], i[[Z]] 0, i[[Z]] 0
2333*67e74705SXin Li   // CK19-DAG: [[SEC00]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 1
2334*67e74705SXin Li   // CK19-DAG: [[CSVAL0]] = mul nuw i[[Z]] %{{[^,]+}}, 104
2335*67e74705SXin Li 
2336*67e74705SXin Li   // CK19: call void [[CALL43:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}})
2337*67e74705SXin Li   #pragma omp target map(marras[1][:ii][1:])
2338*67e74705SXin Li   {
2339*67e74705SXin Li     marras[1][2][3]++;
2340*67e74705SXin Li   }
2341*67e74705SXin Li 
2342*67e74705SXin Li }
2343*67e74705SXin Li 
2344*67e74705SXin Li // CK19: define {{.+}}[[CALL00]]
2345*67e74705SXin Li // CK19: define {{.+}}[[CALL01]]
2346*67e74705SXin Li // CK19: define {{.+}}[[CALL02]]
2347*67e74705SXin Li // CK19: define {{.+}}[[CALL03]]
2348*67e74705SXin Li // CK19: define {{.+}}[[CALL04]]
2349*67e74705SXin Li // CK19: define {{.+}}[[CALL05]]
2350*67e74705SXin Li // CK19: define {{.+}}[[CALL06]]
2351*67e74705SXin Li // CK19: define {{.+}}[[CALL07]]
2352*67e74705SXin Li // CK19: define {{.+}}[[CALL08]]
2353*67e74705SXin Li // CK19: define {{.+}}[[CALL09]]
2354*67e74705SXin Li // CK19: define {{.+}}[[CALL10]]
2355*67e74705SXin Li // CK19: define {{.+}}[[CALL11]]
2356*67e74705SXin Li // CK19: define {{.+}}[[CALL12]]
2357*67e74705SXin Li // CK19: define {{.+}}[[CALL13]]
2358*67e74705SXin Li // CK19: define {{.+}}[[CALL14]]
2359*67e74705SXin Li // CK19: define {{.+}}[[CALL15]]
2360*67e74705SXin Li // CK19: define {{.+}}[[CALL16]]
2361*67e74705SXin Li // CK19: define {{.+}}[[CALL17]]
2362*67e74705SXin Li // CK19: define {{.+}}[[CALL18]]
2363*67e74705SXin Li // CK19: define {{.+}}[[CALL19]]
2364*67e74705SXin Li // CK19: define {{.+}}[[CALL20]]
2365*67e74705SXin Li // CK19: define {{.+}}[[CALL21]]
2366*67e74705SXin Li // CK19: define {{.+}}[[CALL22]]
2367*67e74705SXin Li // CK19: define {{.+}}[[CALL23]]
2368*67e74705SXin Li // CK19: define {{.+}}[[CALL24]]
2369*67e74705SXin Li // CK19: define {{.+}}[[CALL25]]
2370*67e74705SXin Li // CK19: define {{.+}}[[CALL26]]
2371*67e74705SXin Li // CK19: define {{.+}}[[CALL27]]
2372*67e74705SXin Li // CK19: define {{.+}}[[CALL28]]
2373*67e74705SXin Li // CK19: define {{.+}}[[CALL29]]
2374*67e74705SXin Li // CK19: define {{.+}}[[CALL30]]
2375*67e74705SXin Li // CK19: define {{.+}}[[CALL31]]
2376*67e74705SXin Li // CK19: define {{.+}}[[CALL32]]
2377*67e74705SXin Li // CK19: define {{.+}}[[CALL33]]
2378*67e74705SXin Li // CK19: define {{.+}}[[CALL34]]
2379*67e74705SXin Li // CK19: define {{.+}}[[CALL35]]
2380*67e74705SXin Li // CK19: define {{.+}}[[CALL36]]
2381*67e74705SXin Li // CK19: define {{.+}}[[CALL37]]
2382*67e74705SXin Li // CK19: define {{.+}}[[CALL38]]
2383*67e74705SXin Li // CK19: define {{.+}}[[CALL39]]
2384*67e74705SXin Li // CK19: define {{.+}}[[CALL40]]
2385*67e74705SXin Li // CK19: define {{.+}}[[CALL41]]
2386*67e74705SXin Li // CK19: define {{.+}}[[CALL42]]
2387*67e74705SXin Li // CK19: define {{.+}}[[CALL43]]
2388*67e74705SXin Li 
2389*67e74705SXin Li #endif
2390*67e74705SXin Li ///==========================================================================///
2391*67e74705SXin Li // RUN: %clang_cc1 -DCK20 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK20 --check-prefix CK20-64
2392*67e74705SXin Li // RUN: %clang_cc1 -DCK20 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
2393*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 CK20 --check-prefix CK20-64
2394*67e74705SXin Li // RUN: %clang_cc1 -DCK20 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK20 --check-prefix CK20-32
2395*67e74705SXin Li // RUN: %clang_cc1 -DCK20 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
2396*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 CK20 --check-prefix CK20-32
2397*67e74705SXin Li #ifdef CK20
2398*67e74705SXin Li 
2399*67e74705SXin Li // CK20: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
2400*67e74705SXin Li // CK20: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
2401*67e74705SXin Li 
2402*67e74705SXin Li // CK20: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20]
2403*67e74705SXin Li // CK20: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
2404*67e74705SXin Li 
2405*67e74705SXin Li // CK20: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
2406*67e74705SXin Li // CK20: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
2407*67e74705SXin Li 
2408*67e74705SXin Li // CK20: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 12]
2409*67e74705SXin Li // CK20: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
2410*67e74705SXin Li 
2411*67e74705SXin Li // CK20-LABEL: explicit_maps_references_and_function_args
explicit_maps_references_and_function_args(int a,float b,int (& c)[10],float * d)2412*67e74705SXin Li void explicit_maps_references_and_function_args (int a, float b, int (&c)[10], float *d){
2413*67e74705SXin Li 
2414*67e74705SXin Li   int &aa = a;
2415*67e74705SXin Li   float &bb = b;
2416*67e74705SXin Li   int (&cc)[10] = c;
2417*67e74705SXin Li   float *&dd = d;
2418*67e74705SXin Li 
2419*67e74705SXin Li   // Region 00
2420*67e74705SXin Li   // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
2421*67e74705SXin Li   // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2422*67e74705SXin Li   // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2423*67e74705SXin Li 
2424*67e74705SXin Li   // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2425*67e74705SXin Li   // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2426*67e74705SXin Li   // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2427*67e74705SXin Li   // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2428*67e74705SXin Li   // CK20-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
2429*67e74705SXin Li   // CK20-DAG: [[CPVAL0]] = bitcast i32* [[RVAR00:%.+]] to i8*
2430*67e74705SXin Li   // CK20-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
2431*67e74705SXin Li   // CK20-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
2432*67e74705SXin Li 
2433*67e74705SXin Li   // CK20: call void [[CALL00:@.+]](i32* {{[^,]+}})
2434*67e74705SXin Li   #pragma omp target map(to:aa)
2435*67e74705SXin Li   {
2436*67e74705SXin Li     aa += 1;
2437*67e74705SXin Li   }
2438*67e74705SXin Li 
2439*67e74705SXin Li   // Region 01
2440*67e74705SXin Li   // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
2441*67e74705SXin Li   // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2442*67e74705SXin Li   // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2443*67e74705SXin Li 
2444*67e74705SXin Li   // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2445*67e74705SXin Li   // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2446*67e74705SXin Li   // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2447*67e74705SXin Li   // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2448*67e74705SXin Li   // CK20-DAG: [[CBPVAL0]] = bitcast [10 x i32]* [[RVAR0:%.+]] to i8*
2449*67e74705SXin Li   // CK20-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
2450*67e74705SXin Li   // CK20-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[RVAR00:%.+]], i{{.+}} 0, i{{.+}} 0
2451*67e74705SXin Li   // CK20-DAG: [[RVAR0]] = load [10 x i32]*, [10 x i32]** [[VAR0:%[^,]+]]
2452*67e74705SXin Li   // CK20-DAG: [[RVAR00]] = load [10 x i32]*, [10 x i32]** [[VAR0]]
2453*67e74705SXin Li 
2454*67e74705SXin Li   // CK20: call void [[CALL01:@.+]]([10 x i32]* {{[^,]+}})
2455*67e74705SXin Li   #pragma omp target map(to:cc[:5])
2456*67e74705SXin Li   {
2457*67e74705SXin Li     cc[3] += 1;
2458*67e74705SXin Li   }
2459*67e74705SXin Li 
2460*67e74705SXin Li   // Region 02
2461*67e74705SXin Li   // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
2462*67e74705SXin Li   // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2463*67e74705SXin Li   // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2464*67e74705SXin Li 
2465*67e74705SXin Li   // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2466*67e74705SXin Li   // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2467*67e74705SXin Li   // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2468*67e74705SXin Li   // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2469*67e74705SXin Li   // CK20-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8*
2470*67e74705SXin Li   // CK20-DAG: [[CPVAL0]] = bitcast float* [[VAR0]] to i8*
2471*67e74705SXin Li 
2472*67e74705SXin Li   // CK20: call void [[CALL02:@.+]](float* {{[^,]+}})
2473*67e74705SXin Li   #pragma omp target map(from:b)
2474*67e74705SXin Li   {
2475*67e74705SXin Li     b += 1.0f;
2476*67e74705SXin Li   }
2477*67e74705SXin Li 
2478*67e74705SXin Li   // Region 03
2479*67e74705SXin Li   // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
2480*67e74705SXin Li   // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2481*67e74705SXin Li   // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2482*67e74705SXin Li 
2483*67e74705SXin Li   // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2484*67e74705SXin Li   // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2485*67e74705SXin Li   // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2486*67e74705SXin Li   // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2487*67e74705SXin Li   // CK20-DAG: [[CBPVAL0]] = bitcast float* [[RVAR0:%.+]] to i8*
2488*67e74705SXin Li   // CK20-DAG: [[CPVAL0]] = bitcast float* [[SEC0:%.+]] to i8*
2489*67e74705SXin Li   // CK20-DAG: [[RVAR0]] = load float*, float** [[VAR0:%[^,]+]]
2490*67e74705SXin Li   // CK20-DAG: [[SEC0]] = getelementptr {{.*}}float* [[RVAR00:%.+]], i{{.+}} 2
2491*67e74705SXin Li   // CK20-DAG: [[RVAR00]] = load float*, float** [[VAR0]]
2492*67e74705SXin Li 
2493*67e74705SXin Li   // CK20: call void [[CALL03:@.+]](float* {{[^,]+}})
2494*67e74705SXin Li   #pragma omp target map(from:d[2:3])
2495*67e74705SXin Li   {
2496*67e74705SXin Li     d[2] += 1.0f;
2497*67e74705SXin Li   }
2498*67e74705SXin Li }
2499*67e74705SXin Li 
2500*67e74705SXin Li // CK20: define {{.+}}[[CALL00]]
2501*67e74705SXin Li // CK20: define {{.+}}[[CALL01]]
2502*67e74705SXin Li // CK20: define {{.+}}[[CALL02]]
2503*67e74705SXin Li // CK20: define {{.+}}[[CALL03]]
2504*67e74705SXin Li 
2505*67e74705SXin Li #endif
2506*67e74705SXin Li ///==========================================================================///
2507*67e74705SXin Li // RUN: %clang_cc1 -DCK21 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK21 --check-prefix CK21-64
2508*67e74705SXin Li // RUN: %clang_cc1 -DCK21 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
2509*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 CK21 --check-prefix CK21-64
2510*67e74705SXin Li // RUN: %clang_cc1 -DCK21 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK21 --check-prefix CK21-32
2511*67e74705SXin Li // RUN: %clang_cc1 -DCK21 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
2512*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 CK21 --check-prefix CK21-32
2513*67e74705SXin Li #ifdef CK21
2514*67e74705SXin Li // CK21: [[ST:%.+]] = type { i32, i32, float* }
2515*67e74705SXin Li 
2516*67e74705SXin Li // CK21: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
2517*67e74705SXin Li // CK21: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2518*67e74705SXin Li 
2519*67e74705SXin Li // CK21: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 492]
2520*67e74705SXin Li // CK21: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2521*67e74705SXin Li 
2522*67e74705SXin Li // CK21: [[SIZE02:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 500]
2523*67e74705SXin Li // CK21: [[MTYPE02:@.+]] = private {{.*}}constant [2 x i32] [i32 34, i32 18]
2524*67e74705SXin Li 
2525*67e74705SXin Li // CK21: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 492]
2526*67e74705SXin Li // CK21: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
2527*67e74705SXin Li 
2528*67e74705SXin Li // CK21: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
2529*67e74705SXin Li // CK21: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 34]
2530*67e74705SXin Li 
2531*67e74705SXin Li // CK21: [[SIZE05:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] 4, i[[Z]] 4]
2532*67e74705SXin Li // CK21: [[MTYPE05:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 3]
2533*67e74705SXin Li 
2534*67e74705SXin Li // CK21-LABEL: explicit_maps_template_args_and_members
2535*67e74705SXin Li 
2536*67e74705SXin Li template <int X, typename T>
2537*67e74705SXin Li struct CC {
2538*67e74705SXin Li   T A;
2539*67e74705SXin Li   int A2;
2540*67e74705SXin Li   float *B;
2541*67e74705SXin Li 
fooCC2542*67e74705SXin Li   int foo(T arg) {
2543*67e74705SXin Li     float la[X];
2544*67e74705SXin Li     T *lb;
2545*67e74705SXin Li 
2546*67e74705SXin Li     // Region 00
2547*67e74705SXin Li     // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
2548*67e74705SXin Li     // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2549*67e74705SXin Li     // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2550*67e74705SXin Li 
2551*67e74705SXin Li     // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2552*67e74705SXin Li     // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2553*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2554*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2555*67e74705SXin Li     // CK21-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
2556*67e74705SXin Li     // CK21-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
2557*67e74705SXin Li     // CK21-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0:%.+]], i{{.+}} 0, i{{.+}} 0
2558*67e74705SXin Li 
2559*67e74705SXin Li     // CK21: call void [[CALL00:@.+]]([[ST]]* {{[^,]+}})
2560*67e74705SXin Li     #pragma omp target map(A)
2561*67e74705SXin Li     {
2562*67e74705SXin Li       A += 1;
2563*67e74705SXin Li     }
2564*67e74705SXin Li 
2565*67e74705SXin Li     // Region 01
2566*67e74705SXin Li     // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
2567*67e74705SXin Li     // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2568*67e74705SXin Li     // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2569*67e74705SXin Li 
2570*67e74705SXin Li     // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2571*67e74705SXin Li     // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2572*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2573*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2574*67e74705SXin Li     // CK21-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
2575*67e74705SXin Li     // CK21-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
2576*67e74705SXin Li     // CK21-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
2577*67e74705SXin Li     // CK21-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0
2578*67e74705SXin Li     // CK21-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
2579*67e74705SXin Li 
2580*67e74705SXin Li     // CK21: call void [[CALL01:@.+]](i32* {{[^,]+}})
2581*67e74705SXin Li     #pragma omp target map(lb[:X])
2582*67e74705SXin Li     {
2583*67e74705SXin Li       lb[4] += 1;
2584*67e74705SXin Li     }
2585*67e74705SXin Li 
2586*67e74705SXin Li     // Region 02
2587*67e74705SXin Li     // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE02]]{{.+}})
2588*67e74705SXin Li     // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2589*67e74705SXin Li     // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2590*67e74705SXin Li 
2591*67e74705SXin Li     // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2592*67e74705SXin Li     // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2593*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2594*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2595*67e74705SXin Li     // CK21-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
2596*67e74705SXin Li     // CK21-DAG: [[CPVAL0]] = bitcast float** [[SEC0:%.+]] to i8*
2597*67e74705SXin Li     // CK21-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
2598*67e74705SXin Li 
2599*67e74705SXin Li     // CK21-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2600*67e74705SXin Li     // CK21-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2601*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2602*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2603*67e74705SXin Li     // CK21-DAG: [[CBPVAL1]] = bitcast float** [[SEC0]] to i8*
2604*67e74705SXin Li     // CK21-DAG: [[CPVAL1]] = bitcast float* [[SEC1:%.+]] to i8*
2605*67e74705SXin Li     // CK21-DAG: [[SEC1]] = getelementptr {{.*}}float* [[RVAR1:%[^,]+]], i{{.+}} 123
2606*67e74705SXin Li     // CK21-DAG: [[RVAR1]] = load float*, float** [[SEC1_:%[^,]+]]
2607*67e74705SXin Li     // CK21-DAG: [[SEC1_]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
2608*67e74705SXin Li 
2609*67e74705SXin Li     // CK21: call void [[CALL02:@.+]]([[ST]]* {{[^,]+}})
2610*67e74705SXin Li     #pragma omp target map(from:B[X:X+2])
2611*67e74705SXin Li     {
2612*67e74705SXin Li       B[2] += 1.0f;
2613*67e74705SXin Li     }
2614*67e74705SXin Li 
2615*67e74705SXin Li     // Region 03
2616*67e74705SXin Li     // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
2617*67e74705SXin Li     // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2618*67e74705SXin Li     // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2619*67e74705SXin Li 
2620*67e74705SXin Li     // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2621*67e74705SXin Li     // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2622*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2623*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2624*67e74705SXin Li     // CK21-DAG: [[CBPVAL0]] = bitcast [123 x float]* [[VAR0:%.+]] to i8*
2625*67e74705SXin Li     // CK21-DAG: [[CPVAL0]] = bitcast [123 x float]* [[VAR0]] to i8*
2626*67e74705SXin Li 
2627*67e74705SXin Li     // CK21: call void [[CALL03:@.+]]([123 x float]* {{[^,]+}})
2628*67e74705SXin Li     #pragma omp target map(from:la)
2629*67e74705SXin Li     {
2630*67e74705SXin Li       la[3] += 1.0f;
2631*67e74705SXin Li     }
2632*67e74705SXin Li 
2633*67e74705SXin Li     // Region 04
2634*67e74705SXin Li     // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}})
2635*67e74705SXin Li     // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2636*67e74705SXin Li     // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2637*67e74705SXin Li 
2638*67e74705SXin Li     // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2639*67e74705SXin Li     // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2640*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2641*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2642*67e74705SXin Li     // CK21-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
2643*67e74705SXin Li     // CK21-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
2644*67e74705SXin Li 
2645*67e74705SXin Li     // CK21: call void [[CALL04:@.+]](i32* {{[^,]+}})
2646*67e74705SXin Li     #pragma omp target map(from:arg)
2647*67e74705SXin Li     {
2648*67e74705SXin Li       arg +=1;
2649*67e74705SXin Li     }
2650*67e74705SXin Li 
2651*67e74705SXin Li     // Make sure the extra flag is passed to the second map.
2652*67e74705SXin Li     // Region 05
2653*67e74705SXin Li     // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE05]]{{.+}})
2654*67e74705SXin Li     // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2655*67e74705SXin Li     // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2656*67e74705SXin Li 
2657*67e74705SXin Li     // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2658*67e74705SXin Li     // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2659*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2660*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2661*67e74705SXin Li     // CK21-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
2662*67e74705SXin Li     // CK21-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
2663*67e74705SXin Li     // CK21-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 0
2664*67e74705SXin Li 
2665*67e74705SXin Li     // CK21-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
2666*67e74705SXin Li     // CK21-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
2667*67e74705SXin Li     // CK21-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
2668*67e74705SXin Li     // CK21-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
2669*67e74705SXin Li     // CK21-DAG: [[CBPVAL1]] = bitcast [[ST]]* [[VAR1:%.+]] to i8*
2670*67e74705SXin Li     // CK21-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
2671*67e74705SXin Li     // CK21-DAG: [[SEC1]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
2672*67e74705SXin Li 
2673*67e74705SXin Li     // CK21: call void [[CALL05:@.+]]([[ST]]* {{[^,]+}})
2674*67e74705SXin Li     #pragma omp target map(A, A2)
2675*67e74705SXin Li     {
2676*67e74705SXin Li       A += 1;
2677*67e74705SXin Li       A2 += 1;
2678*67e74705SXin Li     }
2679*67e74705SXin Li     return A;
2680*67e74705SXin Li   }
2681*67e74705SXin Li };
2682*67e74705SXin Li 
explicit_maps_template_args_and_members(int a)2683*67e74705SXin Li int explicit_maps_template_args_and_members(int a){
2684*67e74705SXin Li   CC<123,int> c;
2685*67e74705SXin Li   return c.foo(a);
2686*67e74705SXin Li }
2687*67e74705SXin Li 
2688*67e74705SXin Li // CK21: define {{.+}}[[CALL00]]
2689*67e74705SXin Li // CK21: define {{.+}}[[CALL01]]
2690*67e74705SXin Li // CK21: define {{.+}}[[CALL02]]
2691*67e74705SXin Li // CK21: define {{.+}}[[CALL03]]
2692*67e74705SXin Li // CK21: define {{.+}}[[CALL04]]
2693*67e74705SXin Li // CK21: define {{.+}}[[CALL05]]
2694*67e74705SXin Li #endif
2695*67e74705SXin Li ///==========================================================================///
2696*67e74705SXin Li // RUN: %clang_cc1 -DCK22 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK22 --check-prefix CK22-64
2697*67e74705SXin Li // RUN: %clang_cc1 -DCK22 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
2698*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 CK22 --check-prefix CK22-64
2699*67e74705SXin Li // RUN: %clang_cc1 -DCK22 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK22 --check-prefix CK22-32
2700*67e74705SXin Li // RUN: %clang_cc1 -DCK22 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
2701*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 CK22 --check-prefix CK22-32
2702*67e74705SXin Li #ifdef CK22
2703*67e74705SXin Li 
2704*67e74705SXin Li // CK22-DAG: [[ST:%.+]] = type { float }
2705*67e74705SXin Li // CK22-DAG: [[STT:%.+]] = type { i32 }
2706*67e74705SXin Li 
2707*67e74705SXin Li // CK22: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
2708*67e74705SXin Li // CK22: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2709*67e74705SXin Li 
2710*67e74705SXin Li // CK22: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400]
2711*67e74705SXin Li // CK22: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2712*67e74705SXin Li 
2713*67e74705SXin Li // CK22: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}]
2714*67e74705SXin Li // CK22: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2715*67e74705SXin Li 
2716*67e74705SXin Li // CK22: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16]
2717*67e74705SXin Li // CK22: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2718*67e74705SXin Li 
2719*67e74705SXin Li // CK22: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20]
2720*67e74705SXin Li // CK22: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2721*67e74705SXin Li 
2722*67e74705SXin Li // CK22: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
2723*67e74705SXin Li // CK22: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2724*67e74705SXin Li 
2725*67e74705SXin Li // CK22: [[SIZE06:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400]
2726*67e74705SXin Li // CK22: [[MTYPE06:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2727*67e74705SXin Li 
2728*67e74705SXin Li // CK22: [[SIZE07:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}]
2729*67e74705SXin Li // CK22: [[MTYPE07:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2730*67e74705SXin Li 
2731*67e74705SXin Li // CK22: [[SIZE08:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16]
2732*67e74705SXin Li // CK22: [[MTYPE08:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2733*67e74705SXin Li 
2734*67e74705SXin Li // CK22: [[SIZE09:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20]
2735*67e74705SXin Li // CK22: [[MTYPE09:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2736*67e74705SXin Li 
2737*67e74705SXin Li // CK22: [[SIZE10:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
2738*67e74705SXin Li // CK22: [[MTYPE10:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2739*67e74705SXin Li 
2740*67e74705SXin Li // CK22: [[SIZE11:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400]
2741*67e74705SXin Li // CK22: [[MTYPE11:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2742*67e74705SXin Li 
2743*67e74705SXin Li // CK22: [[SIZE12:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}]
2744*67e74705SXin Li // CK22: [[MTYPE12:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2745*67e74705SXin Li 
2746*67e74705SXin Li // CK22: [[SIZE13:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16]
2747*67e74705SXin Li // CK22: [[MTYPE13:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2748*67e74705SXin Li 
2749*67e74705SXin Li // CK22: [[SIZE14:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20]
2750*67e74705SXin Li // CK22: [[MTYPE14:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
2751*67e74705SXin Li 
2752*67e74705SXin Li int a;
2753*67e74705SXin Li int c[100];
2754*67e74705SXin Li int *d;
2755*67e74705SXin Li 
2756*67e74705SXin Li struct ST {
2757*67e74705SXin Li   float fa;
2758*67e74705SXin Li };
2759*67e74705SXin Li 
2760*67e74705SXin Li ST sa ;
2761*67e74705SXin Li ST sc[100];
2762*67e74705SXin Li ST *sd;
2763*67e74705SXin Li 
2764*67e74705SXin Li template<typename T>
2765*67e74705SXin Li struct STT {
2766*67e74705SXin Li   T fa;
2767*67e74705SXin Li };
2768*67e74705SXin Li 
2769*67e74705SXin Li STT<int> sta ;
2770*67e74705SXin Li STT<int> stc[100];
2771*67e74705SXin Li STT<int> *std;
2772*67e74705SXin Li 
2773*67e74705SXin Li // CK22-LABEL: explicit_maps_globals
explicit_maps_globals(void)2774*67e74705SXin Li int explicit_maps_globals(void){
2775*67e74705SXin Li   // Region 00
2776*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
2777*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2778*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2779*67e74705SXin Li 
2780*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2781*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2782*67e74705SXin Li   // CK22-DAG: store i8* bitcast (i32* @a to i8*), i8** [[BP0]]
2783*67e74705SXin Li   // CK22-DAG: store i8* bitcast (i32* @a to i8*), i8** [[P0]]
2784*67e74705SXin Li 
2785*67e74705SXin Li   // CK22: call void [[CALL00:@.+]](i32* {{[^,]+}})
2786*67e74705SXin Li   #pragma omp target map(a)
2787*67e74705SXin Li   { a+=1; }
2788*67e74705SXin Li 
2789*67e74705SXin Li   // Region 01
2790*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
2791*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2792*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2793*67e74705SXin Li 
2794*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2795*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2796*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x i32]* @c to i8*), i8** [[BP0]]
2797*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x i32]* @c to i8*), i8** [[P0]]
2798*67e74705SXin Li 
2799*67e74705SXin Li   // CK22: call void [[CALL01:@.+]]([100 x i32]* {{[^,]+}})
2800*67e74705SXin Li   #pragma omp target map(c)
2801*67e74705SXin Li   { c[3]+=1; }
2802*67e74705SXin Li 
2803*67e74705SXin Li   // Region 02
2804*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
2805*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2806*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2807*67e74705SXin Li 
2808*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2809*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2810*67e74705SXin Li   // CK22-DAG: store i8* bitcast (i32** @d to i8*), i8** [[BP0]]
2811*67e74705SXin Li   // CK22-DAG: store i8* bitcast (i32** @d to i8*), i8** [[P0]]
2812*67e74705SXin Li 
2813*67e74705SXin Li   // CK22: call void [[CALL02:@.+]](i32** {{[^,]+}})
2814*67e74705SXin Li   #pragma omp target map(d)
2815*67e74705SXin Li   { d[3]+=1; }
2816*67e74705SXin Li 
2817*67e74705SXin Li   // Region 03
2818*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
2819*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2820*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2821*67e74705SXin Li 
2822*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2823*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2824*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x i32]* @c to i8*), i8** [[BP0]]
2825*67e74705SXin Li   // CK22-DAG: store i8* bitcast (i32* getelementptr inbounds ([100 x i32], [100 x i32]* @c, i{{.+}} 0, i{{.+}} 1) to i8*), i8** [[P0]]
2826*67e74705SXin Li 
2827*67e74705SXin Li   // CK22: call void [[CALL03:@.+]]([100 x i32]* {{[^,]+}})
2828*67e74705SXin Li   #pragma omp target map(c[1:4])
2829*67e74705SXin Li   { c[3]+=1; }
2830*67e74705SXin Li 
2831*67e74705SXin Li   // Region 04
2832*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}})
2833*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2834*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2835*67e74705SXin Li 
2836*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2837*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2838*67e74705SXin Li   // CK22-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2839*67e74705SXin Li   // CK22-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2840*67e74705SXin Li   // CK22-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
2841*67e74705SXin Li   // CK22-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
2842*67e74705SXin Li   // CK22-DAG: [[RVAR0]] = load i32*, i32** @d
2843*67e74705SXin Li   // CK22-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 2
2844*67e74705SXin Li   // CK22-DAG: [[RVAR00]] = load i32*, i32** @d
2845*67e74705SXin Li 
2846*67e74705SXin Li   // CK22: call void [[CALL04:@.+]](i32* {{[^,]+}})
2847*67e74705SXin Li   #pragma omp target map(d[2:5])
2848*67e74705SXin Li   { d[3]+=1; }
2849*67e74705SXin Li 
2850*67e74705SXin Li   // Region 05
2851*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}})
2852*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2853*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2854*67e74705SXin Li 
2855*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2856*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2857*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[ST]]* @sa to i8*), i8** [[BP0]]
2858*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[ST]]* @sa to i8*), i8** [[P0]]
2859*67e74705SXin Li 
2860*67e74705SXin Li   // CK22: call void [[CALL05:@.+]]([[ST]]* {{[^,]+}})
2861*67e74705SXin Li   #pragma omp target map(sa)
2862*67e74705SXin Li   { sa.fa+=1; }
2863*67e74705SXin Li 
2864*67e74705SXin Li   // Region 06
2865*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE06]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE06]]{{.+}})
2866*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2867*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2868*67e74705SXin Li 
2869*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2870*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2871*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x [[ST]]]* @sc to i8*), i8** [[BP0]]
2872*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x [[ST]]]* @sc to i8*), i8** [[P0]]
2873*67e74705SXin Li 
2874*67e74705SXin Li   // CK22: call void [[CALL06:@.+]]([100 x [[ST]]]* {{[^,]+}})
2875*67e74705SXin Li   #pragma omp target map(sc)
2876*67e74705SXin Li   { sc[3].fa+=1; }
2877*67e74705SXin Li 
2878*67e74705SXin Li   // Region 07
2879*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE07]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE07]]{{.+}})
2880*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2881*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2882*67e74705SXin Li 
2883*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2884*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2885*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[ST]]** @sd to i8*), i8** [[BP0]]
2886*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[ST]]** @sd to i8*), i8** [[P0]]
2887*67e74705SXin Li 
2888*67e74705SXin Li   // CK22: call void [[CALL07:@.+]]([[ST]]** {{[^,]+}})
2889*67e74705SXin Li   #pragma omp target map(sd)
2890*67e74705SXin Li   { sd[3].fa+=1; }
2891*67e74705SXin Li 
2892*67e74705SXin Li   // Region 08
2893*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE08]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE08]]{{.+}})
2894*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2895*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2896*67e74705SXin Li 
2897*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2898*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2899*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x [[ST]]]* @sc to i8*), i8** [[BP0]]
2900*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[ST]]* getelementptr inbounds ([100 x [[ST]]], [100 x [[ST]]]* @sc, i{{.+}} 0, i{{.+}} 1) to i8*), i8** [[P0]]
2901*67e74705SXin Li 
2902*67e74705SXin Li   // CK22: call void [[CALL08:@.+]]([100 x [[ST]]]* {{[^,]+}})
2903*67e74705SXin Li   #pragma omp target map(sc[1:4])
2904*67e74705SXin Li   { sc[3].fa+=1; }
2905*67e74705SXin Li 
2906*67e74705SXin Li   // Region 09
2907*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE09]]{{.+}})
2908*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2909*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2910*67e74705SXin Li 
2911*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2912*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2913*67e74705SXin Li   // CK22-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2914*67e74705SXin Li   // CK22-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2915*67e74705SXin Li   // CK22-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[RVAR0:%.+]] to i8*
2916*67e74705SXin Li   // CK22-DAG: [[CPVAL0]] = bitcast [[ST]]* [[SEC0:%.+]] to i8*
2917*67e74705SXin Li   // CK22-DAG: [[RVAR0]] = load [[ST]]*, [[ST]]** @sd
2918*67e74705SXin Li   // CK22-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[RVAR00:%.+]], i{{.+}} 2
2919*67e74705SXin Li   // CK22-DAG: [[RVAR00]] = load [[ST]]*, [[ST]]** @sd
2920*67e74705SXin Li 
2921*67e74705SXin Li   // CK22: call void [[CALL09:@.+]]([[ST]]* {{[^,]+}})
2922*67e74705SXin Li   #pragma omp target map(sd[2:5])
2923*67e74705SXin Li   { sd[3].fa+=1; }
2924*67e74705SXin Li 
2925*67e74705SXin Li   // Region 10
2926*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE10]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE10]]{{.+}})
2927*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2928*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2929*67e74705SXin Li 
2930*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2931*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2932*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[STT]]* @sta to i8*), i8** [[BP0]]
2933*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[STT]]* @sta to i8*), i8** [[P0]]
2934*67e74705SXin Li 
2935*67e74705SXin Li   // CK22: call void [[CALL10:@.+]]([[STT]]* {{[^,]+}})
2936*67e74705SXin Li   #pragma omp target map(sta)
2937*67e74705SXin Li   { sta.fa+=1; }
2938*67e74705SXin Li 
2939*67e74705SXin Li   // Region 11
2940*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE11]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE11]]{{.+}})
2941*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2942*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2943*67e74705SXin Li 
2944*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2945*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2946*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x [[STT]]]* @stc to i8*), i8** [[BP0]]
2947*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x [[STT]]]* @stc to i8*), i8** [[P0]]
2948*67e74705SXin Li 
2949*67e74705SXin Li   // CK22: call void [[CALL11:@.+]]([100 x [[STT]]]* {{[^,]+}})
2950*67e74705SXin Li   #pragma omp target map(stc)
2951*67e74705SXin Li   { stc[3].fa+=1; }
2952*67e74705SXin Li 
2953*67e74705SXin Li   // Region 12
2954*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE12]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE12]]{{.+}})
2955*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2956*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2957*67e74705SXin Li 
2958*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2959*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2960*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[STT]]** @std to i8*), i8** [[BP0]]
2961*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[STT]]** @std to i8*), i8** [[P0]]
2962*67e74705SXin Li 
2963*67e74705SXin Li   // CK22: call void [[CALL12:@.+]]([[STT]]** {{[^,]+}})
2964*67e74705SXin Li   #pragma omp target map(std)
2965*67e74705SXin Li   { std[3].fa+=1; }
2966*67e74705SXin Li 
2967*67e74705SXin Li   // Region 13
2968*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE13]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE13]]{{.+}})
2969*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2970*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2971*67e74705SXin Li 
2972*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2973*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2974*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([100 x [[STT]]]* @stc to i8*), i8** [[BP0]]
2975*67e74705SXin Li   // CK22-DAG: store i8* bitcast ([[STT]]* getelementptr inbounds ([100 x [[STT]]], [100 x [[STT]]]* @stc, i{{.+}} 0, i{{.+}} 1) to i8*), i8** [[P0]]
2976*67e74705SXin Li 
2977*67e74705SXin Li   // CK22: call void [[CALL13:@.+]]([100 x [[STT]]]* {{[^,]+}})
2978*67e74705SXin Li   #pragma omp target map(stc[1:4])
2979*67e74705SXin Li   { stc[3].fa+=1; }
2980*67e74705SXin Li 
2981*67e74705SXin Li   // Region 14
2982*67e74705SXin Li   // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE14]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE14]]{{.+}})
2983*67e74705SXin Li   // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
2984*67e74705SXin Li   // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
2985*67e74705SXin Li 
2986*67e74705SXin Li   // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
2987*67e74705SXin Li   // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
2988*67e74705SXin Li   // CK22-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
2989*67e74705SXin Li   // CK22-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
2990*67e74705SXin Li   // CK22-DAG: [[CBPVAL0]] = bitcast [[STT]]* [[RVAR0:%.+]] to i8*
2991*67e74705SXin Li   // CK22-DAG: [[CPVAL0]] = bitcast [[STT]]* [[SEC0:%.+]] to i8*
2992*67e74705SXin Li   // CK22-DAG: [[RVAR0]] = load [[STT]]*, [[STT]]** @std
2993*67e74705SXin Li   // CK22-DAG: [[SEC0]] = getelementptr {{.*}}[[STT]]* [[RVAR00:%.+]], i{{.+}} 2
2994*67e74705SXin Li   // CK22-DAG: [[RVAR00]] = load [[STT]]*, [[STT]]** @std
2995*67e74705SXin Li 
2996*67e74705SXin Li   // CK22: call void [[CALL14:@.+]]([[STT]]* {{[^,]+}})
2997*67e74705SXin Li   #pragma omp target map(std[2:5])
2998*67e74705SXin Li   { std[3].fa+=1; }
2999*67e74705SXin Li 
3000*67e74705SXin Li   return 0;
3001*67e74705SXin Li }
3002*67e74705SXin Li // CK22: define {{.+}}[[CALL00]]
3003*67e74705SXin Li // CK22: define {{.+}}[[CALL01]]
3004*67e74705SXin Li // CK22: define {{.+}}[[CALL02]]
3005*67e74705SXin Li // CK22: define {{.+}}[[CALL03]]
3006*67e74705SXin Li // CK22: define {{.+}}[[CALL04]]
3007*67e74705SXin Li // CK22: define {{.+}}[[CALL05]]
3008*67e74705SXin Li // CK22: define {{.+}}[[CALL06]]
3009*67e74705SXin Li // CK22: define {{.+}}[[CALL07]]
3010*67e74705SXin Li // CK22: define {{.+}}[[CALL08]]
3011*67e74705SXin Li // CK22: define {{.+}}[[CALL09]]
3012*67e74705SXin Li // CK22: define {{.+}}[[CALL10]]
3013*67e74705SXin Li // CK22: define {{.+}}[[CALL11]]
3014*67e74705SXin Li // CK22: define {{.+}}[[CALL12]]
3015*67e74705SXin Li // CK22: define {{.+}}[[CALL13]]
3016*67e74705SXin Li // CK22: define {{.+}}[[CALL14]]
3017*67e74705SXin Li #endif
3018*67e74705SXin Li ///==========================================================================///
3019*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -DCK23 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK23 --check-prefix CK23-64
3020*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -DCK23 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
3021*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -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 CK23 --check-prefix CK23-64
3022*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -DCK23 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK23 --check-prefix CK23-32
3023*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -DCK23 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
3024*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -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 CK23 --check-prefix CK23-32
3025*67e74705SXin Li #ifdef CK23
3026*67e74705SXin Li 
3027*67e74705SXin Li // CK23: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
3028*67e74705SXin Li // CK23: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3029*67e74705SXin Li 
3030*67e74705SXin Li // CK23: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
3031*67e74705SXin Li // CK23: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3032*67e74705SXin Li 
3033*67e74705SXin Li // CK23: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400]
3034*67e74705SXin Li // CK23: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3035*67e74705SXin Li 
3036*67e74705SXin Li // CK23: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}]
3037*67e74705SXin Li // CK23: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3038*67e74705SXin Li 
3039*67e74705SXin Li // CK23: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16]
3040*67e74705SXin Li // CK23: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3041*67e74705SXin Li 
3042*67e74705SXin Li // CK23: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16]
3043*67e74705SXin Li // CK23: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3044*67e74705SXin Li 
3045*67e74705SXin Li // CK23-LABEL: explicit_maps_inside_captured
explicit_maps_inside_captured(int a)3046*67e74705SXin Li int explicit_maps_inside_captured(int a){
3047*67e74705SXin Li   float b;
3048*67e74705SXin Li   float c[100];
3049*67e74705SXin Li   float *d;
3050*67e74705SXin Li 
3051*67e74705SXin Li   // CK23: call void @{{.*}}explicit_maps_inside_captured{{.*}}([[SA:%.+]]* {{.*}})
3052*67e74705SXin Li   // CK23: define {{.*}}explicit_maps_inside_captured{{.*}}
3053*67e74705SXin Li   [&](void){
3054*67e74705SXin Li     // Region 00
3055*67e74705SXin Li     // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
3056*67e74705SXin Li     // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3057*67e74705SXin Li     // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3058*67e74705SXin Li 
3059*67e74705SXin Li     // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3060*67e74705SXin Li     // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3061*67e74705SXin Li     // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3062*67e74705SXin Li     // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3063*67e74705SXin Li     // CK23-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
3064*67e74705SXin Li     // CK23-DAG: [[CPVAL0]] = bitcast i32* [[VAR00:%.+]] to i8*
3065*67e74705SXin Li     // CK23-DAG: [[VAR0]] = load i32*, i32** [[CAP0:%[^,]+]]
3066*67e74705SXin Li     // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]]
3067*67e74705SXin Li     // CK23-DAG: [[VAR00]] = load i32*, i32** [[CAP00:%[^,]+]]
3068*67e74705SXin Li     // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]]
3069*67e74705SXin Li 
3070*67e74705SXin Li     // CK23: call void [[CALL00:@.+]](i32* {{[^,]+}})
3071*67e74705SXin Li     #pragma omp target map(a)
3072*67e74705SXin Li       { a+=1; }
3073*67e74705SXin Li     // Region 01
3074*67e74705SXin Li     // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
3075*67e74705SXin Li     // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3076*67e74705SXin Li     // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3077*67e74705SXin Li 
3078*67e74705SXin Li     // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3079*67e74705SXin Li     // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3080*67e74705SXin Li     // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3081*67e74705SXin Li     // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3082*67e74705SXin Li     // CK23-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8*
3083*67e74705SXin Li     // CK23-DAG: [[CPVAL0]] = bitcast float* [[VAR00:%.+]] to i8*
3084*67e74705SXin Li     // CK23-DAG: [[VAR0]] = load float*, float** [[CAP0:%[^,]+]]
3085*67e74705SXin Li     // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]]
3086*67e74705SXin Li     // CK23-DAG: [[VAR00]] = load float*, float** [[CAP00:%[^,]+]]
3087*67e74705SXin Li     // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]]
3088*67e74705SXin Li 
3089*67e74705SXin Li     // CK23: call void [[CALL01:@.+]](float* {{[^,]+}})
3090*67e74705SXin Li     #pragma omp target map(b)
3091*67e74705SXin Li       { b+=1; }
3092*67e74705SXin Li     // Region 02
3093*67e74705SXin Li     // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
3094*67e74705SXin Li     // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3095*67e74705SXin Li     // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3096*67e74705SXin Li 
3097*67e74705SXin Li     // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3098*67e74705SXin Li     // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3099*67e74705SXin Li     // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3100*67e74705SXin Li     // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3101*67e74705SXin Li     // CK23-DAG: [[CBPVAL0]] = bitcast [100 x float]* [[VAR0:%.+]] to i8*
3102*67e74705SXin Li     // CK23-DAG: [[CPVAL0]] = bitcast [100 x float]* [[VAR00:%.+]] to i8*
3103*67e74705SXin Li     // CK23-DAG: [[VAR0]] = load [100 x float]*, [100 x float]** [[CAP0:%[^,]+]]
3104*67e74705SXin Li     // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]]
3105*67e74705SXin Li     // CK23-DAG: [[VAR00]] = load [100 x float]*, [100 x float]** [[CAP00:%[^,]+]]
3106*67e74705SXin Li     // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]]
3107*67e74705SXin Li 
3108*67e74705SXin Li     // CK23: call void [[CALL02:@.+]]([100 x float]* {{[^,]+}})
3109*67e74705SXin Li     #pragma omp target map(c)
3110*67e74705SXin Li       { c[3]+=1; }
3111*67e74705SXin Li 
3112*67e74705SXin Li     // Region 03
3113*67e74705SXin Li     // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
3114*67e74705SXin Li     // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3115*67e74705SXin Li     // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3116*67e74705SXin Li 
3117*67e74705SXin Li     // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3118*67e74705SXin Li     // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3119*67e74705SXin Li     // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3120*67e74705SXin Li     // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3121*67e74705SXin Li     // CK23-DAG: [[CBPVAL0]] = bitcast float** [[VAR0:%.+]] to i8*
3122*67e74705SXin Li     // CK23-DAG: [[CPVAL0]] = bitcast float** [[VAR00:%.+]] to i8*
3123*67e74705SXin Li     // CK23-DAG: [[VAR0]] = load float**, float*** [[CAP0:%[^,]+]]
3124*67e74705SXin Li     // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]]
3125*67e74705SXin Li     // CK23-DAG: [[VAR00]] = load float**, float*** [[CAP00:%[^,]+]]
3126*67e74705SXin Li     // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]]
3127*67e74705SXin Li 
3128*67e74705SXin Li     // CK23: call void [[CALL03:@.+]](float** {{[^,]+}})
3129*67e74705SXin Li     #pragma omp target map(d)
3130*67e74705SXin Li       { d[3]+=1; }
3131*67e74705SXin Li     // Region 04
3132*67e74705SXin Li     // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}})
3133*67e74705SXin Li     // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3134*67e74705SXin Li     // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3135*67e74705SXin Li 
3136*67e74705SXin Li     // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3137*67e74705SXin Li     // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3138*67e74705SXin Li     // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3139*67e74705SXin Li     // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3140*67e74705SXin Li     // CK23-DAG: [[CBPVAL0]] = bitcast [100 x float]* [[VAR0:%.+]] to i8*
3141*67e74705SXin Li     // CK23-DAG: [[CPVAL0]] = bitcast float* [[SEC0:%.+]] to i8*
3142*67e74705SXin Li     // CK23-DAG: [[SEC0]] = getelementptr {{.*}}[100 x float]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2
3143*67e74705SXin Li     // CK23-DAG: [[VAR0]] = load [100 x float]*, [100 x float]** [[CAP0:%[^,]+]]
3144*67e74705SXin Li     // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]]
3145*67e74705SXin Li     // CK23-DAG: [[VAR00]] = load [100 x float]*, [100 x float]** [[CAP00:%[^,]+]]
3146*67e74705SXin Li     // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]]
3147*67e74705SXin Li 
3148*67e74705SXin Li     // CK23: call void [[CALL04:@.+]]([100 x float]* {{[^,]+}})
3149*67e74705SXin Li     #pragma omp target map(c[2:4])
3150*67e74705SXin Li       { c[3]+=1; }
3151*67e74705SXin Li 
3152*67e74705SXin Li     // Region 05
3153*67e74705SXin Li     // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}})
3154*67e74705SXin Li     // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3155*67e74705SXin Li     // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3156*67e74705SXin Li 
3157*67e74705SXin Li     // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3158*67e74705SXin Li     // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3159*67e74705SXin Li     // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3160*67e74705SXin Li     // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3161*67e74705SXin Li     // CK23-DAG: [[CBPVAL0]] = bitcast float* [[RVAR0:%.+]] to i8*
3162*67e74705SXin Li     // CK23-DAG: [[CPVAL0]] = bitcast float* [[SEC0:%.+]] to i8*
3163*67e74705SXin Li     // CK23-DAG: [[RVAR0]] = load float*, float** [[VAR0:%[^,]+]]
3164*67e74705SXin Li     // CK23-DAG: [[SEC0]] = getelementptr {{.*}}float* [[RVAR00:%.+]], i{{.+}} 2
3165*67e74705SXin Li     // CK23-DAG: [[RVAR00]] = load float*, float** [[VAR00:%[^,]+]]
3166*67e74705SXin Li     // CK23-DAG: [[VAR0]] = load float**, float*** [[CAP0:%[^,]+]]
3167*67e74705SXin Li     // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]]
3168*67e74705SXin Li     // CK23-DAG: [[VAR00]] = load float**, float*** [[CAP00:%[^,]+]]
3169*67e74705SXin Li     // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]]
3170*67e74705SXin Li 
3171*67e74705SXin Li     // CK23: call void [[CALL05:@.+]](float* {{[^,]+}})
3172*67e74705SXin Li     #pragma omp target map(d[2:4])
3173*67e74705SXin Li       { d[3]+=1; }
3174*67e74705SXin Li   }();
3175*67e74705SXin Li   return b;
3176*67e74705SXin Li }
3177*67e74705SXin Li 
3178*67e74705SXin Li // CK23: define {{.+}}[[CALL00]]
3179*67e74705SXin Li // CK23: define {{.+}}[[CALL01]]
3180*67e74705SXin Li // CK23: define {{.+}}[[CALL02]]
3181*67e74705SXin Li // CK23: define {{.+}}[[CALL03]]
3182*67e74705SXin Li // CK23: define {{.+}}[[CALL04]]
3183*67e74705SXin Li // CK23: define {{.+}}[[CALL05]]
3184*67e74705SXin Li #endif
3185*67e74705SXin Li ///==========================================================================///
3186*67e74705SXin Li // RUN: %clang_cc1 -DCK24 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK24 --check-prefix CK24-64
3187*67e74705SXin Li // RUN: %clang_cc1 -DCK24 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
3188*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 CK24 --check-prefix CK24-64
3189*67e74705SXin Li // RUN: %clang_cc1 -DCK24 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK24 --check-prefix CK24-32
3190*67e74705SXin Li // RUN: %clang_cc1 -DCK24 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
3191*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 CK24 --check-prefix CK24-32
3192*67e74705SXin Li #ifdef CK24
3193*67e74705SXin Li 
3194*67e74705SXin Li // CK24-DAG: [[SC:%.+]] = type { i32, [[SB:%.+]], [[SB:%.+]]*, [10 x i32] }
3195*67e74705SXin Li // CK24-DAG: [[SB]] = type { i32, [[SA:%.+]], [10 x [[SA:%.+]]], [10 x [[SA:%.+]]*], [[SA:%.+]]* }
3196*67e74705SXin Li // CK24-DAG: [[SA]] = type { i32, [[SA]]*, [10 x i32] }
3197*67e74705SXin Li 
3198*67e74705SXin Li struct SA{
3199*67e74705SXin Li   int a;
3200*67e74705SXin Li   struct SA *p;
3201*67e74705SXin Li   int b[10];
3202*67e74705SXin Li };
3203*67e74705SXin Li struct SB{
3204*67e74705SXin Li   int a;
3205*67e74705SXin Li   struct SA s;
3206*67e74705SXin Li   struct SA sa[10];
3207*67e74705SXin Li   struct SA *sp[10];
3208*67e74705SXin Li   struct SA *p;
3209*67e74705SXin Li };
3210*67e74705SXin Li struct SC{
3211*67e74705SXin Li   int a;
3212*67e74705SXin Li   struct SB s;
3213*67e74705SXin Li   struct SB *p;
3214*67e74705SXin Li   int b[10];
3215*67e74705SXin Li };
3216*67e74705SXin Li 
3217*67e74705SXin Li // CK24: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
3218*67e74705SXin Li // CK24: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3219*67e74705SXin Li 
3220*67e74705SXin Li // CK24: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{56|48}}]
3221*67e74705SXin Li // CK24: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3222*67e74705SXin Li 
3223*67e74705SXin Li // CK24: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
3224*67e74705SXin Li // CK24: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3225*67e74705SXin Li 
3226*67e74705SXin Li // CK24: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20]
3227*67e74705SXin Li // CK24: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3228*67e74705SXin Li 
3229*67e74705SXin Li // CK24: [[SIZE05:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{3560|2880}}]
3230*67e74705SXin Li // CK24: [[MTYPE05:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3231*67e74705SXin Li 
3232*67e74705SXin Li // CK24: [[SIZE06:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
3233*67e74705SXin Li // CK24: [[MTYPE06:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3234*67e74705SXin Li 
3235*67e74705SXin Li // CK24: [[SIZE07:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
3236*67e74705SXin Li // CK24: [[MTYPE07:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3237*67e74705SXin Li 
3238*67e74705SXin Li // CK24: [[SIZE08:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
3239*67e74705SXin Li // CK24: [[MTYPE08:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3240*67e74705SXin Li 
3241*67e74705SXin Li // CK24: [[SIZE09:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
3242*67e74705SXin Li // CK24: [[MTYPE09:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3243*67e74705SXin Li 
3244*67e74705SXin Li // CK24: [[SIZE10:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 8]
3245*67e74705SXin Li // CK24: [[MTYPE10:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3246*67e74705SXin Li 
3247*67e74705SXin Li // CK24: [[SIZE11:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}]
3248*67e74705SXin Li // CK24: [[MTYPE11:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3249*67e74705SXin Li 
3250*67e74705SXin Li // CK24: [[SIZE12:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 4]
3251*67e74705SXin Li // CK24: [[MTYPE12:@.+]] = private {{.*}}constant [4 x i32] [i32 35, i32 19, i32 19, i32 19]
3252*67e74705SXin Li 
3253*67e74705SXin Li // CK24: [[SIZE13:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
3254*67e74705SXin Li // CK24: [[MTYPE13:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3255*67e74705SXin Li 
3256*67e74705SXin Li // CK24: [[SIZE14:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{56|48}}]
3257*67e74705SXin Li // CK24: [[MTYPE14:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3258*67e74705SXin Li 
3259*67e74705SXin Li // CK24: [[SIZE15:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
3260*67e74705SXin Li // CK24: [[MTYPE15:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3261*67e74705SXin Li 
3262*67e74705SXin Li // CK24: [[SIZE16:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20]
3263*67e74705SXin Li // CK24: [[MTYPE16:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3264*67e74705SXin Li 
3265*67e74705SXin Li // CK24: [[SIZE17:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{3560|2880}}]
3266*67e74705SXin Li // CK24: [[MTYPE17:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3267*67e74705SXin Li 
3268*67e74705SXin Li // CK24: [[SIZE18:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
3269*67e74705SXin Li // CK24: [[MTYPE18:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3270*67e74705SXin Li 
3271*67e74705SXin Li // CK24: [[SIZE19:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
3272*67e74705SXin Li // CK24: [[MTYPE19:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3273*67e74705SXin Li 
3274*67e74705SXin Li // CK24: [[SIZE20:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
3275*67e74705SXin Li // CK24: [[MTYPE20:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3276*67e74705SXin Li 
3277*67e74705SXin Li // CK24: [[SIZE21:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4]
3278*67e74705SXin Li // CK24: [[MTYPE21:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3279*67e74705SXin Li 
3280*67e74705SXin Li // CK24: [[SIZE22:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}]
3281*67e74705SXin Li // CK24: [[MTYPE22:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
3282*67e74705SXin Li 
3283*67e74705SXin Li // CK24: [[SIZE23:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}]
3284*67e74705SXin Li // CK24: [[MTYPE23:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19]
3285*67e74705SXin Li 
3286*67e74705SXin Li // CK24: [[SIZE24:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 4]
3287*67e74705SXin Li // CK24: [[MTYPE24:@.+]] = private {{.*}}constant [4 x i32] [i32 35, i32 19, i32 19, i32 19]
3288*67e74705SXin Li 
3289*67e74705SXin Li // CK24-LABEL: explicit_maps_struct_fields
explicit_maps_struct_fields(int a)3290*67e74705SXin Li int explicit_maps_struct_fields(int a){
3291*67e74705SXin Li   SC s;
3292*67e74705SXin Li   SC *p;
3293*67e74705SXin Li 
3294*67e74705SXin Li // Region 01
3295*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
3296*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3297*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3298*67e74705SXin Li 
3299*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3300*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3301*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3302*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3303*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3304*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3305*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 0
3306*67e74705SXin Li 
3307*67e74705SXin Li // CK24: call void [[CALL01:@.+]]([[SC]]* {{[^,]+}})
3308*67e74705SXin Li #pragma omp target map(s.a)
3309*67e74705SXin Li   { s.a++; }
3310*67e74705SXin Li 
3311*67e74705SXin Li // Region 02
3312*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
3313*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3314*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3315*67e74705SXin Li 
3316*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3317*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3318*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3319*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3320*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3321*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]* [[SEC0:%.+]] to i8*
3322*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3323*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3324*67e74705SXin Li 
3325*67e74705SXin Li // CK24: call void [[CALL02:@.+]]([[SC]]* {{[^,]+}})
3326*67e74705SXin Li #pragma omp target map(s.s.s)
3327*67e74705SXin Li   { s.a++; }
3328*67e74705SXin Li 
3329*67e74705SXin Li // Region 03
3330*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
3331*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3332*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3333*67e74705SXin Li 
3334*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3335*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3336*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3337*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3338*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3339*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3340*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3341*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3342*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3343*67e74705SXin Li 
3344*67e74705SXin Li // CK24: call void [[CALL03:@.+]]([[SC]]* {{[^,]+}})
3345*67e74705SXin Li #pragma omp target map(s.s.s.a)
3346*67e74705SXin Li   { s.a++; }
3347*67e74705SXin Li 
3348*67e74705SXin Li // Region 04
3349*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}})
3350*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3351*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3352*67e74705SXin Li 
3353*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3354*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3355*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3356*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3357*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3358*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3359*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3360*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 3
3361*67e74705SXin Li 
3362*67e74705SXin Li // CK24: call void [[CALL04:@.+]]([[SC]]* {{[^,]+}})
3363*67e74705SXin Li #pragma omp target map(s.b[:5])
3364*67e74705SXin Li   { s.a++; }
3365*67e74705SXin Li 
3366*67e74705SXin Li // Region 05
3367*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE05]]{{.+}})
3368*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3369*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3370*67e74705SXin Li 
3371*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3372*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3373*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3374*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3375*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3376*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8*
3377*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3378*67e74705SXin Li 
3379*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3380*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3381*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3382*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3383*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8*
3384*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast [[SB]]* [[SEC1:%.+]] to i8*
3385*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0
3386*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]],
3387*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3388*67e74705SXin Li 
3389*67e74705SXin Li // CK24: call void [[CALL05:@.+]]([[SC]]* {{[^,]+}})
3390*67e74705SXin Li #pragma omp target map(s.p[:5])
3391*67e74705SXin Li   { s.a++; }
3392*67e74705SXin Li 
3393*67e74705SXin Li // Region 06
3394*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE06]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE06]]{{.+}})
3395*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3396*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3397*67e74705SXin Li 
3398*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3399*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3400*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3401*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3402*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3403*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3404*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3405*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[10 x [[SA]]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3406*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 2
3407*67e74705SXin Li // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3408*67e74705SXin Li 
3409*67e74705SXin Li // CK24: call void [[CALL06:@.+]]([[SC]]* {{[^,]+}})
3410*67e74705SXin Li #pragma omp target map(s.s.sa[3].a)
3411*67e74705SXin Li   { s.a++; }
3412*67e74705SXin Li 
3413*67e74705SXin Li // Region 07
3414*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE07]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE07]]{{.+}})
3415*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3416*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3417*67e74705SXin Li 
3418*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3419*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3420*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3421*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3422*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3423*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8*
3424*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3425*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3426*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3427*67e74705SXin Li 
3428*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3429*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3430*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3431*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3432*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8*
3433*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3434*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3435*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]],
3436*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC1111:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3437*67e74705SXin Li // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3438*67e74705SXin Li // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3439*67e74705SXin Li 
3440*67e74705SXin Li // CK24: call void [[CALL07:@.+]]([[SC]]* {{[^,]+}})
3441*67e74705SXin Li #pragma omp target map(s.s.sp[3]->a)
3442*67e74705SXin Li   { s.a++; }
3443*67e74705SXin Li 
3444*67e74705SXin Li // Region 08
3445*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE08]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE08]]{{.+}})
3446*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3447*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3448*67e74705SXin Li 
3449*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3450*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3451*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3452*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3453*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3454*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8*
3455*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3456*67e74705SXin Li 
3457*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3458*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3459*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3460*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3461*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8*
3462*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3463*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0
3464*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]],
3465*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3466*67e74705SXin Li 
3467*67e74705SXin Li // CK24: call void [[CALL08:@.+]]([[SC]]* {{[^,]+}})
3468*67e74705SXin Li #pragma omp target map(s.p->a)
3469*67e74705SXin Li   { s.a++; }
3470*67e74705SXin Li 
3471*67e74705SXin Li // Region 09
3472*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE09]]{{.+}})
3473*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3474*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3475*67e74705SXin Li 
3476*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3477*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3478*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3479*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3480*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3481*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8*
3482*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 4
3483*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3484*67e74705SXin Li 
3485*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3486*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3487*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3488*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3489*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8*
3490*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3491*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0
3492*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]],
3493*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SB]]* [[SEC1111:[^,]+]], i{{.+}} 0, i{{.+}} 4
3494*67e74705SXin Li // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3495*67e74705SXin Li 
3496*67e74705SXin Li // CK24: call void [[CALL09:@.+]]([[SC]]* {{[^,]+}})
3497*67e74705SXin Li #pragma omp target map(s.s.p->a)
3498*67e74705SXin Li   { s.a++; }
3499*67e74705SXin Li 
3500*67e74705SXin Li // Region 10
3501*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE10]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE10]]{{.+}})
3502*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3503*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3504*67e74705SXin Li 
3505*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3506*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3507*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3508*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3509*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3510*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3511*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3512*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SA]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 2
3513*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3514*67e74705SXin Li // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3515*67e74705SXin Li 
3516*67e74705SXin Li // CK24: call void [[CALL10:@.+]]([[SC]]* {{[^,]+}})
3517*67e74705SXin Li #pragma omp target map(s.s.s.b[:2])
3518*67e74705SXin Li   { s.a++; }
3519*67e74705SXin Li 
3520*67e74705SXin Li // Region 11
3521*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE11]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE11]]{{.+}})
3522*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3523*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3524*67e74705SXin Li 
3525*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3526*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3527*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3528*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3529*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3530*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8*
3531*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3532*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3533*67e74705SXin Li 
3534*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3535*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3536*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3537*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3538*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8*
3539*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3540*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[10 x i32]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3541*67e74705SXin Li // CK24-DAG: [[SEC11]] = getelementptr {{.*}}[[SA]]* [[SEC111:%[^,]+]], i{{.+}} 0, i{{.+}} 2
3542*67e74705SXin Li // CK24-DAG: [[SEC111]] = load [[SA]]*, [[SA]]** [[SEC1111:%[^,]+]],
3543*67e74705SXin Li // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3544*67e74705SXin Li // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1
3545*67e74705SXin Li 
3546*67e74705SXin Li // CK24: call void [[CALL11:@.+]]([[SC]]* {{[^,]+}})
3547*67e74705SXin Li #pragma omp target map(s.s.p->b[:2])
3548*67e74705SXin Li   { s.a++; }
3549*67e74705SXin Li 
3550*67e74705SXin Li // Region 12
3551*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE12]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE12]]{{.+}})
3552*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3553*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3554*67e74705SXin Li 
3555*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3556*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3557*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3558*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3559*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3560*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8*
3561*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3562*67e74705SXin Li 
3563*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3564*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3565*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3566*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3567*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8*
3568*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast [[SA]]** [[SEC1:%.+]] to i8*
3569*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3570*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]],
3571*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3572*67e74705SXin Li 
3573*67e74705SXin Li // CK24-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
3574*67e74705SXin Li // CK24-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
3575*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
3576*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
3577*67e74705SXin Li // CK24-DAG: [[CBPVAL2]] = bitcast [[SA]]** [[SEC1]] to i8*
3578*67e74705SXin Li // CK24-DAG: [[CPVAL2]] = bitcast [[SA]]** [[SEC2:%.+]] to i8*
3579*67e74705SXin Li // CK24-DAG: [[SEC2]] = getelementptr {{.*}}[[SA]]* [[SEC22:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3580*67e74705SXin Li // CK24-DAG: [[SEC22]] = load [[SA]]*, [[SA]]** [[SEC222:%[^,]+]],
3581*67e74705SXin Li // CK24-DAG: [[SEC222]] = getelementptr {{.*}}[[SB]]* [[SEC2222:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3582*67e74705SXin Li // CK24-DAG: [[SEC2222]] = load [[SB]]*, [[SB]]** [[SEC22222:%[^,]+]],
3583*67e74705SXin Li // CK24-DAG: [[SEC22222]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3584*67e74705SXin Li 
3585*67e74705SXin Li // CK24-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3
3586*67e74705SXin Li // CK24-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3
3587*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]
3588*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]
3589*67e74705SXin Li // CK24-DAG: [[CBPVAL3]] = bitcast [[SA]]** [[SEC2]] to i8*
3590*67e74705SXin Li // CK24-DAG: [[CPVAL3]] = bitcast i32* [[SEC3:%.+]] to i8*
3591*67e74705SXin Li // CK24-DAG: [[SEC3]] = getelementptr {{.*}}[[SA]]* [[SEC33:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3592*67e74705SXin Li // CK24-DAG: [[SEC33]] = load [[SA]]*, [[SA]]** [[SEC333:%[^,]+]],
3593*67e74705SXin Li // CK24-DAG: [[SEC333]] = getelementptr {{.*}}[[SA]]* [[SEC3333:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3594*67e74705SXin Li // CK24-DAG: [[SEC3333]] = load [[SA]]*, [[SA]]** [[SEC33333:%[^,]+]],
3595*67e74705SXin Li // CK24-DAG: [[SEC33333]] = getelementptr {{.*}}[[SB]]* [[SEC333333:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3596*67e74705SXin Li // CK24-DAG: [[SEC333333]] = load [[SB]]*, [[SB]]** [[SEC3333333:%[^,]+]],
3597*67e74705SXin Li // CK24-DAG: [[SEC3333333]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2
3598*67e74705SXin Li 
3599*67e74705SXin Li // CK24: call void [[CALL12:@.+]]([[SC]]* {{[^,]+}})
3600*67e74705SXin Li #pragma omp target map(s.p->p->p->a)
3601*67e74705SXin Li   { s.a++; }
3602*67e74705SXin Li 
3603*67e74705SXin Li //
3604*67e74705SXin Li // Same thing but starting from a pointer.
3605*67e74705SXin Li //
3606*67e74705SXin Li // Region 13
3607*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE13]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE13]]{{.+}})
3608*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3609*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3610*67e74705SXin Li 
3611*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3612*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3613*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3614*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3615*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3616*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3617*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 0
3618*67e74705SXin Li 
3619*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3620*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3621*67e74705SXin Li 
3622*67e74705SXin Li // CK24: call void [[CALL13:@.+]]([[SC]]* {{[^,]+}})
3623*67e74705SXin Li #pragma omp target map(p->a)
3624*67e74705SXin Li   { p->a++; }
3625*67e74705SXin Li 
3626*67e74705SXin Li // Region 14
3627*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE14]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE14]]{{.+}})
3628*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3629*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3630*67e74705SXin Li 
3631*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3632*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3633*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3634*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3635*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3636*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]* [[SEC0:%.+]] to i8*
3637*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3638*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3639*67e74705SXin Li 
3640*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3641*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3642*67e74705SXin Li 
3643*67e74705SXin Li // CK24: call void [[CALL14:@.+]]([[SC]]* {{[^,]+}})
3644*67e74705SXin Li #pragma omp target map(p->s.s)
3645*67e74705SXin Li   { p->a++; }
3646*67e74705SXin Li 
3647*67e74705SXin Li // Region 15
3648*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE15]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE15]]{{.+}})
3649*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3650*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3651*67e74705SXin Li 
3652*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3653*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3654*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3655*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3656*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3657*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3658*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3659*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3660*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3661*67e74705SXin Li 
3662*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3663*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3664*67e74705SXin Li 
3665*67e74705SXin Li // CK24: call void [[CALL15:@.+]]([[SC]]* {{[^,]+}})
3666*67e74705SXin Li #pragma omp target map(p->s.s.a)
3667*67e74705SXin Li   { p->a++; }
3668*67e74705SXin Li 
3669*67e74705SXin Li // Region 16
3670*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE16]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE16]]{{.+}})
3671*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3672*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3673*67e74705SXin Li 
3674*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3675*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3676*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3677*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3678*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3679*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3680*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3681*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 3
3682*67e74705SXin Li 
3683*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3684*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3685*67e74705SXin Li 
3686*67e74705SXin Li // CK24: call void [[CALL16:@.+]]([[SC]]* {{[^,]+}})
3687*67e74705SXin Li #pragma omp target map(p->b[:5])
3688*67e74705SXin Li   { p->a++; }
3689*67e74705SXin Li 
3690*67e74705SXin Li // Region 17
3691*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE17]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE17]]{{.+}})
3692*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3693*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3694*67e74705SXin Li 
3695*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3696*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3697*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3698*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3699*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3700*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8*
3701*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2
3702*67e74705SXin Li 
3703*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3704*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3705*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3706*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3707*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8*
3708*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast [[SB]]* [[SEC1:%.+]] to i8*
3709*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0
3710*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]],
3711*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 2
3712*67e74705SXin Li 
3713*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3714*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3715*67e74705SXin Li // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}}
3716*67e74705SXin Li 
3717*67e74705SXin Li // CK24: call void [[CALL17:@.+]]([[SC]]* {{[^,]+}})
3718*67e74705SXin Li #pragma omp target map(p->p[:5])
3719*67e74705SXin Li   { p->a++; }
3720*67e74705SXin Li 
3721*67e74705SXin Li // Region 18
3722*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE18]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE18]]{{.+}})
3723*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3724*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3725*67e74705SXin Li 
3726*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3727*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3728*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3729*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3730*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3731*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3732*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3733*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[10 x [[SA]]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3734*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 2
3735*67e74705SXin Li // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3736*67e74705SXin Li 
3737*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3738*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3739*67e74705SXin Li 
3740*67e74705SXin Li // CK24: call void [[CALL18:@.+]]([[SC]]* {{[^,]+}})
3741*67e74705SXin Li #pragma omp target map(p->s.sa[3].a)
3742*67e74705SXin Li   { p->a++; }
3743*67e74705SXin Li 
3744*67e74705SXin Li // Region 19
3745*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE19]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE19]]{{.+}})
3746*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3747*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3748*67e74705SXin Li 
3749*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3750*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3751*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3752*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3753*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3754*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8*
3755*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3756*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3757*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3758*67e74705SXin Li 
3759*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3760*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3761*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3762*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3763*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8*
3764*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3765*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3766*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]],
3767*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC1111:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3768*67e74705SXin Li // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 3
3769*67e74705SXin Li // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 1
3770*67e74705SXin Li 
3771*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3772*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3773*67e74705SXin Li // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}}
3774*67e74705SXin Li 
3775*67e74705SXin Li // CK24: call void [[CALL19:@.+]]([[SC]]* {{[^,]+}})
3776*67e74705SXin Li #pragma omp target map(p->s.sp[3]->a)
3777*67e74705SXin Li   { p->a++; }
3778*67e74705SXin Li 
3779*67e74705SXin Li // Region 20
3780*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE20]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE20]]{{.+}})
3781*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3782*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3783*67e74705SXin Li 
3784*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3785*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3786*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3787*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3788*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3789*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8*
3790*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2
3791*67e74705SXin Li 
3792*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3793*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3794*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3795*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3796*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8*
3797*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3798*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0
3799*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]],
3800*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 2
3801*67e74705SXin Li 
3802*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3803*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3804*67e74705SXin Li // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}}
3805*67e74705SXin Li 
3806*67e74705SXin Li // CK24: call void [[CALL20:@.+]]([[SC]]* {{[^,]+}})
3807*67e74705SXin Li #pragma omp target map(p->p->a)
3808*67e74705SXin Li   { p->a++; }
3809*67e74705SXin Li 
3810*67e74705SXin Li // Region 21
3811*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE21]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE21]]{{.+}})
3812*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3813*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3814*67e74705SXin Li 
3815*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3816*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3817*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3818*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3819*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3820*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8*
3821*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 4
3822*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3823*67e74705SXin Li 
3824*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3825*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3826*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3827*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3828*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8*
3829*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3830*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0
3831*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]],
3832*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SB]]* [[SEC1111:[^,]+]], i{{.+}} 0, i{{.+}} 4
3833*67e74705SXin Li // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 1
3834*67e74705SXin Li 
3835*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3836*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3837*67e74705SXin Li // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}}
3838*67e74705SXin Li 
3839*67e74705SXin Li // CK24: call void [[CALL21:@.+]]([[SC]]* {{[^,]+}})
3840*67e74705SXin Li #pragma omp target map(p->s.p->a)
3841*67e74705SXin Li   { p->a++; }
3842*67e74705SXin Li 
3843*67e74705SXin Li // Region 22
3844*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE22]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE22]]{{.+}})
3845*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3846*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3847*67e74705SXin Li 
3848*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3849*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3850*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3851*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3852*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3853*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
3854*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3855*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SA]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 2
3856*67e74705SXin Li // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3857*67e74705SXin Li // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3858*67e74705SXin Li 
3859*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3860*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3861*67e74705SXin Li 
3862*67e74705SXin Li // CK24: call void [[CALL22:@.+]]([[SC]]* {{[^,]+}})
3863*67e74705SXin Li #pragma omp target map(p->s.s.b[:2])
3864*67e74705SXin Li   { p->a++; }
3865*67e74705SXin Li 
3866*67e74705SXin Li // Region 23
3867*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE23]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE23]]{{.+}})
3868*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3869*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3870*67e74705SXin Li 
3871*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3872*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3873*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3874*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3875*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3876*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8*
3877*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3878*67e74705SXin Li // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1
3879*67e74705SXin Li 
3880*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3881*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3882*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3883*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3884*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8*
3885*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
3886*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[10 x i32]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3887*67e74705SXin Li // CK24-DAG: [[SEC11]] = getelementptr {{.*}}[[SA]]* [[SEC111:%[^,]+]], i{{.+}} 0, i{{.+}} 2
3888*67e74705SXin Li // CK24-DAG: [[SEC111]] = load [[SA]]*, [[SA]]** [[SEC1111:%[^,]+]],
3889*67e74705SXin Li // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3890*67e74705SXin Li // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 1
3891*67e74705SXin Li 
3892*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3893*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3894*67e74705SXin Li // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}}
3895*67e74705SXin Li 
3896*67e74705SXin Li // CK24: call void [[CALL23:@.+]]([[SC]]* {{[^,]+}})
3897*67e74705SXin Li #pragma omp target map(p->s.p->b[:2])
3898*67e74705SXin Li   { p->a++; }
3899*67e74705SXin Li 
3900*67e74705SXin Li // Region 24
3901*67e74705SXin Li // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE24]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE24]]{{.+}})
3902*67e74705SXin Li // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
3903*67e74705SXin Li // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
3904*67e74705SXin Li 
3905*67e74705SXin Li // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
3906*67e74705SXin Li // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
3907*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
3908*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
3909*67e74705SXin Li // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8*
3910*67e74705SXin Li // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8*
3911*67e74705SXin Li // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2
3912*67e74705SXin Li 
3913*67e74705SXin Li // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
3914*67e74705SXin Li // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
3915*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
3916*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
3917*67e74705SXin Li // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8*
3918*67e74705SXin Li // CK24-DAG: [[CPVAL1]] = bitcast [[SA]]** [[SEC1:%.+]] to i8*
3919*67e74705SXin Li // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3920*67e74705SXin Li // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]],
3921*67e74705SXin Li // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 2
3922*67e74705SXin Li 
3923*67e74705SXin Li // CK24-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2
3924*67e74705SXin Li // CK24-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2
3925*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]]
3926*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]]
3927*67e74705SXin Li // CK24-DAG: [[CBPVAL2]] = bitcast [[SA]]** [[SEC1]] to i8*
3928*67e74705SXin Li // CK24-DAG: [[CPVAL2]] = bitcast [[SA]]** [[SEC2:%.+]] to i8*
3929*67e74705SXin Li // CK24-DAG: [[SEC2]] = getelementptr {{.*}}[[SA]]* [[SEC22:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3930*67e74705SXin Li // CK24-DAG: [[SEC22]] = load [[SA]]*, [[SA]]** [[SEC222:%[^,]+]],
3931*67e74705SXin Li // CK24-DAG: [[SEC222]] = getelementptr {{.*}}[[SB]]* [[SEC2222:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3932*67e74705SXin Li // CK24-DAG: [[SEC2222]] = load [[SB]]*, [[SB]]** [[SEC22222:%[^,]+]],
3933*67e74705SXin Li // CK24-DAG: [[SEC22222]] = getelementptr {{.*}}[[SC]]* [[VAR0000:%.+]], i{{.+}} 0, i{{.+}} 2
3934*67e74705SXin Li 
3935*67e74705SXin Li // CK24-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3
3936*67e74705SXin Li // CK24-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3
3937*67e74705SXin Li // CK24-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]]
3938*67e74705SXin Li // CK24-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]]
3939*67e74705SXin Li // CK24-DAG: [[CBPVAL3]] = bitcast [[SA]]** [[SEC2]] to i8*
3940*67e74705SXin Li // CK24-DAG: [[CPVAL3]] = bitcast i32* [[SEC3:%.+]] to i8*
3941*67e74705SXin Li // CK24-DAG: [[SEC3]] = getelementptr {{.*}}[[SA]]* [[SEC33:%[^,]+]], i{{.+}} 0, i{{.+}} 0
3942*67e74705SXin Li // CK24-DAG: [[SEC33]] = load [[SA]]*, [[SA]]** [[SEC333:%[^,]+]],
3943*67e74705SXin Li // CK24-DAG: [[SEC333]] = getelementptr {{.*}}[[SA]]* [[SEC3333:%[^,]+]], i{{.+}} 0, i{{.+}} 1
3944*67e74705SXin Li // CK24-DAG: [[SEC3333]] = load [[SA]]*, [[SA]]** [[SEC33333:%[^,]+]],
3945*67e74705SXin Li // CK24-DAG: [[SEC33333]] = getelementptr {{.*}}[[SB]]* [[SEC333333:%[^,]+]], i{{.+}} 0, i{{.+}} 4
3946*67e74705SXin Li // CK24-DAG: [[SEC333333]] = load [[SB]]*, [[SB]]** [[SEC3333333:%[^,]+]],
3947*67e74705SXin Li // CK24-DAG: [[SEC3333333]] = getelementptr {{.*}}[[SC]]* [[VAR00000:%.+]], i{{.+}} 0, i{{.+}} 2
3948*67e74705SXin Li 
3949*67e74705SXin Li // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}}
3950*67e74705SXin Li // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}}
3951*67e74705SXin Li // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}}
3952*67e74705SXin Li // CK24-DAG: [[VAR0000]] = load [[SC]]*, [[SC]]** %{{.+}}
3953*67e74705SXin Li // CK24-DAG: [[VAR00000]] = load [[SC]]*, [[SC]]** %{{.+}}
3954*67e74705SXin Li 
3955*67e74705SXin Li // CK24: call void [[CALL24:@.+]]([[SC]]* {{[^,]+}})
3956*67e74705SXin Li #pragma omp target map(p->p->p->p->a)
3957*67e74705SXin Li   { p->a++; }
3958*67e74705SXin Li 
3959*67e74705SXin Li   return s.a;
3960*67e74705SXin Li }
3961*67e74705SXin Li 
3962*67e74705SXin Li // CK24: define {{.+}}[[CALL01]]
3963*67e74705SXin Li // CK24: define {{.+}}[[CALL02]]
3964*67e74705SXin Li // CK24: define {{.+}}[[CALL03]]
3965*67e74705SXin Li // CK24: define {{.+}}[[CALL04]]
3966*67e74705SXin Li // CK24: define {{.+}}[[CALL05]]
3967*67e74705SXin Li // CK24: define {{.+}}[[CALL06]]
3968*67e74705SXin Li // CK24: define {{.+}}[[CALL07]]
3969*67e74705SXin Li // CK24: define {{.+}}[[CALL08]]
3970*67e74705SXin Li // CK24: define {{.+}}[[CALL09]]
3971*67e74705SXin Li // CK24: define {{.+}}[[CALL10]]
3972*67e74705SXin Li // CK24: define {{.+}}[[CALL11]]
3973*67e74705SXin Li // CK24: define {{.+}}[[CALL12]]
3974*67e74705SXin Li // CK24: define {{.+}}[[CALL13]]
3975*67e74705SXin Li // CK24: define {{.+}}[[CALL14]]
3976*67e74705SXin Li // CK24: define {{.+}}[[CALL15]]
3977*67e74705SXin Li // CK24: define {{.+}}[[CALL16]]
3978*67e74705SXin Li // CK24: define {{.+}}[[CALL17]]
3979*67e74705SXin Li // CK24: define {{.+}}[[CALL18]]
3980*67e74705SXin Li // CK24: define {{.+}}[[CALL19]]
3981*67e74705SXin Li // CK24: define {{.+}}[[CALL20]]
3982*67e74705SXin Li // CK24: define {{.+}}[[CALL21]]
3983*67e74705SXin Li // CK24: define {{.+}}[[CALL22]]
3984*67e74705SXin Li // CK24: define {{.+}}[[CALL23]]
3985*67e74705SXin Li // CK24: define {{.+}}[[CALL24]]
3986*67e74705SXin Li #endif
3987*67e74705SXin Li ///==========================================================================///
3988*67e74705SXin Li // RUN: %clang_cc1 -DCK25 -std=c++11 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK25 --check-prefix CK25-64
3989*67e74705SXin Li // RUN: %clang_cc1 -DCK25 -std=c++11 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
3990*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -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 CK25 --check-prefix CK25-64
3991*67e74705SXin Li // RUN: %clang_cc1 -DCK25 -std=c++11 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK25 --check-prefix CK25-32
3992*67e74705SXin Li // RUN: %clang_cc1 -DCK25 -std=c++11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
3993*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -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 CK25 --check-prefix CK25-32
3994*67e74705SXin Li #ifdef CK25
3995*67e74705SXin Li // CK25: [[ST:%.+]] = type { i32, float }
3996*67e74705SXin Li // CK25: [[CA00:%.+]] = type { [[ST]]* }
3997*67e74705SXin Li // CK25: [[CA01:%.+]] = type { i32* }
3998*67e74705SXin Li 
3999*67e74705SXin Li // CK25: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4]
4000*67e74705SXin Li // CK25: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
4001*67e74705SXin Li 
4002*67e74705SXin Li // CK25: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
4003*67e74705SXin Li // CK25: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 33]
4004*67e74705SXin Li 
4005*67e74705SXin Li // CK25-LABEL: explicit_maps_with_inner_lambda
4006*67e74705SXin Li 
4007*67e74705SXin Li template <int X, typename T>
4008*67e74705SXin Li struct CC {
4009*67e74705SXin Li   T A;
4010*67e74705SXin Li   float B;
4011*67e74705SXin Li 
fooCC4012*67e74705SXin Li   int foo(T arg) {
4013*67e74705SXin Li     // Region 00
4014*67e74705SXin Li     // CK25-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
4015*67e74705SXin Li     // CK25-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4016*67e74705SXin Li     // CK25-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4017*67e74705SXin Li 
4018*67e74705SXin Li     // CK25-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4019*67e74705SXin Li     // CK25-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4020*67e74705SXin Li     // CK25-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4021*67e74705SXin Li     // CK25-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4022*67e74705SXin Li     // CK25-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
4023*67e74705SXin Li     // CK25-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
4024*67e74705SXin Li     // CK25-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0:%.+]], i{{.+}} 0, i{{.+}} 0
4025*67e74705SXin Li 
4026*67e74705SXin Li     // CK25: call void [[CALL00:@.+]]([[ST]]* {{[^,]+}})
4027*67e74705SXin Li     #pragma omp target map(to:A)
4028*67e74705SXin Li     {
4029*67e74705SXin Li       [&]() {
4030*67e74705SXin Li         A += 1;
4031*67e74705SXin Li       }();
4032*67e74705SXin Li     }
4033*67e74705SXin Li 
4034*67e74705SXin Li     // Region 01
4035*67e74705SXin Li     // CK25-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
4036*67e74705SXin Li     // CK25-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4037*67e74705SXin Li     // CK25-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4038*67e74705SXin Li 
4039*67e74705SXin Li     // CK25-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4040*67e74705SXin Li     // CK25-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4041*67e74705SXin Li     // CK25-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4042*67e74705SXin Li     // CK25-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4043*67e74705SXin Li     // CK25-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
4044*67e74705SXin Li     // CK25-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
4045*67e74705SXin Li 
4046*67e74705SXin Li     // CK25: call void [[CALL01:@.+]](i32* {{[^,]+}})
4047*67e74705SXin Li     #pragma omp target map(to:arg)
4048*67e74705SXin Li     {
4049*67e74705SXin Li       [&]() {
4050*67e74705SXin Li         arg += 1;
4051*67e74705SXin Li       }();
4052*67e74705SXin Li     }
4053*67e74705SXin Li 
4054*67e74705SXin Li     return A+arg;
4055*67e74705SXin Li   }
4056*67e74705SXin Li };
4057*67e74705SXin Li 
explicit_maps_with_inner_lambda(int a)4058*67e74705SXin Li int explicit_maps_with_inner_lambda(int a){
4059*67e74705SXin Li   CC<123,int> c;
4060*67e74705SXin Li   return c.foo(a);
4061*67e74705SXin Li }
4062*67e74705SXin Li 
4063*67e74705SXin Li // CK25: define {{.+}}[[CALL00]]([[ST]]* [[VAL:%.+]])
4064*67e74705SXin Li // CK25: store [[ST]]* [[VAL]], [[ST]]** [[VALADDR:%[^,]+]],
4065*67e74705SXin Li // CK25: [[VAL1:%.+]] = load [[ST]]*, [[ST]]** [[VALADDR]],
4066*67e74705SXin Li // CK25: [[VALADDR1:%.+]] = getelementptr inbounds [[CA00]], [[CA00]]* [[CA:%[^,]+]], i32 0, i32 0
4067*67e74705SXin Li // CK25: store [[ST]]* [[VAL1]], [[ST]]** [[VALADDR1]],
4068*67e74705SXin Li // CK25: call void {{.*}}[[LAMBDA:@.+]]{{.*}}([[CA00]]* [[CA]])
4069*67e74705SXin Li 
4070*67e74705SXin Li // CK25: define {{.+}}[[LAMBDA]]
4071*67e74705SXin Li 
4072*67e74705SXin Li // CK25: define {{.+}}[[CALL01]](i32* {{.*}}[[VAL:%.+]])
4073*67e74705SXin Li // CK25: store i32* [[VAL]], i32** [[VALADDR:%[^,]+]],
4074*67e74705SXin Li // CK25: [[VAL1:%.+]] = load i32*, i32** [[VALADDR]],
4075*67e74705SXin Li // CK25: [[VALADDR1:%.+]] = getelementptr inbounds [[CA01]], [[CA01]]* [[CA:%[^,]+]], i32 0, i32 0
4076*67e74705SXin Li // CK25: store i32* [[VAL1]], i32** [[VALADDR1]],
4077*67e74705SXin Li // CK25: call void {{.*}}[[LAMBDA]]{{.*}}([[CA01]]* [[CA]])
4078*67e74705SXin Li #endif
4079*67e74705SXin Li ///==========================================================================///
4080*67e74705SXin Li // RUN: %clang_cc1 -DCK26 -std=c++11 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK26 --check-prefix CK26-64
4081*67e74705SXin Li // RUN: %clang_cc1 -DCK26 -std=c++11 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
4082*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -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 CK26 --check-prefix CK26-64
4083*67e74705SXin Li // RUN: %clang_cc1 -DCK26 -std=c++11 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK26 --check-prefix CK26-32
4084*67e74705SXin Li // RUN: %clang_cc1 -DCK26 -std=c++11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
4085*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -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 CK26 --check-prefix CK26-32
4086*67e74705SXin Li #ifdef CK26
4087*67e74705SXin Li // CK26: [[ST:%.+]] = type { i32, float*, i32, float* }
4088*67e74705SXin Li 
4089*67e74705SXin Li // CK26: [[SIZE00:@.+]] = private {{.*}}constant [2 x i[[Z:64|32]]] [i[[Z:64|32]] {{32|16}}, i[[Z:64|32]] 4]
4090*67e74705SXin Li // CK26: [[MTYPE00:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35]
4091*67e74705SXin Li 
4092*67e74705SXin Li // CK26: [[SIZE01:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{32|16}}, i[[Z]] 4]
4093*67e74705SXin Li // CK26: [[MTYPE01:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35]
4094*67e74705SXin Li 
4095*67e74705SXin Li // CK26: [[SIZE02:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{32|16}}, i[[Z]] 4]
4096*67e74705SXin Li // CK26: [[MTYPE02:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35]
4097*67e74705SXin Li 
4098*67e74705SXin Li // CK26: [[SIZE03:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{32|16}}, i[[Z]] 4]
4099*67e74705SXin Li // CK26: [[MTYPE03:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35]
4100*67e74705SXin Li 
4101*67e74705SXin Li // CK26-LABEL: explicit_maps_with_private_class_members
4102*67e74705SXin Li 
4103*67e74705SXin Li struct CC {
4104*67e74705SXin Li   int fA;
4105*67e74705SXin Li   float &fB;
4106*67e74705SXin Li   int pA;
4107*67e74705SXin Li   float &pB;
4108*67e74705SXin Li 
CCCC4109*67e74705SXin Li   CC(float &B) : fB(B), pB(B) {
4110*67e74705SXin Li 
4111*67e74705SXin Li     // CK26: call {{.*}}@__kmpc_fork_call{{.*}} [[OUTCALL:@.+]] to void (i32*, i32*, ...)*
4112*67e74705SXin Li     // define {{.*}}void [[OUTCALL]]
4113*67e74705SXin Li     #pragma omp parallel firstprivate(fA,fB) private(pA,pB)
4114*67e74705SXin Li     {
4115*67e74705SXin Li       // Region 00
4116*67e74705SXin Li       // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE00]]{{.+}})
4117*67e74705SXin Li       // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4118*67e74705SXin Li       // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4119*67e74705SXin Li 
4120*67e74705SXin Li       // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4121*67e74705SXin Li       // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4122*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4123*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4124*67e74705SXin Li       // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
4125*67e74705SXin Li       // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8*
4126*67e74705SXin Li 
4127*67e74705SXin Li       // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
4128*67e74705SXin Li       // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
4129*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
4130*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
4131*67e74705SXin Li       // CK26-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
4132*67e74705SXin Li       // CK26-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
4133*67e74705SXin Li       // CK26-DAG: [[VAR1]] = load i32*, i32** [[PVT:%.+]],
4134*67e74705SXin Li       // CK26-DAG: [[SEC1]] = load i32*, i32** [[PVT]],
4135*67e74705SXin Li 
4136*67e74705SXin Li       // CK26: call void [[CALL00:@.+]]([[ST]]* {{[^,]+}}, i32* {{[^,]+}})
4137*67e74705SXin Li       #pragma omp target map(fA)
4138*67e74705SXin Li       {
4139*67e74705SXin Li         ++fA;
4140*67e74705SXin Li       }
4141*67e74705SXin Li 
4142*67e74705SXin Li       // Region 01
4143*67e74705SXin Li       // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE01]]{{.+}})
4144*67e74705SXin Li       // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4145*67e74705SXin Li       // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4146*67e74705SXin Li 
4147*67e74705SXin Li       // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4148*67e74705SXin Li       // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4149*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4150*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4151*67e74705SXin Li       // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
4152*67e74705SXin Li       // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8*
4153*67e74705SXin Li 
4154*67e74705SXin Li       // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
4155*67e74705SXin Li       // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
4156*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
4157*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
4158*67e74705SXin Li       // CK26-DAG: [[CBPVAL1]] = bitcast float* [[VAR1:%.+]] to i8*
4159*67e74705SXin Li       // CK26-DAG: [[CPVAL1]] = bitcast float* [[SEC1:%.+]] to i8*
4160*67e74705SXin Li       // CK26-DAG: [[VAR1]] = load float*, float** [[PVT:%.+]],
4161*67e74705SXin Li       // CK26-DAG: [[SEC1]] = load float*, float** [[PVT]],
4162*67e74705SXin Li 
4163*67e74705SXin Li       // CK26: call void [[CALL01:@.+]]([[ST]]* {{[^,]+}}, float* {{[^,]+}})
4164*67e74705SXin Li       #pragma omp target map(fB)
4165*67e74705SXin Li       {
4166*67e74705SXin Li         fB += 1.0;
4167*67e74705SXin Li       }
4168*67e74705SXin Li 
4169*67e74705SXin Li       // Region 02
4170*67e74705SXin Li       // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE02]]{{.+}})
4171*67e74705SXin Li       // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4172*67e74705SXin Li       // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4173*67e74705SXin Li 
4174*67e74705SXin Li       // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4175*67e74705SXin Li       // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4176*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4177*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4178*67e74705SXin Li       // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
4179*67e74705SXin Li       // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8*
4180*67e74705SXin Li 
4181*67e74705SXin Li       // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
4182*67e74705SXin Li       // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
4183*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
4184*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
4185*67e74705SXin Li       // CK26-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8*
4186*67e74705SXin Li       // CK26-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8*
4187*67e74705SXin Li       // CK26-DAG: [[VAR1]] = load i32*, i32** [[PVT:%.+]],
4188*67e74705SXin Li       // CK26-DAG: [[SEC1]] = load i32*, i32** [[PVT]],
4189*67e74705SXin Li 
4190*67e74705SXin Li       // CK26: call void [[CALL02:@.+]]([[ST]]* {{[^,]+}}, i32* {{[^,]+}})
4191*67e74705SXin Li       #pragma omp target map(pA)
4192*67e74705SXin Li       {
4193*67e74705SXin Li         ++pA;
4194*67e74705SXin Li       }
4195*67e74705SXin Li 
4196*67e74705SXin Li       // Region 01
4197*67e74705SXin Li       // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE03]]{{.+}})
4198*67e74705SXin Li       // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4199*67e74705SXin Li       // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4200*67e74705SXin Li 
4201*67e74705SXin Li       // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4202*67e74705SXin Li       // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4203*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4204*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4205*67e74705SXin Li       // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
4206*67e74705SXin Li       // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8*
4207*67e74705SXin Li 
4208*67e74705SXin Li       // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
4209*67e74705SXin Li       // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
4210*67e74705SXin Li       // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
4211*67e74705SXin Li       // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
4212*67e74705SXin Li       // CK26-DAG: [[CBPVAL1]] = bitcast float* [[VAR1:%.+]] to i8*
4213*67e74705SXin Li       // CK26-DAG: [[CPVAL1]] = bitcast float* [[SEC1:%.+]] to i8*
4214*67e74705SXin Li       // CK26-DAG: [[VAR1]] = load float*, float** [[PVT:%.+]],
4215*67e74705SXin Li       // CK26-DAG: [[SEC1]] = load float*, float** [[PVT]],
4216*67e74705SXin Li 
4217*67e74705SXin Li       // CK26: call void [[CALL03:@.+]]([[ST]]* {{[^,]+}}, float* {{[^,]+}})
4218*67e74705SXin Li       #pragma omp target map(pB)
4219*67e74705SXin Li       {
4220*67e74705SXin Li         pB += 1.0;
4221*67e74705SXin Li       }
4222*67e74705SXin Li     }
4223*67e74705SXin Li   }
4224*67e74705SXin Li 
fooCC4225*67e74705SXin Li   int foo() {
4226*67e74705SXin Li     return fA + pA;
4227*67e74705SXin Li   }
4228*67e74705SXin Li };
4229*67e74705SXin Li 
4230*67e74705SXin Li // Make sure the private instance is used in all target regions.
4231*67e74705SXin Li // CK26: define {{.+}}[[CALL00]]({{.*}}i32*{{.*}}[[PVTARG:%.+]])
4232*67e74705SXin Li // CK26: store i32* [[PVTARG]], i32** [[PVTADDR:%.+]],
4233*67e74705SXin Li // CK26: [[ADDR:%.+]] = load i32*, i32** [[PVTADDR]],
4234*67e74705SXin Li // CK26: [[VAL:%.+]] = load i32, i32* [[ADDR]],
4235*67e74705SXin Li // CK26: add nsw i32 [[VAL]], 1
4236*67e74705SXin Li 
4237*67e74705SXin Li // CK26: define {{.+}}[[CALL01]]({{.*}}float*{{.*}}[[PVTARG:%.+]])
4238*67e74705SXin Li // CK26: store float* [[PVTARG]], float** [[PVTADDR:%.+]],
4239*67e74705SXin Li // CK26: [[ADDR:%.+]] = load float*, float** [[PVTADDR]],
4240*67e74705SXin Li // CK26: [[VAL:%.+]] = load float, float* [[ADDR]],
4241*67e74705SXin Li // CK26: [[EXT:%.+]] = fpext float [[VAL]] to double
4242*67e74705SXin Li // CK26: fadd double [[EXT]], 1.000000e+00
4243*67e74705SXin Li 
4244*67e74705SXin Li // CK26: define {{.+}}[[CALL02]]({{.*}}i32*{{.*}}[[PVTARG:%.+]])
4245*67e74705SXin Li // CK26: store i32* [[PVTARG]], i32** [[PVTADDR:%.+]],
4246*67e74705SXin Li // CK26: [[ADDR:%.+]] = load i32*, i32** [[PVTADDR]],
4247*67e74705SXin Li // CK26: [[VAL:%.+]] = load i32, i32* [[ADDR]],
4248*67e74705SXin Li // CK26: add nsw i32 [[VAL]], 1
4249*67e74705SXin Li 
4250*67e74705SXin Li // CK26: define {{.+}}[[CALL03]]({{.*}}float*{{.*}}[[PVTARG:%.+]])
4251*67e74705SXin Li // CK26: store float* [[PVTARG]], float** [[PVTADDR:%.+]],
4252*67e74705SXin Li // CK26: [[ADDR:%.+]] = load float*, float** [[PVTADDR]],
4253*67e74705SXin Li // CK26: [[VAL:%.+]] = load float, float* [[ADDR]],
4254*67e74705SXin Li // CK26: [[EXT:%.+]] = fpext float [[VAL]] to double
4255*67e74705SXin Li // CK26: fadd double [[EXT]], 1.000000e+00
4256*67e74705SXin Li 
explicit_maps_with_private_class_members()4257*67e74705SXin Li int explicit_maps_with_private_class_members(){
4258*67e74705SXin Li   float B;
4259*67e74705SXin Li   CC c(B);
4260*67e74705SXin Li   return c.foo();
4261*67e74705SXin Li }
4262*67e74705SXin Li #endif
4263*67e74705SXin Li ///==========================================================================///
4264*67e74705SXin Li // RUN: %clang_cc1 -DCK27 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK27 --check-prefix CK27-64
4265*67e74705SXin Li // RUN: %clang_cc1 -DCK27 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
4266*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 CK27 --check-prefix CK27-64
4267*67e74705SXin Li // RUN: %clang_cc1 -DCK27 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK27 --check-prefix CK27-32
4268*67e74705SXin Li // RUN: %clang_cc1 -DCK27 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
4269*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 CK27 --check-prefix CK27-32
4270*67e74705SXin Li #ifdef CK27
4271*67e74705SXin Li 
4272*67e74705SXin Li // CK27: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] zeroinitializer
4273*67e74705SXin Li // CK27: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
4274*67e74705SXin Li 
4275*67e74705SXin Li // CK27: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer
4276*67e74705SXin Li // CK27: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
4277*67e74705SXin Li 
4278*67e74705SXin Li // CK27: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer
4279*67e74705SXin Li // CK27: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
4280*67e74705SXin Li 
4281*67e74705SXin Li // CK27: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer
4282*67e74705SXin Li // CK27: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35]
4283*67e74705SXin Li 
4284*67e74705SXin Li // CK27: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer
4285*67e74705SXin Li // CK27: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 32]
4286*67e74705SXin Li 
4287*67e74705SXin Li // CK27: [[SIZE07:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4]
4288*67e74705SXin Li // CK27: [[MTYPE07:@.+]] = private {{.*}}constant [1 x i32] [i32 288]
4289*67e74705SXin Li 
4290*67e74705SXin Li // CK27: [[SIZE09:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 40]
4291*67e74705SXin Li // CK27: [[MTYPE09:@.+]] = private {{.*}}constant [1 x i32] [i32 161]
4292*67e74705SXin Li 
4293*67e74705SXin Li // CK27-LABEL: zero_size_section_and_private_maps
zero_size_section_and_private_maps(int ii)4294*67e74705SXin Li void zero_size_section_and_private_maps (int ii){
4295*67e74705SXin Li 
4296*67e74705SXin Li   // Map of a pointer.
4297*67e74705SXin Li   int *pa;
4298*67e74705SXin Li 
4299*67e74705SXin Li   // Region 00
4300*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
4301*67e74705SXin Li   // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4302*67e74705SXin Li   // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4303*67e74705SXin Li 
4304*67e74705SXin Li   // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4305*67e74705SXin Li   // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4306*67e74705SXin Li   // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4307*67e74705SXin Li   // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4308*67e74705SXin Li   // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
4309*67e74705SXin Li   // CK27-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
4310*67e74705SXin Li 
4311*67e74705SXin Li   // CK27: call void [[CALL00:@.+]](i32* {{[^,]+}})
4312*67e74705SXin Li   #pragma omp target
4313*67e74705SXin Li   {
4314*67e74705SXin Li     pa[50]++;
4315*67e74705SXin Li   }
4316*67e74705SXin Li 
4317*67e74705SXin Li   // Region 01
4318*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}})
4319*67e74705SXin Li   // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4320*67e74705SXin Li   // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4321*67e74705SXin Li 
4322*67e74705SXin Li   // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4323*67e74705SXin Li   // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4324*67e74705SXin Li   // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4325*67e74705SXin Li   // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4326*67e74705SXin Li   // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
4327*67e74705SXin Li   // CK27-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
4328*67e74705SXin Li   // CK27-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
4329*67e74705SXin Li   // CK27-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0
4330*67e74705SXin Li   // CK27-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
4331*67e74705SXin Li 
4332*67e74705SXin Li   // CK27: call void [[CALL01:@.+]](i32* {{[^,]+}})
4333*67e74705SXin Li   #pragma omp target map(pa[:0])
4334*67e74705SXin Li   {
4335*67e74705SXin Li     pa[50]++;
4336*67e74705SXin Li   }
4337*67e74705SXin Li 
4338*67e74705SXin Li   // Region 02
4339*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
4340*67e74705SXin Li   // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4341*67e74705SXin Li   // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4342*67e74705SXin Li 
4343*67e74705SXin Li   // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4344*67e74705SXin Li   // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4345*67e74705SXin Li   // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4346*67e74705SXin Li   // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4347*67e74705SXin Li   // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
4348*67e74705SXin Li   // CK27-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
4349*67e74705SXin Li   // CK27-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
4350*67e74705SXin Li   // CK27-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0
4351*67e74705SXin Li   // CK27-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
4352*67e74705SXin Li 
4353*67e74705SXin Li   // CK27: call void [[CALL02:@.+]](i32* {{[^,]+}})
4354*67e74705SXin Li   #pragma omp target map(pa[0:0])
4355*67e74705SXin Li   {
4356*67e74705SXin Li     pa[50]++;
4357*67e74705SXin Li   }
4358*67e74705SXin Li 
4359*67e74705SXin Li   // Region 03
4360*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
4361*67e74705SXin Li   // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4362*67e74705SXin Li   // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4363*67e74705SXin Li 
4364*67e74705SXin Li   // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4365*67e74705SXin Li   // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4366*67e74705SXin Li   // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4367*67e74705SXin Li   // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4368*67e74705SXin Li   // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8*
4369*67e74705SXin Li   // CK27-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8*
4370*67e74705SXin Li   // CK27-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]]
4371*67e74705SXin Li   // CK27-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} %{{.+}}
4372*67e74705SXin Li   // CK27-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]]
4373*67e74705SXin Li 
4374*67e74705SXin Li   // CK27: call void [[CALL03:@.+]](i32* {{[^,]+}})
4375*67e74705SXin Li   #pragma omp target map(pa[ii:0])
4376*67e74705SXin Li   {
4377*67e74705SXin Li     pa[50]++;
4378*67e74705SXin Li   }
4379*67e74705SXin Li 
4380*67e74705SXin Li   int *pvtPtr;
4381*67e74705SXin Li   int pvtScl;
4382*67e74705SXin Li   int pvtArr[10];
4383*67e74705SXin Li 
4384*67e74705SXin Li   // Region 04
4385*67e74705SXin Li   // CK27: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i32* null)
4386*67e74705SXin Li   // CK27: call void [[CALL04:@.+]]()
4387*67e74705SXin Li   #pragma omp target private(pvtPtr)
4388*67e74705SXin Li   {
4389*67e74705SXin Li     pvtPtr[5]++;
4390*67e74705SXin Li   }
4391*67e74705SXin Li 
4392*67e74705SXin Li   // Region 05
4393*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}})
4394*67e74705SXin Li   // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4395*67e74705SXin Li   // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4396*67e74705SXin Li 
4397*67e74705SXin Li   // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4398*67e74705SXin Li   // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4399*67e74705SXin Li   // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4400*67e74705SXin Li   // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4401*67e74705SXin Li   // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
4402*67e74705SXin Li   // CK27-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
4403*67e74705SXin Li 
4404*67e74705SXin Li   // CK27: call void [[CALL05:@.+]](i32* {{[^,]+}})
4405*67e74705SXin Li   #pragma omp target firstprivate(pvtPtr)
4406*67e74705SXin Li   {
4407*67e74705SXin Li     pvtPtr[5]++;
4408*67e74705SXin Li   }
4409*67e74705SXin Li 
4410*67e74705SXin Li   // Region 06
4411*67e74705SXin Li   // CK27: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i32* null)
4412*67e74705SXin Li   // CK27: call void [[CALL06:@.+]]()
4413*67e74705SXin Li   #pragma omp target private(pvtScl)
4414*67e74705SXin Li   {
4415*67e74705SXin Li     pvtScl++;
4416*67e74705SXin Li   }
4417*67e74705SXin Li 
4418*67e74705SXin Li   // Region 07
4419*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZE07]]{{.+}}, {{.+}}[[MTYPE07]]{{.+}})
4420*67e74705SXin Li   // CK27-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
4421*67e74705SXin Li   // CK27-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
4422*67e74705SXin Li   // CK27-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
4423*67e74705SXin Li   // CK27-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
4424*67e74705SXin Li   // CK27-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]],
4425*67e74705SXin Li   // CK27-DAG: store i8* [[VALP:%.+]], i8** [[P1]],
4426*67e74705SXin Li   // CK27-DAG: [[VALBP]] = inttoptr i[[Z]] [[VAL:%.+]] to i8*
4427*67e74705SXin Li   // CK27-DAG: [[VALP]] = inttoptr i[[Z]] [[VAL:%.+]] to i8*
4428*67e74705SXin Li   // CK27-DAG: [[VAL]] = load i[[Z]], i[[Z]]* [[ADDR:%.+]],
4429*67e74705SXin Li   // CK27-64-DAG: [[CADDR:%.+]] = bitcast i[[Z]]* [[ADDR]] to i32*
4430*67e74705SXin Li   // CK27-64-DAG: store i32 {{.+}}, i32* [[CADDR]],
4431*67e74705SXin Li 
4432*67e74705SXin Li   // CK27: call void [[CALL07:@.+]](i[[Z]] [[VAL]])
4433*67e74705SXin Li   #pragma omp target firstprivate(pvtScl)
4434*67e74705SXin Li   {
4435*67e74705SXin Li     pvtScl++;
4436*67e74705SXin Li   }
4437*67e74705SXin Li 
4438*67e74705SXin Li   // Region 08
4439*67e74705SXin Li   // CK27: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i32* null)
4440*67e74705SXin Li   // CK27: call void [[CALL08:@.+]]()
4441*67e74705SXin Li   #pragma omp target private(pvtArr)
4442*67e74705SXin Li   {
4443*67e74705SXin Li     pvtArr[5]++;
4444*67e74705SXin Li   }
4445*67e74705SXin Li 
4446*67e74705SXin Li   // Region 09
4447*67e74705SXin Li   // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE09]]{{.+}})
4448*67e74705SXin Li   // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
4449*67e74705SXin Li   // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
4450*67e74705SXin Li 
4451*67e74705SXin Li   // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
4452*67e74705SXin Li   // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
4453*67e74705SXin Li   // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
4454*67e74705SXin Li   // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
4455*67e74705SXin Li   // CK27-DAG: [[CBPVAL0]] = bitcast [10 x i32]* [[VAR0:%.+]] to i8*
4456*67e74705SXin Li   // CK27-DAG: [[CPVAL0]] = bitcast [10 x i32]* [[VAR0]] to i8*
4457*67e74705SXin Li 
4458*67e74705SXin Li   // CK27: call void [[CALL09:@.+]]([10 x i32]* {{[^,]+}})
4459*67e74705SXin Li   #pragma omp target firstprivate(pvtArr)
4460*67e74705SXin Li   {
4461*67e74705SXin Li     pvtArr[5]++;
4462*67e74705SXin Li   }
4463*67e74705SXin Li }
4464*67e74705SXin Li 
4465*67e74705SXin Li // CK27: define {{.+}}[[CALL00]]
4466*67e74705SXin Li // CK27: define {{.+}}[[CALL01]]
4467*67e74705SXin Li // CK27: define {{.+}}[[CALL02]]
4468*67e74705SXin Li // CK27: define {{.+}}[[CALL03]]
4469*67e74705SXin Li // CK27: define {{.+}}[[CALL04]]
4470*67e74705SXin Li // CK27: define {{.+}}[[CALL05]]
4471*67e74705SXin Li // CK27: define {{.+}}[[CALL06]]
4472*67e74705SXin Li // CK27: define {{.+}}[[CALL07]]
4473*67e74705SXin Li #endif
4474*67e74705SXin Li #endif
4475