14304e9d1SMichael Kruse // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
24304e9d1SMichael Kruse 
34304e9d1SMichael Kruse // expected-no-diagnostics
44304e9d1SMichael Kruse #ifndef HEADER
54304e9d1SMichael Kruse #define HEADER
64304e9d1SMichael Kruse 
7d47b9438SMichael Kruse ///==========================================================================///
8d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK0 --check-prefix CK0-64 %s
9d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
10d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK0 --check-prefix CK0-64 %s
11d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK0 --check-prefix CK0-32 %s
12d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
13d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK0 --check-prefix CK0-32 %s
14d47b9438SMichael Kruse 
15d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -verify -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
16d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
17d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
18d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -verify -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
19d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
20d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK0 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
21d47b9438SMichael Kruse 
22d47b9438SMichael Kruse #ifdef CK0
23537b16e9SGeorge Rokos // Mapper function code generation and runtime interface.
24d47b9438SMichael Kruse 
25d47b9438SMichael Kruse // CK0-LABEL: @.__omp_offloading_{{.*}}foo{{.*}}.region_id = weak constant i8 0
26d47b9438SMichael Kruse // CK0-64: [[SIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
27d47b9438SMichael Kruse // CK0-32: [[SIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
28d47b9438SMichael Kruse // CK0: [[TYPES:@.+]] = {{.+}}constant [1 x i64] [i64 35]
29537b16e9SGeorge Rokos // CK0-64: [[NWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
30537b16e9SGeorge Rokos // CK0-32: [[NWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
31537b16e9SGeorge Rokos // CK0: [[NWTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 35]
32537b16e9SGeorge Rokos // CK0-64: [[TEAMSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
33537b16e9SGeorge Rokos // CK0-32: [[TEAMSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
34537b16e9SGeorge Rokos // CK0: [[TEAMTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 33]
35537b16e9SGeorge Rokos // CK0-64: [[TEAMNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
36537b16e9SGeorge Rokos // CK0-32: [[TEAMNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
37537b16e9SGeorge Rokos // CK0: [[TEAMNWTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 33]
38537b16e9SGeorge Rokos // CK0-64: [[EDSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
39537b16e9SGeorge Rokos // CK0-32: [[EDSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
40537b16e9SGeorge Rokos // CK0: [[EDTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 33]
41537b16e9SGeorge Rokos // CK0-64: [[EDNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
42537b16e9SGeorge Rokos // CK0-32: [[EDNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
43537b16e9SGeorge Rokos // CK0: [[EDNWTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 33]
44537b16e9SGeorge Rokos // CK0-64: [[EXDSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
45537b16e9SGeorge Rokos // CK0-32: [[EXDSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
46537b16e9SGeorge Rokos // CK0: [[EXDTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 34]
47537b16e9SGeorge Rokos // CK0-64: [[EXDNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
48537b16e9SGeorge Rokos // CK0-32: [[EXDNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
49537b16e9SGeorge Rokos // CK0: [[EXDNWTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 34]
50d47b9438SMichael Kruse // CK0-64: [[TSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
51d47b9438SMichael Kruse // CK0-32: [[TSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
52d47b9438SMichael Kruse // CK0: [[TTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 33]
53d47b9438SMichael Kruse // CK0-64: [[FSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
54d47b9438SMichael Kruse // CK0-32: [[FSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
55d47b9438SMichael Kruse // CK0: [[FTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 34]
56537b16e9SGeorge Rokos // CK0-64: [[FNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
57537b16e9SGeorge Rokos // CK0-32: [[FNWSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
58537b16e9SGeorge Rokos // CK0: [[FNWTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 34]
59d47b9438SMichael Kruse 
604304e9d1SMichael Kruse class C {
614304e9d1SMichael Kruse public:
624304e9d1SMichael Kruse   int a;
63d47b9438SMichael Kruse   double *b;
644304e9d1SMichael Kruse };
654304e9d1SMichael Kruse 
66d47b9438SMichael Kruse #pragma omp declare mapper(id: C s) map(s.a, s.b[0:2])
674304e9d1SMichael Kruse 
68537b16e9SGeorge Rokos // CK0: define {{.*}}void [[MPRFUNC:@[.]omp_mapper[.].*C[.]id]](i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}})
69d47b9438SMichael Kruse // CK0: store i8* %{{[^,]+}}, i8** [[HANDLEADDR:%[^,]+]]
70d47b9438SMichael Kruse // CK0: store i8* %{{[^,]+}}, i8** [[BPTRADDR:%[^,]+]]
71d47b9438SMichael Kruse // CK0: store i8* %{{[^,]+}}, i8** [[VPTRADDR:%[^,]+]]
72d47b9438SMichael Kruse // CK0: store i64 %{{[^,]+}}, i{{64|32}}* [[SIZEADDR:%[^,]+]]
73d47b9438SMichael Kruse // CK0: store i64 %{{[^,]+}}, i64* [[TYPEADDR:%[^,]+]]
74537b16e9SGeorge Rokos // CK0-DAG: [[BYTESIZE:%.+]] = load i64, i64* [[SIZEADDR]]
75537b16e9SGeorge Rokos // CK0-64-DAG: [[SIZE:%.+]] = udiv exact i64 [[BYTESIZE]], 16
76537b16e9SGeorge Rokos // CK0-32-DAG: [[SIZE:%.+]] = udiv exact i64 [[BYTESIZE]], 8
77d47b9438SMichael Kruse // CK0-DAG: [[TYPE:%.+]] = load i64, i64* [[TYPEADDR]]
78d47b9438SMichael Kruse // CK0-DAG: [[HANDLE:%.+]] = load i8*, i8** [[HANDLEADDR]]
79d47b9438SMichael Kruse // CK0-DAG: [[PTRBEGIN:%.+]] = bitcast i8** [[VPTRADDR]] to %class.C**
80d47b9438SMichael Kruse // CK0-DAG: [[PTREND:%.+]] = getelementptr %class.C*, %class.C** [[PTRBEGIN]], i64 [[SIZE]]
81d47b9438SMichael Kruse // CK0-DAG: [[BPTR:%.+]] = load i8*, i8** [[BPTRADDR]]
82d47b9438SMichael Kruse // CK0-DAG: [[BEGIN:%.+]] = load i8*, i8** [[VPTRADDR]]
83d47b9438SMichael Kruse // CK0: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
84d47b9438SMichael Kruse // CK0: br i1 [[ISARRAY]], label %[[INITEVALDEL:[^,]+]], label %[[LHEAD:[^,]+]]
854304e9d1SMichael Kruse 
86d47b9438SMichael Kruse // CK0: [[INITEVALDEL]]
87d47b9438SMichael Kruse // CK0: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
88d47b9438SMichael Kruse // CK0: [[ISNOTDEL:%.+]] = icmp eq i64 [[TYPEDEL]], 0
89d47b9438SMichael Kruse // CK0: br i1 [[ISNOTDEL]], label %[[INIT:[^,]+]], label %[[LHEAD:[^,]+]]
90d47b9438SMichael Kruse // CK0: [[INIT]]
91d47b9438SMichael Kruse // CK0-64-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16
92d47b9438SMichael Kruse // CK0-32-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 8
93d47b9438SMichael Kruse // CK0-DAG: [[ITYPE:%.+]] = and i64 [[TYPE]], -4
94d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[ITYPE]])
95d47b9438SMichael Kruse // CK0: br label %[[LHEAD:[^,]+]]
964304e9d1SMichael Kruse 
97d47b9438SMichael Kruse // CK0: [[LHEAD]]
98d47b9438SMichael Kruse // CK0: [[ISEMPTY:%.+]] = icmp eq %class.C** [[PTRBEGIN]], [[PTREND]]
99d47b9438SMichael Kruse // CK0: br i1 [[ISEMPTY]], label %[[DONE:[^,]+]], label %[[LBODY:[^,]+]]
100d47b9438SMichael Kruse // CK0: [[LBODY]]
101d47b9438SMichael Kruse // CK0: [[PTR:%.+]] = phi %class.C** [ [[PTRBEGIN]], %[[LHEAD]] ], [ [[PTRNEXT:%.+]], %[[LCORRECT:[^,]+]] ]
102d47b9438SMichael Kruse // CK0: [[OBJ:%.+]] = load %class.C*, %class.C** [[PTR]]
103d47b9438SMichael Kruse // CK0-DAG: [[ABEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 0
104d47b9438SMichael Kruse // CK0-DAG: [[BBEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1
105d47b9438SMichael Kruse // CK0-DAG: [[BBEGIN2:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1
106d47b9438SMichael Kruse // CK0-DAG: [[BARRBEGIN:%.+]] = load double*, double** [[BBEGIN2]]
107d47b9438SMichael Kruse // CK0-DAG: [[BARRBEGINGEP:%.+]] = getelementptr inbounds double, double* [[BARRBEGIN]], i[[sz:64|32]] 0
108d47b9438SMichael Kruse // CK0-DAG: [[BEND:%.+]] = getelementptr double*, double** [[BBEGIN]], i32 1
109d47b9438SMichael Kruse // CK0-DAG: [[ABEGINV:%.+]] = bitcast i32* [[ABEGIN]] to i8*
110d47b9438SMichael Kruse // CK0-DAG: [[BENDV:%.+]] = bitcast double** [[BEND]] to i8*
111d47b9438SMichael Kruse // CK0-DAG: [[ABEGINI:%.+]] = ptrtoint i8* [[ABEGINV]] to i64
112d47b9438SMichael Kruse // CK0-DAG: [[BENDI:%.+]] = ptrtoint i8* [[BENDV]] to i64
113d47b9438SMichael Kruse // CK0-DAG: [[CSIZE:%.+]] = sub i64 [[BENDI]], [[ABEGINI]]
114d47b9438SMichael Kruse // CK0-DAG: [[CUSIZE:%.+]] = sdiv exact i64 [[CSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
115d47b9438SMichael Kruse // CK0-DAG: [[BPTRADDR0BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
116d47b9438SMichael Kruse // CK0-DAG: [[PTRADDR0BC:%.+]] = bitcast i32* [[ABEGIN]] to i8*
117d47b9438SMichael Kruse // CK0-DAG: [[PRESIZE:%.+]] = call i64 @__tgt_mapper_num_components(i8* [[HANDLE]])
118d47b9438SMichael Kruse // CK0-DAG: [[SHIPRESIZE:%.+]] = shl i64 [[PRESIZE]], 48
119d47b9438SMichael Kruse // CK0-DAG: br label %[[MEMBER:[^,]+]]
120d47b9438SMichael Kruse // CK0-DAG: [[MEMBER]]
121d47b9438SMichael Kruse // CK0-DAG: br i1 true, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
122d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOM]]
123d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 32, [[SHIPRESIZE]]
124d47b9438SMichael Kruse // CK0-DAG: br label %[[LTYPE]]
125d47b9438SMichael Kruse // CK0-DAG: [[LTYPE]]
126d47b9438SMichael Kruse // CK0-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 32, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
127d47b9438SMichael Kruse // CK0-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
128d47b9438SMichael Kruse // CK0-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
129d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
130d47b9438SMichael Kruse // CK0-DAG: [[ALLOC]]
131d47b9438SMichael Kruse // CK0-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
132d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND:[^,]+]]
133d47b9438SMichael Kruse // CK0-DAG: [[ALLOCELSE]]
134d47b9438SMichael Kruse // CK0-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
135d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
136d47b9438SMichael Kruse // CK0-DAG: [[TO]]
137d47b9438SMichael Kruse // CK0-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
138d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]]
139d47b9438SMichael Kruse // CK0-DAG: [[TOELSE]]
140d47b9438SMichael Kruse // CK0-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
141d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
142d47b9438SMichael Kruse // CK0-DAG: [[FROM]]
143d47b9438SMichael Kruse // CK0-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
144d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]]
145d47b9438SMichael Kruse // CK0-DAG: [[TYEND]]
146d47b9438SMichael Kruse // CK0-DAG: [[PHITYPE0:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
147d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR0BC]], i8* [[PTRADDR0BC]], i64 [[CUSIZE]], i64 [[PHITYPE0]])
148d47b9438SMichael Kruse // CK0-DAG: [[BPTRADDR1BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
149d47b9438SMichael Kruse // CK0-DAG: [[PTRADDR1BC:%.+]] = bitcast i32* [[ABEGIN]] to i8*
150d47b9438SMichael Kruse // CK0-DAG: br label %[[MEMBER:[^,]+]]
151d47b9438SMichael Kruse // CK0-DAG: [[MEMBER]]
152d47b9438SMichael Kruse // CK0-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
153d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOM]]
154d47b9438SMichael Kruse // 281474976710659 == 0x1,000,000,003
155d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710659, [[SHIPRESIZE]]
156d47b9438SMichael Kruse // CK0-DAG: br label %[[LTYPE]]
157d47b9438SMichael Kruse // CK0-DAG: [[LTYPE]]
158d47b9438SMichael Kruse // CK0-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710659, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
159d47b9438SMichael Kruse // CK0-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
160d47b9438SMichael Kruse // CK0-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
161d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
162d47b9438SMichael Kruse // CK0-DAG: [[ALLOC]]
163d47b9438SMichael Kruse // CK0-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
164d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND:[^,]+]]
165d47b9438SMichael Kruse // CK0-DAG: [[ALLOCELSE]]
166d47b9438SMichael Kruse // CK0-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
167d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
168d47b9438SMichael Kruse // CK0-DAG: [[TO]]
169d47b9438SMichael Kruse // CK0-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
170d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]]
171d47b9438SMichael Kruse // CK0-DAG: [[TOELSE]]
172d47b9438SMichael Kruse // CK0-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
173d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
174d47b9438SMichael Kruse // CK0-DAG: [[FROM]]
175d47b9438SMichael Kruse // CK0-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
176d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]]
177d47b9438SMichael Kruse // CK0-DAG: [[TYEND]]
178d47b9438SMichael Kruse // CK0-DAG: [[TYPE1:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
179d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR1BC]], i8* [[PTRADDR1BC]], i64 4, i64 [[TYPE1]])
180d47b9438SMichael Kruse // CK0-DAG: [[BPTRADDR2BC:%.+]] = bitcast double** [[BBEGIN]] to i8*
181d47b9438SMichael Kruse // CK0-DAG: [[PTRADDR2BC:%.+]] = bitcast double* [[BARRBEGINGEP]] to i8*
182d47b9438SMichael Kruse // CK0-DAG: br label %[[MEMBER:[^,]+]]
183d47b9438SMichael Kruse // CK0-DAG: [[MEMBER]]
184d47b9438SMichael Kruse // CK0-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
185d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOM]]
186d47b9438SMichael Kruse // 281474976710675 == 0x1,000,000,013
187d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710675, [[SHIPRESIZE]]
188d47b9438SMichael Kruse // CK0-DAG: br label %[[LTYPE]]
189d47b9438SMichael Kruse // CK0-DAG: [[LTYPE]]
190d47b9438SMichael Kruse // CK0-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710675, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
191d47b9438SMichael Kruse // CK0-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
192d47b9438SMichael Kruse // CK0-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
193d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
194d47b9438SMichael Kruse // CK0-DAG: [[ALLOC]]
195d47b9438SMichael Kruse // CK0-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
196d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND:[^,]+]]
197d47b9438SMichael Kruse // CK0-DAG: [[ALLOCELSE]]
198d47b9438SMichael Kruse // CK0-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
199d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
200d47b9438SMichael Kruse // CK0-DAG: [[TO]]
201d47b9438SMichael Kruse // CK0-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
202d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]]
203d47b9438SMichael Kruse // CK0-DAG: [[TOELSE]]
204d47b9438SMichael Kruse // CK0-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
205d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
206d47b9438SMichael Kruse // CK0-DAG: [[FROM]]
207d47b9438SMichael Kruse // CK0-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
208d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]]
209d47b9438SMichael Kruse // CK0-DAG: [[TYEND]]
210d47b9438SMichael Kruse // CK0-DAG: [[TYPE2:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
211d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR2BC]], i8* [[PTRADDR2BC]], i64 16, i64 [[TYPE2]])
212d47b9438SMichael Kruse // CK0: [[PTRNEXT]] = getelementptr %class.C*, %class.C** [[PTR]], i32 1
213d47b9438SMichael Kruse // CK0: [[ISDONE:%.+]] = icmp eq %class.C** [[PTRNEXT]], [[PTREND]]
214d47b9438SMichael Kruse // CK0: br i1 [[ISDONE]], label %[[LEXIT:[^,]+]], label %[[LBODY]]
215d47b9438SMichael Kruse 
216d47b9438SMichael Kruse // CK0: [[LEXIT]]
217d47b9438SMichael Kruse // CK0: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
218d47b9438SMichael Kruse // CK0: br i1 [[ISARRAY]], label %[[EVALDEL:[^,]+]], label %[[DONE]]
219d47b9438SMichael Kruse // CK0: [[EVALDEL]]
220d47b9438SMichael Kruse // CK0: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
221d47b9438SMichael Kruse // CK0: [[ISDEL:%.+]] = icmp ne i64 [[TYPEDEL]], 0
222d47b9438SMichael Kruse // CK0: br i1 [[ISDEL]], label %[[DEL:[^,]+]], label %[[DONE]]
223d47b9438SMichael Kruse // CK0: [[DEL]]
224d47b9438SMichael Kruse // CK0-64-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16
225d47b9438SMichael Kruse // CK0-32-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 8
226d47b9438SMichael Kruse // CK0-DAG: [[DTYPE:%.+]] = and i64 [[TYPE]], -4
227d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[DTYPE]])
228d47b9438SMichael Kruse // CK0: br label %[[DONE]]
229d47b9438SMichael Kruse // CK0: [[DONE]]
230d47b9438SMichael Kruse // CK0: ret void
231d47b9438SMichael Kruse 
232d47b9438SMichael Kruse 
233d47b9438SMichael Kruse // CK0-LABEL: define {{.*}}void @{{.*}}foo{{.*}}
2344304e9d1SMichael Kruse void foo(int a){
2354304e9d1SMichael Kruse   int i = a;
2364304e9d1SMichael Kruse   C c;
2374304e9d1SMichael Kruse   c.a = a;
2384304e9d1SMichael Kruse 
239537b16e9SGeorge Rokos   // CK0-DAG: call i32 @__tgt_target_mapper(i64 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
240d47b9438SMichael Kruse   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
241d47b9438SMichael Kruse   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
242537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
243d47b9438SMichael Kruse   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
244d47b9438SMichael Kruse   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
245537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
246d47b9438SMichael Kruse   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
247d47b9438SMichael Kruse   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
248d47b9438SMichael Kruse   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
249d47b9438SMichael Kruse   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
250537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
251d47b9438SMichael Kruse   // CK0: call void [[KERNEL:@.+]](%class.C* [[VAL]])
2524304e9d1SMichael Kruse   #pragma omp target map(mapper(id),tofrom: c)
2534304e9d1SMichael Kruse   {
2544304e9d1SMichael Kruse     ++c.a;
2554304e9d1SMichael Kruse   }
25601f670dfSMichael Kruse 
257537b16e9SGeorge Rokos   // CK0-DAG: call i32 @__tgt_target_nowait_mapper(i64 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[NWSIZES]]{{.+}}, {{.+}}[[NWTYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
258537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
259537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
260537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
261537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
262537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
263537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
264537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
265537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
266537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
267537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
268537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
269537b16e9SGeorge Rokos   // CK0: call void [[KERNEL:@.+]](%class.C* [[VAL]])
270537b16e9SGeorge Rokos   #pragma omp target map(mapper(id),tofrom: c) nowait
271537b16e9SGeorge Rokos   {
272537b16e9SGeorge Rokos     ++c.a;
273537b16e9SGeorge Rokos   }
274537b16e9SGeorge Rokos 
275537b16e9SGeorge Rokos   // CK0-DAG: call i32 @__tgt_target_teams_mapper(i64 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[TEAMSIZES]]{{.+}}, {{.+}}[[TEAMTYPES]]{{.+}}, i8** [[MPRGEP:%.+]], i32 0, i32 0)
276537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
277537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
278537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
279537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
280537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
281537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
282537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
283537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
284537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
285537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
286537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
287537b16e9SGeorge Rokos   // CK0: call void [[KERNEL:@.+]](%class.C* [[VAL]])
288537b16e9SGeorge Rokos   #pragma omp target teams map(mapper(id),to: c)
289537b16e9SGeorge Rokos   {
290537b16e9SGeorge Rokos     ++c.a;
291537b16e9SGeorge Rokos   }
292537b16e9SGeorge Rokos 
293537b16e9SGeorge Rokos   // CK0-DAG: call i32 @__tgt_target_teams_nowait_mapper(i64 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[TEAMNWSIZES]]{{.+}}, {{.+}}[[TEAMNWTYPES]]{{.+}}, i8** [[MPRGEP:%.+]], i32 0, i32 0)
294537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
295537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
296537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
297537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
298537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
299537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
300537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
301537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
302537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
303537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
304537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
305537b16e9SGeorge Rokos   // CK0: call void [[KERNEL:@.+]](%class.C* [[VAL]])
306537b16e9SGeorge Rokos   #pragma omp target teams map(mapper(id),to: c) nowait
307537b16e9SGeorge Rokos   {
308537b16e9SGeorge Rokos     ++c.a;
309537b16e9SGeorge Rokos   }
310537b16e9SGeorge Rokos 
311537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_begin_mapper(i64 {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[EDSIZES]]{{.+}}, {{.+}}[[EDTYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
312537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
313537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
314537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
315537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
316537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
317537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
318537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
319537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
320537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
321537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
322537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
323537b16e9SGeorge Rokos   #pragma omp target enter data map(mapper(id),to: c)
324537b16e9SGeorge Rokos 
325537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_begin_nowait_mapper(i64 {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[EDNWSIZES]]{{.+}}, {{.+}}[[EDNWTYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
326537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
327537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
328537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
329537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
330537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
331537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
332537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
333537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
334537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
335537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
336537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
337537b16e9SGeorge Rokos   #pragma omp target enter data map(mapper(id),to: c) nowait
338537b16e9SGeorge Rokos 
339537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_end_mapper(i64 {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[EXDSIZES]]{{.+}}, {{.+}}[[EXDTYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
340537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
341537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
342537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
343537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
344537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
345537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
346537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
347537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
348537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
349537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
350537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
351537b16e9SGeorge Rokos   #pragma omp target exit data map(mapper(id),from: c)
352537b16e9SGeorge Rokos 
353537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_end_nowait_mapper(i64 {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[EXDNWSIZES]]{{.+}}, {{.+}}[[EXDNWTYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
354537b16e9SGeorge Rokos   // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
355537b16e9SGeorge Rokos   // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
356537b16e9SGeorge Rokos   // CK0-DAG: [[MPRGEP]] = bitcast [1 x i8*]* [[MPR:%[^,]+]] to i8**
357537b16e9SGeorge Rokos   // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
358537b16e9SGeorge Rokos   // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
359537b16e9SGeorge Rokos   // CK0-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i[[sz]] 0, i[[sz]] 0
360537b16e9SGeorge Rokos   // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C**
361537b16e9SGeorge Rokos   // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
362537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]]
363537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]]
364537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR1]]
365537b16e9SGeorge Rokos   #pragma omp target exit data map(mapper(id),from: c) nowait
366537b16e9SGeorge Rokos 
367537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_update_mapper(i64 -1, i32 1, i8** [[TGEPBP:%.+]], i8** [[TGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[TSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[TTYPES]]{{.+}}, i8** [[TMPRGEP:%.+]])
368d47b9438SMichael Kruse   // CK0-DAG: [[TGEPBP]] = getelementptr inbounds {{.+}}[[TBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
369d47b9438SMichael Kruse   // CK0-DAG: [[TGEPP]] = getelementptr inbounds {{.+}}[[TP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
370537b16e9SGeorge Rokos   // CK0-DAG: [[TMPRGEP]] = bitcast [1 x i8*]* [[TMPR:%[^,]+]] to i8**
371d47b9438SMichael Kruse   // CK0-DAG: [[TBP0:%.+]] = getelementptr inbounds {{.+}}[[TBP]], i{{.+}} 0, i{{.+}} 0
372d47b9438SMichael Kruse   // CK0-DAG: [[TP0:%.+]] = getelementptr inbounds {{.+}}[[TP]], i{{.+}} 0, i{{.+}} 0
373537b16e9SGeorge Rokos   // CK0-DAG: [[TMPR1:%.+]] = getelementptr inbounds {{.+}}[[TMPR]], i[[sz]] 0, i[[sz]] 0
374d47b9438SMichael Kruse   // CK0-DAG: [[TCBP0:%.+]] = bitcast i8** [[TBP0]] to %class.C**
375d47b9438SMichael Kruse   // CK0-DAG: [[TCP0:%.+]] = bitcast i8** [[TP0]] to %class.C**
376d47b9438SMichael Kruse   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[TCBP0]]
377d47b9438SMichael Kruse   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[TCP0]]
378537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[TMPR1]]
37901f670dfSMichael Kruse   #pragma omp target update to(mapper(id): c)
3800336c75cSMichael Kruse 
381537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_update_mapper(i64 -1, i32 1, i8** [[FGEPBP:%.+]], i8** [[FGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[FSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[FTYPES]]{{.+}}, i8** [[FMPRGEP:%.+]])
382d47b9438SMichael Kruse   // CK0-DAG: [[FGEPBP]] = getelementptr inbounds {{.+}}[[FBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
383d47b9438SMichael Kruse   // CK0-DAG: [[FGEPP]] = getelementptr inbounds {{.+}}[[FP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
384537b16e9SGeorge Rokos   // CK0-DAG: [[FMPRGEP]] = bitcast [1 x i8*]* [[FMPR:%[^,]+]] to i8**
385d47b9438SMichael Kruse   // CK0-DAG: [[FBP0:%.+]] = getelementptr inbounds {{.+}}[[FBP]], i{{.+}} 0, i{{.+}} 0
386d47b9438SMichael Kruse   // CK0-DAG: [[FP0:%.+]] = getelementptr inbounds {{.+}}[[FP]], i{{.+}} 0, i{{.+}} 0
387537b16e9SGeorge Rokos   // CK0-DAG: [[FMPR1:%.+]] = getelementptr inbounds {{.+}}[[FMPR]], i[[sz]] 0, i[[sz]] 0
388d47b9438SMichael Kruse   // CK0-DAG: [[FCBP0:%.+]] = bitcast i8** [[FBP0]] to %class.C**
389d47b9438SMichael Kruse   // CK0-DAG: [[FCP0:%.+]] = bitcast i8** [[FP0]] to %class.C**
390d47b9438SMichael Kruse   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[FCBP0]]
391d47b9438SMichael Kruse   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[FCP0]]
392537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[FMPR1]]
3930336c75cSMichael Kruse   #pragma omp target update from(mapper(id): c)
394537b16e9SGeorge Rokos 
395537b16e9SGeorge Rokos   // CK0-DAG: call void @__tgt_target_data_update_nowait_mapper(i64 -1, i32 1, i8** [[FGEPBP:%.+]], i8** [[FGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[FNWSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[FNWTYPES]]{{.+}}, i8** [[FMPRGEP:%.+]])
396537b16e9SGeorge Rokos   // CK0-DAG: [[FGEPBP]] = getelementptr inbounds {{.+}}[[FBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
397537b16e9SGeorge Rokos   // CK0-DAG: [[FGEPP]] = getelementptr inbounds {{.+}}[[FP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
398537b16e9SGeorge Rokos   // CK0-DAG: [[FMPRGEP]] = bitcast [1 x i8*]* [[FMPR:%[^,]+]] to i8**
399537b16e9SGeorge Rokos   // CK0-DAG: [[FBP0:%.+]] = getelementptr inbounds {{.+}}[[FBP]], i{{.+}} 0, i{{.+}} 0
400537b16e9SGeorge Rokos   // CK0-DAG: [[FP0:%.+]] = getelementptr inbounds {{.+}}[[FP]], i{{.+}} 0, i{{.+}} 0
401537b16e9SGeorge Rokos   // CK0-DAG: [[FMPR1:%.+]] = getelementptr inbounds {{.+}}[[FMPR]], i[[sz]] 0, i[[sz]] 0
402537b16e9SGeorge Rokos   // CK0-DAG: [[FCBP0:%.+]] = bitcast i8** [[FBP0]] to %class.C**
403537b16e9SGeorge Rokos   // CK0-DAG: [[FCP0:%.+]] = bitcast i8** [[FP0]] to %class.C**
404537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[FCBP0]]
405537b16e9SGeorge Rokos   // CK0-DAG: store %class.C* [[VAL]], %class.C** [[FCP0]]
406537b16e9SGeorge Rokos   // CK0-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[FMPR1]]
407537b16e9SGeorge Rokos   #pragma omp target update from(mapper(id): c) nowait
4084304e9d1SMichael Kruse }
4094304e9d1SMichael Kruse 
4104304e9d1SMichael Kruse 
411d47b9438SMichael Kruse // CK0: define internal void [[KERNEL]](%class.C* {{.+}}[[ARG:%.+]])
412d47b9438SMichael Kruse // CK0: [[ADDR:%.+]] = alloca %class.C*,
413d47b9438SMichael Kruse // CK0: store %class.C* [[ARG]], %class.C** [[ADDR]]
414d47b9438SMichael Kruse // CK0: [[CADDR:%.+]] = load %class.C*, %class.C** [[ADDR]]
415d47b9438SMichael Kruse // CK0: [[CAADDR:%.+]] = getelementptr inbounds %class.C, %class.C* [[CADDR]], i32 0, i32 0
416d47b9438SMichael Kruse // CK0: [[VAL:%[^,]+]] = load i32, i32* [[CAADDR]]
417d47b9438SMichael Kruse // CK0: {{.+}} = add nsw i32 [[VAL]], 1
418d47b9438SMichael Kruse // CK0: }
419d47b9438SMichael Kruse 
420537b16e9SGeorge Rokos #endif // CK0
421d47b9438SMichael Kruse 
422d47b9438SMichael Kruse 
423d47b9438SMichael Kruse ///==========================================================================///
424d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK1 --check-prefix CK1-64 %s
425d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
426d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK1 --check-prefix CK1-64 %s
427d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK1 --check-prefix CK1-32 %s
428d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
429d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK1 --check-prefix CK1-32 %s
430d47b9438SMichael Kruse 
431d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -verify -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
432d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
433d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
434d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -verify -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
435d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
436d47b9438SMichael Kruse // RUN: %clang_cc1 -DCK1 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
437d47b9438SMichael Kruse 
438d47b9438SMichael Kruse #ifdef CK1
439537b16e9SGeorge Rokos // C++ template
440d47b9438SMichael Kruse 
441d47b9438SMichael Kruse template <class T>
442d47b9438SMichael Kruse class C {
443d47b9438SMichael Kruse public:
444d47b9438SMichael Kruse   T a;
445d47b9438SMichael Kruse };
446d47b9438SMichael Kruse 
447d47b9438SMichael Kruse #pragma omp declare mapper(id: C<int> s) map(s.a)
448d47b9438SMichael Kruse 
449d47b9438SMichael Kruse // CK1-LABEL: define {{.*}}void @.omp_mapper.{{.*}}C{{.*}}.id{{.*}}(i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}})
450d47b9438SMichael Kruse // CK1: store i8* %{{[^,]+}}, i8** [[HANDLEADDR:%[^,]+]]
451d47b9438SMichael Kruse // CK1: store i8* %{{[^,]+}}, i8** [[BPTRADDR:%[^,]+]]
452d47b9438SMichael Kruse // CK1: store i8* %{{[^,]+}}, i8** [[VPTRADDR:%[^,]+]]
453d47b9438SMichael Kruse // CK1: store i64 %{{[^,]+}}, i{{64|32}}* [[SIZEADDR:%[^,]+]]
454d47b9438SMichael Kruse // CK1: store i64 %{{[^,]+}}, i64* [[TYPEADDR:%[^,]+]]
455537b16e9SGeorge Rokos // CK1-DAG: [[BYTESIZE:%.+]] = load i64, i64* [[SIZEADDR]]
456537b16e9SGeorge Rokos // CK1-DAG: [[SIZE:%.+]] = udiv exact i64 [[BYTESIZE]], 4
457d47b9438SMichael Kruse // CK1-DAG: [[TYPE:%.+]] = load i64, i64* [[TYPEADDR]]
458d47b9438SMichael Kruse // CK1-DAG: [[HANDLE:%.+]] = load i8*, i8** [[HANDLEADDR]]
459d47b9438SMichael Kruse // CK1-DAG: [[PTRBEGIN:%.+]] = bitcast i8** [[VPTRADDR]] to %class.C**
460d47b9438SMichael Kruse // CK1-DAG: [[PTREND:%.+]] = getelementptr %class.C*, %class.C** [[PTRBEGIN]], i64 [[SIZE]]
461d47b9438SMichael Kruse // CK1-DAG: [[BPTR:%.+]] = load i8*, i8** [[BPTRADDR]]
462d47b9438SMichael Kruse // CK1-DAG: [[BEGIN:%.+]] = load i8*, i8** [[VPTRADDR]]
463d47b9438SMichael Kruse // CK1: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
464d47b9438SMichael Kruse // CK1: br i1 [[ISARRAY]], label %[[INITEVALDEL:[^,]+]], label %[[LHEAD:[^,]+]]
465d47b9438SMichael Kruse 
466d47b9438SMichael Kruse // CK1: [[INITEVALDEL]]
467d47b9438SMichael Kruse // CK1: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
468d47b9438SMichael Kruse // CK1: [[ISNOTDEL:%.+]] = icmp eq i64 [[TYPEDEL]], 0
469d47b9438SMichael Kruse // CK1: br i1 [[ISNOTDEL]], label %[[INIT:[^,]+]], label %[[LHEAD:[^,]+]]
470d47b9438SMichael Kruse // CK1: [[INIT]]
471d47b9438SMichael Kruse // CK1-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 4
472d47b9438SMichael Kruse // CK1-DAG: [[ITYPE:%.+]] = and i64 [[TYPE]], -4
473d47b9438SMichael Kruse // CK1: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[ITYPE]])
474d47b9438SMichael Kruse // CK1: br label %[[LHEAD:[^,]+]]
475d47b9438SMichael Kruse 
476d47b9438SMichael Kruse // CK1: [[LHEAD]]
477d47b9438SMichael Kruse // CK1: [[ISEMPTY:%.+]] = icmp eq %class.C** [[PTRBEGIN]], [[PTREND]]
478d47b9438SMichael Kruse // CK1: br i1 [[ISEMPTY]], label %[[DONE:[^,]+]], label %[[LBODY:[^,]+]]
479d47b9438SMichael Kruse // CK1: [[LBODY]]
480d47b9438SMichael Kruse // CK1: [[PTR:%.+]] = phi %class.C** [ [[PTRBEGIN]], %[[LHEAD]] ], [ [[PTRNEXT:%.+]], %[[LCORRECT:[^,]+]] ]
481d47b9438SMichael Kruse // CK1: [[OBJ:%.+]] = load %class.C*, %class.C** [[PTR]]
482d47b9438SMichael Kruse // CK1-DAG: [[ABEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 0
483d47b9438SMichael Kruse // CK1-DAG: [[AEND:%.+]] = getelementptr i32, i32* [[ABEGIN]], i32 1
484d47b9438SMichael Kruse // CK1-DAG: [[ABEGINV:%.+]] = bitcast i32* [[ABEGIN]] to i8*
485d47b9438SMichael Kruse // CK1-DAG: [[AENDV:%.+]] = bitcast i32* [[AEND]] to i8*
486d47b9438SMichael Kruse // CK1-DAG: [[ABEGINI:%.+]] = ptrtoint i8* [[ABEGINV]] to i64
487d47b9438SMichael Kruse // CK1-DAG: [[AENDI:%.+]] = ptrtoint i8* [[AENDV]] to i64
488d47b9438SMichael Kruse // CK1-DAG: [[CSIZE:%.+]] = sub i64 [[AENDI]], [[ABEGINI]]
489d47b9438SMichael Kruse // CK1-DAG: [[CUSIZE:%.+]] = sdiv exact i64 [[CSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
490d47b9438SMichael Kruse // CK1-DAG: [[BPTRADDR0BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
491d47b9438SMichael Kruse // CK1-DAG: [[PTRADDR0BC:%.+]] = bitcast i32* [[ABEGIN]] to i8*
492d47b9438SMichael Kruse // CK1-DAG: [[PRESIZE:%.+]] = call i64 @__tgt_mapper_num_components(i8* [[HANDLE]])
493d47b9438SMichael Kruse // CK1-DAG: [[SHIPRESIZE:%.+]] = shl i64 [[PRESIZE]], 48
494d47b9438SMichael Kruse // CK1-DAG: br label %[[MEMBER:[^,]+]]
495d47b9438SMichael Kruse // CK1-DAG: [[MEMBER]]
496d47b9438SMichael Kruse // CK1-DAG: br i1 true, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
497d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOM]]
498d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 32, [[SHIPRESIZE]]
499d47b9438SMichael Kruse // CK1-DAG: br label %[[LTYPE]]
500d47b9438SMichael Kruse // CK1-DAG: [[LTYPE]]
501d47b9438SMichael Kruse // CK1-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 32, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
502d47b9438SMichael Kruse // CK1-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
503d47b9438SMichael Kruse // CK1-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
504d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
505d47b9438SMichael Kruse // CK1-DAG: [[ALLOC]]
506d47b9438SMichael Kruse // CK1-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
507d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND:[^,]+]]
508d47b9438SMichael Kruse // CK1-DAG: [[ALLOCELSE]]
509d47b9438SMichael Kruse // CK1-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
510d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
511d47b9438SMichael Kruse // CK1-DAG: [[TO]]
512d47b9438SMichael Kruse // CK1-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
513d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]]
514d47b9438SMichael Kruse // CK1-DAG: [[TOELSE]]
515d47b9438SMichael Kruse // CK1-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
516d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
517d47b9438SMichael Kruse // CK1-DAG: [[FROM]]
518d47b9438SMichael Kruse // CK1-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
519d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]]
520d47b9438SMichael Kruse // CK1-DAG: [[TYEND]]
521d47b9438SMichael Kruse // CK1-DAG: [[TYPE0:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
522d47b9438SMichael Kruse // CK1-64: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR0BC]], i8* [[PTRADDR0BC]], i64 [[CUSIZE]], i64 [[TYPE0]])
523d47b9438SMichael Kruse // CK1-DAG: [[BPTRADDR1BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
524d47b9438SMichael Kruse // CK1-DAG: [[PTRADDR1BC:%.+]] = bitcast i32* [[ABEGIN]] to i8*
525d47b9438SMichael Kruse // CK1-DAG: br label %[[MEMBER:[^,]+]]
526d47b9438SMichael Kruse // CK1-DAG: [[MEMBER]]
527d47b9438SMichael Kruse // CK1-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
528d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOM]]
529d47b9438SMichael Kruse // 281474976710659 == 0x1,000,000,003
530d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710659, [[SHIPRESIZE]]
531d47b9438SMichael Kruse // CK1-DAG: br label %[[LTYPE]]
532d47b9438SMichael Kruse // CK1-DAG: [[LTYPE]]
533d47b9438SMichael Kruse // CK1-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710659, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
534d47b9438SMichael Kruse // CK1-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
535d47b9438SMichael Kruse // CK1-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
536d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
537d47b9438SMichael Kruse // CK1-DAG: [[ALLOC]]
538d47b9438SMichael Kruse // CK1-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
539d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND:[^,]+]]
540d47b9438SMichael Kruse // CK1-DAG: [[ALLOCELSE]]
541d47b9438SMichael Kruse // CK1-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
542d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
543d47b9438SMichael Kruse // CK1-DAG: [[TO]]
544d47b9438SMichael Kruse // CK1-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
545d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]]
546d47b9438SMichael Kruse // CK1-DAG: [[TOELSE]]
547d47b9438SMichael Kruse // CK1-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
548d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
549d47b9438SMichael Kruse // CK1-DAG: [[FROM]]
550d47b9438SMichael Kruse // CK1-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
551d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]]
552d47b9438SMichael Kruse // CK1-DAG: [[TYEND]]
553d47b9438SMichael Kruse // CK1-DAG: [[TYPE1:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
554d47b9438SMichael Kruse // CK1: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR1BC]], i8* [[PTRADDR1BC]], i64 4, i64 [[TYPE1]])
555d47b9438SMichael Kruse // CK1: [[PTRNEXT]] = getelementptr %class.C*, %class.C** [[PTR]], i32 1
556d47b9438SMichael Kruse // CK1: [[ISDONE:%.+]] = icmp eq %class.C** [[PTRNEXT]], [[PTREND]]
557d47b9438SMichael Kruse // CK1: br i1 [[ISDONE]], label %[[LEXIT:[^,]+]], label %[[LBODY]]
558d47b9438SMichael Kruse 
559d47b9438SMichael Kruse // CK1: [[LEXIT]]
560d47b9438SMichael Kruse // CK1: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
561d47b9438SMichael Kruse // CK1: br i1 [[ISARRAY]], label %[[EVALDEL:[^,]+]], label %[[DONE]]
562d47b9438SMichael Kruse // CK1: [[EVALDEL]]
563d47b9438SMichael Kruse // CK1: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
564d47b9438SMichael Kruse // CK1: [[ISDEL:%.+]] = icmp ne i64 [[TYPEDEL]], 0
565d47b9438SMichael Kruse // CK1: br i1 [[ISDEL]], label %[[DEL:[^,]+]], label %[[DONE]]
566d47b9438SMichael Kruse // CK1: [[DEL]]
567d47b9438SMichael Kruse // CK1-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 4
568d47b9438SMichael Kruse // CK1-DAG: [[DTYPE:%.+]] = and i64 [[TYPE]], -4
569d47b9438SMichael Kruse // CK1: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[DTYPE]])
570d47b9438SMichael Kruse // CK1: br label %[[DONE]]
571d47b9438SMichael Kruse // CK1: [[DONE]]
572d47b9438SMichael Kruse // CK1: ret void
573d47b9438SMichael Kruse 
574537b16e9SGeorge Rokos #endif // CK1
5754304e9d1SMichael Kruse 
576537b16e9SGeorge Rokos 
577537b16e9SGeorge Rokos ///==========================================================================///
578537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK2 --check-prefix CK2-64 %s
579537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
580537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK2 --check-prefix CK2-64 %s
581537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK2 --check-prefix CK2-32 %s
582537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
583537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK2 --check-prefix CK2-32 %s
584537b16e9SGeorge Rokos 
585537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -verify -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
586537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
587537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
588537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -verify -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
589537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
590537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK2 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
591537b16e9SGeorge Rokos 
592537b16e9SGeorge Rokos #ifdef CK2
593537b16e9SGeorge Rokos // Nested mappers.
594537b16e9SGeorge Rokos 
595537b16e9SGeorge Rokos class B {
596537b16e9SGeorge Rokos public:
597537b16e9SGeorge Rokos   double a;
598537b16e9SGeorge Rokos };
599537b16e9SGeorge Rokos 
600537b16e9SGeorge Rokos class C {
601537b16e9SGeorge Rokos public:
602537b16e9SGeorge Rokos   double a;
603537b16e9SGeorge Rokos   B b;
604537b16e9SGeorge Rokos };
605537b16e9SGeorge Rokos 
606537b16e9SGeorge Rokos #pragma omp declare mapper(B s) map(s.a)
607537b16e9SGeorge Rokos 
608537b16e9SGeorge Rokos #pragma omp declare mapper(id: C s) map(s.b)
609537b16e9SGeorge Rokos 
610537b16e9SGeorge Rokos // CK2: define {{.*}}void [[BMPRFUNC:@[.]omp_mapper[.].*B[.]default]](i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}})
611537b16e9SGeorge Rokos 
612537b16e9SGeorge Rokos // CK2-LABEL: define {{.*}}void @.omp_mapper.{{.*}}C{{.*}}.id(i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}})
613537b16e9SGeorge Rokos // CK2: store i8* %{{[^,]+}}, i8** [[HANDLEADDR:%[^,]+]]
614537b16e9SGeorge Rokos // CK2: store i8* %{{[^,]+}}, i8** [[BPTRADDR:%[^,]+]]
615537b16e9SGeorge Rokos // CK2: store i8* %{{[^,]+}}, i8** [[VPTRADDR:%[^,]+]]
616537b16e9SGeorge Rokos // CK2: store i64 %{{[^,]+}}, i{{64|32}}* [[SIZEADDR:%[^,]+]]
617537b16e9SGeorge Rokos // CK2: store i64 %{{[^,]+}}, i64* [[TYPEADDR:%[^,]+]]
618537b16e9SGeorge Rokos // CK2-DAG: [[BYTESIZE:%.+]] = load i64, i64* [[SIZEADDR]]
619537b16e9SGeorge Rokos // CK2-DAG: [[SIZE:%.+]] = udiv exact i64 [[BYTESIZE]], 16
620537b16e9SGeorge Rokos // CK2-DAG: [[TYPE:%.+]] = load i64, i64* [[TYPEADDR]]
621537b16e9SGeorge Rokos // CK2-DAG: [[HANDLE:%.+]] = load i8*, i8** [[HANDLEADDR]]
622537b16e9SGeorge Rokos // CK2-DAG: [[PTRBEGIN:%.+]] = bitcast i8** [[VPTRADDR]] to %class.C**
623537b16e9SGeorge Rokos // CK2-DAG: [[PTREND:%.+]] = getelementptr %class.C*, %class.C** [[PTRBEGIN]], i64 [[SIZE]]
624537b16e9SGeorge Rokos // CK2-DAG: [[BPTR:%.+]] = load i8*, i8** [[BPTRADDR]]
625537b16e9SGeorge Rokos // CK2-DAG: [[BEGIN:%.+]] = load i8*, i8** [[VPTRADDR]]
626537b16e9SGeorge Rokos // CK2: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
627537b16e9SGeorge Rokos // CK2: br i1 [[ISARRAY]], label %[[INITEVALDEL:[^,]+]], label %[[LHEAD:[^,]+]]
628537b16e9SGeorge Rokos 
629537b16e9SGeorge Rokos // CK2: [[INITEVALDEL]]
630537b16e9SGeorge Rokos // CK2: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
631537b16e9SGeorge Rokos // CK2: [[ISNOTDEL:%.+]] = icmp eq i64 [[TYPEDEL]], 0
632537b16e9SGeorge Rokos // CK2: br i1 [[ISNOTDEL]], label %[[INIT:[^,]+]], label %[[LHEAD:[^,]+]]
633537b16e9SGeorge Rokos // CK2: [[INIT]]
634537b16e9SGeorge Rokos // CK2-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16
635537b16e9SGeorge Rokos // CK2-DAG: [[ITYPE:%.+]] = and i64 [[TYPE]], -4
636537b16e9SGeorge Rokos // CK2: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[ITYPE]])
637537b16e9SGeorge Rokos // CK2: br label %[[LHEAD:[^,]+]]
638537b16e9SGeorge Rokos 
639537b16e9SGeorge Rokos // CK2: [[LHEAD]]
640537b16e9SGeorge Rokos // CK2: [[ISEMPTY:%.+]] = icmp eq %class.C** [[PTRBEGIN]], [[PTREND]]
641537b16e9SGeorge Rokos // CK2: br i1 [[ISEMPTY]], label %[[DONE:[^,]+]], label %[[LBODY:[^,]+]]
642537b16e9SGeorge Rokos // CK2: [[LBODY]]
643537b16e9SGeorge Rokos // CK2: [[PTR:%.+]] = phi %class.C** [ [[PTRBEGIN]], %[[LHEAD]] ], [ [[PTRNEXT:%.+]], %[[LCORRECT:[^,]+]] ]
644537b16e9SGeorge Rokos // CK2: [[OBJ:%.+]] = load %class.C*, %class.C** [[PTR]]
645537b16e9SGeorge Rokos // CK2-DAG: [[BBEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1
646537b16e9SGeorge Rokos // CK2-DAG: [[BEND:%.+]] = getelementptr %class.B, %class.B* [[BBEGIN]], i32 1
647537b16e9SGeorge Rokos // CK2-DAG: [[BBEGINV:%.+]] = bitcast %class.B* [[BBEGIN]] to i8*
648537b16e9SGeorge Rokos // CK2-DAG: [[BENDV:%.+]] = bitcast %class.B* [[BEND]] to i8*
649537b16e9SGeorge Rokos // CK2-DAG: [[BBEGINI:%.+]] = ptrtoint i8* [[BBEGINV]] to i64
650537b16e9SGeorge Rokos // CK2-DAG: [[BENDI:%.+]] = ptrtoint i8* [[BENDV]] to i64
651537b16e9SGeorge Rokos // CK2-DAG: [[BSIZE:%.+]] = sub i64 [[BENDI]], [[BBEGINI]]
652537b16e9SGeorge Rokos // CK2-DAG: [[BUSIZE:%.+]] = sdiv exact i64 [[BSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
653537b16e9SGeorge Rokos // CK2-DAG: [[BPTRADDR0BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
654537b16e9SGeorge Rokos // CK2-DAG: [[PTRADDR0BC:%.+]] = bitcast %class.B* [[BBEGIN]] to i8*
655537b16e9SGeorge Rokos // CK2-DAG: [[PRESIZE:%.+]] = call i64 @__tgt_mapper_num_components(i8* [[HANDLE]])
656537b16e9SGeorge Rokos // CK2-DAG: [[SHIPRESIZE:%.+]] = shl i64 [[PRESIZE]], 48
657537b16e9SGeorge Rokos // CK2-DAG: br label %[[MEMBER:[^,]+]]
658537b16e9SGeorge Rokos // CK2-DAG: [[MEMBER]]
659537b16e9SGeorge Rokos // CK2-DAG: br i1 true, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
660537b16e9SGeorge Rokos // CK2-DAG: [[MEMBERCOM]]
661537b16e9SGeorge Rokos // CK2-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 32, [[SHIPRESIZE]]
662537b16e9SGeorge Rokos // CK2-DAG: br label %[[LTYPE]]
663537b16e9SGeorge Rokos // CK2-DAG: [[LTYPE]]
664537b16e9SGeorge Rokos // CK2-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 32, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
665537b16e9SGeorge Rokos // CK2-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
666537b16e9SGeorge Rokos // CK2-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
667537b16e9SGeorge Rokos // CK2-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
668537b16e9SGeorge Rokos // CK2-DAG: [[ALLOC]]
669537b16e9SGeorge Rokos // CK2-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
670537b16e9SGeorge Rokos // CK2-DAG: br label %[[TYEND:[^,]+]]
671537b16e9SGeorge Rokos // CK2-DAG: [[ALLOCELSE]]
672537b16e9SGeorge Rokos // CK2-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
673537b16e9SGeorge Rokos // CK2-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
674537b16e9SGeorge Rokos // CK2-DAG: [[TO]]
675537b16e9SGeorge Rokos // CK2-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
676537b16e9SGeorge Rokos // CK2-DAG: br label %[[TYEND]]
677537b16e9SGeorge Rokos // CK2-DAG: [[TOELSE]]
678537b16e9SGeorge Rokos // CK2-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
679537b16e9SGeorge Rokos // CK2-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
680537b16e9SGeorge Rokos // CK2-DAG: [[FROM]]
681537b16e9SGeorge Rokos // CK2-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
682537b16e9SGeorge Rokos // CK2-DAG: br label %[[TYEND]]
683537b16e9SGeorge Rokos // CK2-DAG: [[TYEND]]
684537b16e9SGeorge Rokos // CK2-DAG: [[TYPE0:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
685537b16e9SGeorge Rokos // CK2-64: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR0BC]], i8* [[PTRADDR0BC]], i64 [[BUSIZE]], i64 [[TYPE0]])
686537b16e9SGeorge Rokos // CK2-DAG: [[BPTRADDR1BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
687537b16e9SGeorge Rokos // CK2-DAG: [[PTRADDR1BC:%.+]] = bitcast %class.B* [[BBEGIN]] to i8*
688537b16e9SGeorge Rokos // CK2-DAG: br label %[[MEMBER:[^,]+]]
689537b16e9SGeorge Rokos // CK2-DAG: [[MEMBER]]
690537b16e9SGeorge Rokos // CK2-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
691537b16e9SGeorge Rokos // CK2-DAG: [[MEMBERCOM]]
692537b16e9SGeorge Rokos // 281474976710659 == 0x1,000,000,003
693537b16e9SGeorge Rokos // CK2-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710659, [[SHIPRESIZE]]
694537b16e9SGeorge Rokos // CK2-DAG: br label %[[LTYPE]]
695537b16e9SGeorge Rokos // CK2-DAG: [[LTYPE]]
696537b16e9SGeorge Rokos // CK2-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710659, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
697537b16e9SGeorge Rokos // CK2-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
698537b16e9SGeorge Rokos // CK2-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
699537b16e9SGeorge Rokos // CK2-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
700537b16e9SGeorge Rokos // CK2-DAG: [[ALLOC]]
701537b16e9SGeorge Rokos // CK2-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
702537b16e9SGeorge Rokos // CK2-DAG: br label %[[TYEND:[^,]+]]
703537b16e9SGeorge Rokos // CK2-DAG: [[ALLOCELSE]]
704537b16e9SGeorge Rokos // CK2-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
705537b16e9SGeorge Rokos // CK2-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
706537b16e9SGeorge Rokos // CK2-DAG: [[TO]]
707537b16e9SGeorge Rokos // CK2-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
708537b16e9SGeorge Rokos // CK2-DAG: br label %[[TYEND]]
709537b16e9SGeorge Rokos // CK2-DAG: [[TOELSE]]
710537b16e9SGeorge Rokos // CK2-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
711537b16e9SGeorge Rokos // CK2-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
712537b16e9SGeorge Rokos // CK2-DAG: [[FROM]]
713537b16e9SGeorge Rokos // CK2-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
714537b16e9SGeorge Rokos // CK2-DAG: br label %[[TYEND]]
715537b16e9SGeorge Rokos // CK2-DAG: [[TYEND]]
716537b16e9SGeorge Rokos // CK2-DAG: [[TYPE1:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
717537b16e9SGeorge Rokos // CK2: call void [[BMPRFUNC]](i8* [[HANDLE]], i8* [[BPTRADDR1BC]], i8* [[PTRADDR1BC]], i64 8, i64 [[TYPE1]])
718537b16e9SGeorge Rokos // CK2: [[PTRNEXT]] = getelementptr %class.C*, %class.C** [[PTR]], i32 1
719537b16e9SGeorge Rokos // CK2: [[ISDONE:%.+]] = icmp eq %class.C** [[PTRNEXT]], [[PTREND]]
720537b16e9SGeorge Rokos // CK2: br i1 [[ISDONE]], label %[[LEXIT:[^,]+]], label %[[LBODY]]
721537b16e9SGeorge Rokos 
722537b16e9SGeorge Rokos // CK2: [[LEXIT]]
723537b16e9SGeorge Rokos // CK2: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
724537b16e9SGeorge Rokos // CK2: br i1 [[ISARRAY]], label %[[EVALDEL:[^,]+]], label %[[DONE]]
725537b16e9SGeorge Rokos // CK2: [[EVALDEL]]
726537b16e9SGeorge Rokos // CK2: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
727537b16e9SGeorge Rokos // CK2: [[ISDEL:%.+]] = icmp ne i64 [[TYPEDEL]], 0
728537b16e9SGeorge Rokos // CK2: br i1 [[ISDEL]], label %[[DEL:[^,]+]], label %[[DONE]]
729537b16e9SGeorge Rokos // CK2: [[DEL]]
730537b16e9SGeorge Rokos // CK2-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16
731537b16e9SGeorge Rokos // CK2-DAG: [[DTYPE:%.+]] = and i64 [[TYPE]], -4
732537b16e9SGeorge Rokos // CK2: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[DTYPE]])
733537b16e9SGeorge Rokos // CK2: br label %[[DONE]]
734537b16e9SGeorge Rokos // CK2: [[DONE]]
735537b16e9SGeorge Rokos // CK2: ret void
736537b16e9SGeorge Rokos 
737537b16e9SGeorge Rokos #endif // CK2
738537b16e9SGeorge Rokos 
739537b16e9SGeorge Rokos 
740537b16e9SGeorge Rokos ///==========================================================================///
741537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK3 %s
742537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
743537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK3 %s
744537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK3 %s
745537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
746537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK3 %s
747537b16e9SGeorge Rokos 
748537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
749537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
750537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
751537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
752537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
753537b16e9SGeorge Rokos // RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
754537b16e9SGeorge Rokos 
755537b16e9SGeorge Rokos #ifdef CK3
756537b16e9SGeorge Rokos // map of array sections and nested components.
757537b16e9SGeorge Rokos 
758537b16e9SGeorge Rokos // CK3-LABEL: @.__omp_offloading_{{.*}}foo{{.*}}.region_id = weak constant i8 0
759537b16e9SGeorge Rokos // CK3: [[TYPES:@.+]] = {{.+}}constant [3 x i64] [i64 32, i64 281474976710659, i64 35]
760537b16e9SGeorge Rokos 
761537b16e9SGeorge Rokos class C {
762537b16e9SGeorge Rokos public:
763537b16e9SGeorge Rokos   int a;
764537b16e9SGeorge Rokos   double *b;
765537b16e9SGeorge Rokos };
766537b16e9SGeorge Rokos 
767537b16e9SGeorge Rokos class B {
768537b16e9SGeorge Rokos public:
769537b16e9SGeorge Rokos   C c;
770537b16e9SGeorge Rokos };
771537b16e9SGeorge Rokos 
772537b16e9SGeorge Rokos #pragma omp declare mapper(id: C s) map(s.a, s.b[0:2])
773537b16e9SGeorge Rokos 
774537b16e9SGeorge Rokos // CK3: define {{.*}}void [[MPRFUNC:@[.]omp_mapper[.].*C[.]id]](i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}})
775537b16e9SGeorge Rokos 
776537b16e9SGeorge Rokos // CK3-LABEL: define {{.*}}void @{{.*}}foo{{.*}}
777537b16e9SGeorge Rokos void foo(int a){
778537b16e9SGeorge Rokos   // CK3-DAG: [[CVAL:%.+]] = alloca [10 x %class.C]
779537b16e9SGeorge Rokos   // CK3-DAG: [[BVAL:%.+]] = alloca %class.B
780537b16e9SGeorge Rokos   C c[10];
781537b16e9SGeorge Rokos   B b;
782537b16e9SGeorge Rokos 
783537b16e9SGeorge Rokos   // CK3-DAG: [[BC:%.+]] = getelementptr inbounds %class.B, %class.B* [[BVAL]], i32 0, i32 0
784537b16e9SGeorge Rokos   // CK3-DAG: [[BCEND:%.+]] = getelementptr %class.C, %class.C* [[BC]], i32 1
785537b16e9SGeorge Rokos   // CK3-DAG: [[BCC:%.+]] = bitcast %class.C* [[BC]] to i8*
786537b16e9SGeorge Rokos   // CK3-DAG: [[BCENDC:%.+]] = bitcast %class.C* [[BCEND]] to i8*
787537b16e9SGeorge Rokos   // CK3-DAG: [[BCI:%.+]] = ptrtoint i8* [[BCC]] to i64
788537b16e9SGeorge Rokos   // CK3-DAG: [[BCENDI:%.+]] = ptrtoint i8* [[BCENDC]] to i64
789537b16e9SGeorge Rokos   // CK3-DAG: [[BSIZE:%.+]] = sub i64 [[BCENDI]], [[BCI]]
790537b16e9SGeorge Rokos   // CK3-DAG: [[BSIZED:%.+]] = sdiv exact i64 [[BSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
791537b16e9SGeorge Rokos 
792537b16e9SGeorge Rokos   // CK3-DAG: call i32 @__tgt_target_mapper(i64 {{.+}}, i8* {{.+}}, i32 3, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], i64* [[SGEP:%[^,]+]], {{.+}}[[TYPES]]{{.+}}, i8** [[MPRGEP:%.+]])
793537b16e9SGeorge Rokos   // CK3-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
794537b16e9SGeorge Rokos   // CK3-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
795537b16e9SGeorge Rokos   // CK3-DAG: [[SGEP]] = getelementptr inbounds {{.+}}[[SIZES:%[^,]+]], i32 0, i32 0
796537b16e9SGeorge Rokos   // CK3-DAG: [[MPRGEP]] = bitcast [3 x i8*]* [[MPR:%[^,]+]] to i8**
797537b16e9SGeorge Rokos   // CK3-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
798537b16e9SGeorge Rokos   // CK3-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
799537b16e9SGeorge Rokos   // CK3-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[SIZES]], i32 0, i32 0
800537b16e9SGeorge Rokos   // CK3-DAG: [[MPR1:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i{{64|32}} 0, i{{64|32}} 0
801537b16e9SGeorge Rokos   // CK3-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.B**
802537b16e9SGeorge Rokos   // CK3-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C**
803537b16e9SGeorge Rokos   // CK3-DAG: store %class.B* [[BVAL]], %class.B** [[CBP1]]
804537b16e9SGeorge Rokos   // CK3-DAG: store %class.C* [[BC]], %class.C** [[CP1]]
805537b16e9SGeorge Rokos   // CK3-DAG: store i64 [[BSIZED]], i64* [[S1]]
806537b16e9SGeorge Rokos   // CK3-DAG: store i8* null, i8** [[MPR1]]
807537b16e9SGeorge Rokos   // CK3-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1
808537b16e9SGeorge Rokos   // CK3-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1
809537b16e9SGeorge Rokos   // CK3-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[SIZES]], i32 0, i32 1
810537b16e9SGeorge Rokos   // CK3-DAG: [[MPR2:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i{{64|32}} 0, i{{64|32}} 1
811537b16e9SGeorge Rokos   // CK3-DAG: [[CBP2:%.+]] = bitcast i8** [[BP2]] to %class.B**
812537b16e9SGeorge Rokos   // CK3-DAG: [[CP2:%.+]] = bitcast i8** [[P2]] to %class.C**
813537b16e9SGeorge Rokos   // CK3-DAG: store %class.B* [[BVAL]], %class.B** [[CBP2]]
814537b16e9SGeorge Rokos   // CK3-DAG: store %class.C* [[BC]], %class.C** [[CP2]]
815537b16e9SGeorge Rokos   // CK3-64-DAG: store i64 16, i64* [[S2]]
816537b16e9SGeorge Rokos   // CK3-32-DAG: store i64 8, i64* [[S2]]
817537b16e9SGeorge Rokos   // CK3-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR2]]
818537b16e9SGeorge Rokos   // CK3-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 2
819537b16e9SGeorge Rokos   // CK3-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 2
820537b16e9SGeorge Rokos   // CK3-DAG: [[S3:%.+]] = getelementptr inbounds {{.+}}[[SIZES]], i32 0, i32 2
821537b16e9SGeorge Rokos   // CK3-DAG: [[MPR3:%.+]] = getelementptr inbounds {{.+}}[[MPR]], i{{64|32}} 0, i{{64|32}} 2
822537b16e9SGeorge Rokos   // CK3-DAG: [[CBP3:%.+]] = bitcast i8** [[BP3]] to [10 x %class.C]**
823537b16e9SGeorge Rokos   // CK3-DAG: [[CP3:%.+]] = bitcast i8** [[P3]] to %class.C**
824537b16e9SGeorge Rokos   // CK3-DAG: store [10 x %class.C]* [[CVAL]], [10 x %class.C]** [[CBP3]]
825537b16e9SGeorge Rokos   // CK3-DAG: [[CVALGEP:%.+]] = getelementptr inbounds {{.+}}[[CVAL]], i{{64|32}} 0, i{{64|32}} 0
826537b16e9SGeorge Rokos   // CK3-DAG: store %class.C* [[CVALGEP]], %class.C** [[CP3]]
827537b16e9SGeorge Rokos   // CK3-64-DAG: store i64 160, i64* [[S3]]
828537b16e9SGeorge Rokos   // CK3-32-DAG: store i64 80, i64* [[S3]]
829537b16e9SGeorge Rokos   // CK3-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[MPR3]]
830537b16e9SGeorge Rokos   // CK3: call void [[KERNEL:@.+]](%class.B* [[BVAL]], [10 x %class.C]* [[CVAL]])
831537b16e9SGeorge Rokos   #pragma omp target map(mapper(id),tofrom: c[0:10], b.c)
832537b16e9SGeorge Rokos   for (int i = 0; i < 10; i++) {
833537b16e9SGeorge Rokos     b.c.a += ++c[i].a;
834537b16e9SGeorge Rokos   }
835537b16e9SGeorge Rokos }
836537b16e9SGeorge Rokos 
837537b16e9SGeorge Rokos 
838537b16e9SGeorge Rokos // CK3: define internal void [[KERNEL]](%class.B* {{[^,]+}}, [10 x %class.C]* {{[^,]+}})
839537b16e9SGeorge Rokos 
840537b16e9SGeorge Rokos #endif // CK3
841537b16e9SGeorge Rokos 
842*9f2f3b9dSJoel E. Denny ///==========================================================================///
843*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-version=51 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK4 --check-prefix CK4-64 %s
844*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=51 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
845*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=51 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK4 --check-prefix CK4-64 %s
846*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-version=51 -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix CK4 --check-prefix CK4-32 %s
847*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=51 -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
848*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-version=51 -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix CK4 --check-prefix CK4-32 %s
849*9f2f3b9dSJoel E. Denny 
850*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -fopenmp-version=51 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
851*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=51 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
852*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=51 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
853*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -verify -fopenmp-simd -fopenmp-version=51 -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm -femit-all-decls -disable-llvm-passes %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
854*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=51 -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -femit-all-decls -disable-llvm-passes -o %t %s
855*9f2f3b9dSJoel E. Denny // RUN: %clang_cc1 -DCK4 -fopenmp-simd -fopenmp-version=51 -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -femit-all-decls -disable-llvm-passes -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
856*9f2f3b9dSJoel E. Denny 
857*9f2f3b9dSJoel E. Denny #ifdef CK4
858*9f2f3b9dSJoel E. Denny // Mapper function code generation and runtime interface.
859*9f2f3b9dSJoel E. Denny 
860*9f2f3b9dSJoel E. Denny // CK4-64: [[TSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
861*9f2f3b9dSJoel E. Denny // CK4-32: [[TSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
862*9f2f3b9dSJoel E. Denny // PRESENT=0x1000 | TARGET_PARAM=0x20 | TO=0x1 = 0x1021
863*9f2f3b9dSJoel E. Denny // CK4: [[TTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 [[#0x1021]]]
864*9f2f3b9dSJoel E. Denny 
865*9f2f3b9dSJoel E. Denny // CK4-64: [[FSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16]
866*9f2f3b9dSJoel E. Denny // CK4-32: [[FSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8]
867*9f2f3b9dSJoel E. Denny // PRESENT=0x1000 | TARGET_PARAM=0x20 | FROM=0x2 = 0x1022
868*9f2f3b9dSJoel E. Denny // CK4: [[FTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 [[#0x1022]]]
869*9f2f3b9dSJoel E. Denny 
870*9f2f3b9dSJoel E. Denny class C {
871*9f2f3b9dSJoel E. Denny public:
872*9f2f3b9dSJoel E. Denny   int a;
873*9f2f3b9dSJoel E. Denny   double *b;
874*9f2f3b9dSJoel E. Denny };
875*9f2f3b9dSJoel E. Denny 
876*9f2f3b9dSJoel E. Denny #pragma omp declare mapper(id: C s) map(s.a, s.b[0:2])
877*9f2f3b9dSJoel E. Denny 
878*9f2f3b9dSJoel E. Denny // CK4: define {{.*}}void [[MPRFUNC:@[.]omp_mapper[.].*C[.]id]](i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}})
879*9f2f3b9dSJoel E. Denny // CK4: store i8* %{{[^,]+}}, i8** [[HANDLEADDR:%[^,]+]]
880*9f2f3b9dSJoel E. Denny // CK4: store i8* %{{[^,]+}}, i8** [[BPTRADDR:%[^,]+]]
881*9f2f3b9dSJoel E. Denny // CK4: store i8* %{{[^,]+}}, i8** [[VPTRADDR:%[^,]+]]
882*9f2f3b9dSJoel E. Denny // CK4: store i64 %{{[^,]+}}, i{{64|32}}* [[SIZEADDR:%[^,]+]]
883*9f2f3b9dSJoel E. Denny // CK4: store i64 %{{[^,]+}}, i64* [[TYPEADDR:%[^,]+]]
884*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BYTESIZE:%.+]] = load i64, i64* [[SIZEADDR]]
885*9f2f3b9dSJoel E. Denny // CK4-64-DAG: [[SIZE:%.+]] = udiv exact i64 [[BYTESIZE]], 16
886*9f2f3b9dSJoel E. Denny // CK4-32-DAG: [[SIZE:%.+]] = udiv exact i64 [[BYTESIZE]], 8
887*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYPE:%.+]] = load i64, i64* [[TYPEADDR]]
888*9f2f3b9dSJoel E. Denny // CK4-DAG: [[HANDLE:%.+]] = load i8*, i8** [[HANDLEADDR]]
889*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PTRBEGIN:%.+]] = bitcast i8** [[VPTRADDR]] to %class.C**
890*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PTREND:%.+]] = getelementptr %class.C*, %class.C** [[PTRBEGIN]], i64 [[SIZE]]
891*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BPTR:%.+]] = load i8*, i8** [[BPTRADDR]]
892*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BEGIN:%.+]] = load i8*, i8** [[VPTRADDR]]
893*9f2f3b9dSJoel E. Denny // CK4: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
894*9f2f3b9dSJoel E. Denny // CK4: br i1 [[ISARRAY]], label %[[INITEVALDEL:[^,]+]], label %[[LHEAD:[^,]+]]
895*9f2f3b9dSJoel E. Denny 
896*9f2f3b9dSJoel E. Denny // CK4: [[INITEVALDEL]]
897*9f2f3b9dSJoel E. Denny // CK4: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
898*9f2f3b9dSJoel E. Denny // CK4: [[ISNOTDEL:%.+]] = icmp eq i64 [[TYPEDEL]], 0
899*9f2f3b9dSJoel E. Denny // CK4: br i1 [[ISNOTDEL]], label %[[INIT:[^,]+]], label %[[LHEAD:[^,]+]]
900*9f2f3b9dSJoel E. Denny // CK4: [[INIT]]
901*9f2f3b9dSJoel E. Denny // CK4-64-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16
902*9f2f3b9dSJoel E. Denny // CK4-32-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 8
903*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ITYPE:%.+]] = and i64 [[TYPE]], -4
904*9f2f3b9dSJoel E. Denny // CK4: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[ITYPE]])
905*9f2f3b9dSJoel E. Denny // CK4: br label %[[LHEAD:[^,]+]]
906*9f2f3b9dSJoel E. Denny 
907*9f2f3b9dSJoel E. Denny // CK4: [[LHEAD]]
908*9f2f3b9dSJoel E. Denny // CK4: [[ISEMPTY:%.+]] = icmp eq %class.C** [[PTRBEGIN]], [[PTREND]]
909*9f2f3b9dSJoel E. Denny // CK4: br i1 [[ISEMPTY]], label %[[DONE:[^,]+]], label %[[LBODY:[^,]+]]
910*9f2f3b9dSJoel E. Denny // CK4: [[LBODY]]
911*9f2f3b9dSJoel E. Denny // CK4: [[PTR:%.+]] = phi %class.C** [ [[PTRBEGIN]], %[[LHEAD]] ], [ [[PTRNEXT:%.+]], %[[LCORRECT:[^,]+]] ]
912*9f2f3b9dSJoel E. Denny // CK4: [[OBJ:%.+]] = load %class.C*, %class.C** [[PTR]]
913*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ABEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 0
914*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BBEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1
915*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BBEGIN2:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1
916*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BARRBEGIN:%.+]] = load double*, double** [[BBEGIN2]]
917*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BARRBEGINGEP:%.+]] = getelementptr inbounds double, double* [[BARRBEGIN]], i[[sz:64|32]] 0
918*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BEND:%.+]] = getelementptr double*, double** [[BBEGIN]], i32 1
919*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ABEGINV:%.+]] = bitcast i32* [[ABEGIN]] to i8*
920*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BENDV:%.+]] = bitcast double** [[BEND]] to i8*
921*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ABEGINI:%.+]] = ptrtoint i8* [[ABEGINV]] to i64
922*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BENDI:%.+]] = ptrtoint i8* [[BENDV]] to i64
923*9f2f3b9dSJoel E. Denny // CK4-DAG: [[CSIZE:%.+]] = sub i64 [[BENDI]], [[ABEGINI]]
924*9f2f3b9dSJoel E. Denny // CK4-DAG: [[CUSIZE:%.+]] = sdiv exact i64 [[CSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
925*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BPTRADDR0BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
926*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PTRADDR0BC:%.+]] = bitcast i32* [[ABEGIN]] to i8*
927*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PRESIZE:%.+]] = call i64 @__tgt_mapper_num_components(i8* [[HANDLE]])
928*9f2f3b9dSJoel E. Denny // CK4-DAG: [[SHIPRESIZE:%.+]] = shl i64 [[PRESIZE]], 48
929*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[MEMBER:[^,]+]]
930*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBER]]
931*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 true, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
932*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERCOM]]
933*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 32, [[SHIPRESIZE]]
934*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[LTYPE]]
935*9f2f3b9dSJoel E. Denny // CK4-DAG: [[LTYPE]]
936*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 32, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
937*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
938*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
939*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
940*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOC]]
941*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
942*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND:[^,]+]]
943*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOCELSE]]
944*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
945*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
946*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TO]]
947*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
948*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND]]
949*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TOELSE]]
950*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
951*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
952*9f2f3b9dSJoel E. Denny // CK4-DAG: [[FROM]]
953*9f2f3b9dSJoel E. Denny // CK4-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
954*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND]]
955*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYEND]]
956*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PHITYPE0:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
957*9f2f3b9dSJoel E. Denny // CK4: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR0BC]], i8* [[PTRADDR0BC]], i64 [[CUSIZE]], i64 [[PHITYPE0]])
958*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BPTRADDR1BC:%.+]] = bitcast %class.C* [[OBJ]] to i8*
959*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PTRADDR1BC:%.+]] = bitcast i32* [[ABEGIN]] to i8*
960*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[MEMBER:[^,]+]]
961*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBER]]
962*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
963*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERCOM]]
964*9f2f3b9dSJoel E. Denny // 281474976710659 == 0x1,000,000,003
965*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710659, [[SHIPRESIZE]]
966*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[LTYPE]]
967*9f2f3b9dSJoel E. Denny // CK4-DAG: [[LTYPE]]
968*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710659, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
969*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
970*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
971*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
972*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOC]]
973*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
974*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND:[^,]+]]
975*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOCELSE]]
976*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
977*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
978*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TO]]
979*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
980*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND]]
981*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TOELSE]]
982*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
983*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
984*9f2f3b9dSJoel E. Denny // CK4-DAG: [[FROM]]
985*9f2f3b9dSJoel E. Denny // CK4-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
986*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND]]
987*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYEND]]
988*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYPE1:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
989*9f2f3b9dSJoel E. Denny // CK4: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR1BC]], i8* [[PTRADDR1BC]], i64 4, i64 [[TYPE1]])
990*9f2f3b9dSJoel E. Denny // CK4-DAG: [[BPTRADDR2BC:%.+]] = bitcast double** [[BBEGIN]] to i8*
991*9f2f3b9dSJoel E. Denny // CK4-DAG: [[PTRADDR2BC:%.+]] = bitcast double* [[BARRBEGINGEP]] to i8*
992*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[MEMBER:[^,]+]]
993*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBER]]
994*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]]
995*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERCOM]]
996*9f2f3b9dSJoel E. Denny // 281474976710675 == 0x1,000,000,013
997*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710675, [[SHIPRESIZE]]
998*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[LTYPE]]
999*9f2f3b9dSJoel E. Denny // CK4-DAG: [[LTYPE]]
1000*9f2f3b9dSJoel E. Denny // CK4-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710675, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ]
1001*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3
1002*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0
1003*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]]
1004*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOC]]
1005*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4
1006*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND:[^,]+]]
1007*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ALLOCELSE]]
1008*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1
1009*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]]
1010*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TO]]
1011*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3
1012*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND]]
1013*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TOELSE]]
1014*9f2f3b9dSJoel E. Denny // CK4-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2
1015*9f2f3b9dSJoel E. Denny // CK4-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]]
1016*9f2f3b9dSJoel E. Denny // CK4-DAG: [[FROM]]
1017*9f2f3b9dSJoel E. Denny // CK4-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2
1018*9f2f3b9dSJoel E. Denny // CK4-DAG: br label %[[TYEND]]
1019*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYEND]]
1020*9f2f3b9dSJoel E. Denny // CK4-DAG: [[TYPE2:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ]
1021*9f2f3b9dSJoel E. Denny // CK4: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR2BC]], i8* [[PTRADDR2BC]], i64 16, i64 [[TYPE2]])
1022*9f2f3b9dSJoel E. Denny // CK4: [[PTRNEXT]] = getelementptr %class.C*, %class.C** [[PTR]], i32 1
1023*9f2f3b9dSJoel E. Denny // CK4: [[ISDONE:%.+]] = icmp eq %class.C** [[PTRNEXT]], [[PTREND]]
1024*9f2f3b9dSJoel E. Denny // CK4: br i1 [[ISDONE]], label %[[LEXIT:[^,]+]], label %[[LBODY]]
1025*9f2f3b9dSJoel E. Denny 
1026*9f2f3b9dSJoel E. Denny // CK4: [[LEXIT]]
1027*9f2f3b9dSJoel E. Denny // CK4: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1
1028*9f2f3b9dSJoel E. Denny // CK4: br i1 [[ISARRAY]], label %[[EVALDEL:[^,]+]], label %[[DONE]]
1029*9f2f3b9dSJoel E. Denny // CK4: [[EVALDEL]]
1030*9f2f3b9dSJoel E. Denny // CK4: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8
1031*9f2f3b9dSJoel E. Denny // CK4: [[ISDEL:%.+]] = icmp ne i64 [[TYPEDEL]], 0
1032*9f2f3b9dSJoel E. Denny // CK4: br i1 [[ISDEL]], label %[[DEL:[^,]+]], label %[[DONE]]
1033*9f2f3b9dSJoel E. Denny // CK4: [[DEL]]
1034*9f2f3b9dSJoel E. Denny // CK4-64-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16
1035*9f2f3b9dSJoel E. Denny // CK4-32-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 8
1036*9f2f3b9dSJoel E. Denny // CK4-DAG: [[DTYPE:%.+]] = and i64 [[TYPE]], -4
1037*9f2f3b9dSJoel E. Denny // CK4: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[DTYPE]])
1038*9f2f3b9dSJoel E. Denny // CK4: br label %[[DONE]]
1039*9f2f3b9dSJoel E. Denny // CK4: [[DONE]]
1040*9f2f3b9dSJoel E. Denny // CK4: ret void
1041*9f2f3b9dSJoel E. Denny 
1042*9f2f3b9dSJoel E. Denny 
1043*9f2f3b9dSJoel E. Denny // CK4-LABEL: define {{.*}}void @{{.*}}foo{{.*}}
1044*9f2f3b9dSJoel E. Denny void foo(int a){
1045*9f2f3b9dSJoel E. Denny   int i = a;
1046*9f2f3b9dSJoel E. Denny   C c;
1047*9f2f3b9dSJoel E. Denny   c.a = a;
1048*9f2f3b9dSJoel E. Denny 
1049*9f2f3b9dSJoel E. Denny   // CK4-DAG: call void @__tgt_target_data_update_mapper(i64 -1, i32 1, i8** [[TGEPBP:%.+]], i8** [[TGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[TSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[TTYPES]]{{.+}}, i8** [[TMPRGEP:%.+]])
1050*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TGEPBP]] = getelementptr inbounds {{.+}}[[TBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
1051*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TGEPP]] = getelementptr inbounds {{.+}}[[TP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
1052*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TMPRGEP]] = bitcast [1 x i8*]* [[TMPR:%[^,]+]] to i8**
1053*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TBP0:%.+]] = getelementptr inbounds {{.+}}[[TBP]], i{{.+}} 0, i{{.+}} 0
1054*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TP0:%.+]] = getelementptr inbounds {{.+}}[[TP]], i{{.+}} 0, i{{.+}} 0
1055*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TMPR1:%.+]] = getelementptr inbounds {{.+}}[[TMPR]], i[[sz]] 0, i[[sz]] 0
1056*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TCBP0:%.+]] = bitcast i8** [[TBP0]] to %class.C**
1057*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[TCP0:%.+]] = bitcast i8** [[TP0]] to %class.C**
1058*9f2f3b9dSJoel E. Denny   // CK4-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[TCBP0]]
1059*9f2f3b9dSJoel E. Denny   // CK4-DAG: store %class.C* [[VAL]], %class.C** [[TCP0]]
1060*9f2f3b9dSJoel E. Denny   // CK4-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[TMPR1]]
1061*9f2f3b9dSJoel E. Denny   #pragma omp target update to(present, mapper(id): c)
1062*9f2f3b9dSJoel E. Denny 
1063*9f2f3b9dSJoel E. Denny   // CK4-DAG: call void @__tgt_target_data_update_mapper(i64 -1, i32 1, i8** [[FGEPBP:%.+]], i8** [[FGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[FSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[FTYPES]]{{.+}}, i8** [[FMPRGEP:%.+]])
1064*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FGEPBP]] = getelementptr inbounds {{.+}}[[FBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
1065*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FGEPP]] = getelementptr inbounds {{.+}}[[FP:%[^,]+]], i{{.+}} 0, i{{.+}} 0
1066*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FMPRGEP]] = bitcast [1 x i8*]* [[FMPR:%[^,]+]] to i8**
1067*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FBP0:%.+]] = getelementptr inbounds {{.+}}[[FBP]], i{{.+}} 0, i{{.+}} 0
1068*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FP0:%.+]] = getelementptr inbounds {{.+}}[[FP]], i{{.+}} 0, i{{.+}} 0
1069*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FMPR1:%.+]] = getelementptr inbounds {{.+}}[[FMPR]], i[[sz]] 0, i[[sz]] 0
1070*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FCBP0:%.+]] = bitcast i8** [[FBP0]] to %class.C**
1071*9f2f3b9dSJoel E. Denny   // CK4-DAG: [[FCP0:%.+]] = bitcast i8** [[FP0]] to %class.C**
1072*9f2f3b9dSJoel E. Denny   // CK4-DAG: store %class.C* [[VAL]], %class.C** [[FCBP0]]
1073*9f2f3b9dSJoel E. Denny   // CK4-DAG: store %class.C* [[VAL]], %class.C** [[FCP0]]
1074*9f2f3b9dSJoel E. Denny   // CK4-DAG: store i8* bitcast (void (i8*, i8*, i8*, i64, i64)* [[MPRFUNC]] to i8*), i8** [[FMPR1]]
1075*9f2f3b9dSJoel E. Denny   #pragma omp target update from(mapper(id), present: c)
1076*9f2f3b9dSJoel E. Denny }
1077*9f2f3b9dSJoel E. Denny 
1078*9f2f3b9dSJoel E. Denny #endif // CK4
1079*9f2f3b9dSJoel E. Denny 
1080537b16e9SGeorge Rokos #endif // HEADER
1081