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