14304e9d1SMichael Kruse // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 24304e9d1SMichael Kruse 34304e9d1SMichael Kruse // expected-no-diagnostics 44304e9d1SMichael Kruse #ifndef HEADER 54304e9d1SMichael Kruse #define HEADER 64304e9d1SMichael Kruse 7*d47b9438SMichael Kruse ///==========================================================================/// 8*d47b9438SMichael 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 9*d47b9438SMichael 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 10*d47b9438SMichael 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 11*d47b9438SMichael 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 12*d47b9438SMichael 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 13*d47b9438SMichael 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 14*d47b9438SMichael Kruse 15*d47b9438SMichael 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 16*d47b9438SMichael 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 17*d47b9438SMichael 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 18*d47b9438SMichael 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 19*d47b9438SMichael 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 20*d47b9438SMichael 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 21*d47b9438SMichael Kruse 22*d47b9438SMichael Kruse #ifdef CK0 23*d47b9438SMichael Kruse 24*d47b9438SMichael Kruse // CK0-LABEL: @.__omp_offloading_{{.*}}foo{{.*}}.region_id = weak constant i8 0 25*d47b9438SMichael Kruse // CK0-64: [[SIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16] 26*d47b9438SMichael Kruse // CK0-32: [[SIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8] 27*d47b9438SMichael Kruse // CK0: [[TYPES:@.+]] = {{.+}}constant [1 x i64] [i64 35] 28*d47b9438SMichael Kruse // CK0-64: [[TSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16] 29*d47b9438SMichael Kruse // CK0-32: [[TSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8] 30*d47b9438SMichael Kruse // CK0: [[TTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 33] 31*d47b9438SMichael Kruse // CK0-64: [[FSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 16] 32*d47b9438SMichael Kruse // CK0-32: [[FSIZES:@.+]] = {{.+}}constant [1 x i64] [i64 8] 33*d47b9438SMichael Kruse // CK0: [[FTYPES:@.+]] = {{.+}}constant [1 x i64] [i64 34] 34*d47b9438SMichael Kruse 354304e9d1SMichael Kruse class C { 364304e9d1SMichael Kruse public: 374304e9d1SMichael Kruse int a; 38*d47b9438SMichael Kruse double *b; 394304e9d1SMichael Kruse }; 404304e9d1SMichael Kruse 41*d47b9438SMichael Kruse #pragma omp declare mapper(id: C s) map(s.a, s.b[0:2]) 424304e9d1SMichael Kruse 43*d47b9438SMichael Kruse // CK0-LABEL: define {{.*}}void @.omp_mapper.{{.*}}C.id{{.*}}(i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}}) 44*d47b9438SMichael Kruse // CK0: store i8* %{{[^,]+}}, i8** [[HANDLEADDR:%[^,]+]] 45*d47b9438SMichael Kruse // CK0: store i8* %{{[^,]+}}, i8** [[BPTRADDR:%[^,]+]] 46*d47b9438SMichael Kruse // CK0: store i8* %{{[^,]+}}, i8** [[VPTRADDR:%[^,]+]] 47*d47b9438SMichael Kruse // CK0: store i64 %{{[^,]+}}, i{{64|32}}* [[SIZEADDR:%[^,]+]] 48*d47b9438SMichael Kruse // CK0: store i64 %{{[^,]+}}, i64* [[TYPEADDR:%[^,]+]] 49*d47b9438SMichael Kruse // CK0-DAG: [[SIZE:%.+]] = load i64, i64* [[SIZEADDR]] 50*d47b9438SMichael Kruse // CK0-DAG: [[TYPE:%.+]] = load i64, i64* [[TYPEADDR]] 51*d47b9438SMichael Kruse // CK0-DAG: [[HANDLE:%.+]] = load i8*, i8** [[HANDLEADDR]] 52*d47b9438SMichael Kruse // CK0-DAG: [[PTRBEGIN:%.+]] = bitcast i8** [[VPTRADDR]] to %class.C** 53*d47b9438SMichael Kruse // CK0-DAG: [[PTREND:%.+]] = getelementptr %class.C*, %class.C** [[PTRBEGIN]], i64 [[SIZE]] 54*d47b9438SMichael Kruse // CK0-DAG: [[BPTR:%.+]] = load i8*, i8** [[BPTRADDR]] 55*d47b9438SMichael Kruse // CK0-DAG: [[BEGIN:%.+]] = load i8*, i8** [[VPTRADDR]] 56*d47b9438SMichael Kruse // CK0: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1 57*d47b9438SMichael Kruse // CK0: br i1 [[ISARRAY]], label %[[INITEVALDEL:[^,]+]], label %[[LHEAD:[^,]+]] 584304e9d1SMichael Kruse 59*d47b9438SMichael Kruse // CK0: [[INITEVALDEL]] 60*d47b9438SMichael Kruse // CK0: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8 61*d47b9438SMichael Kruse // CK0: [[ISNOTDEL:%.+]] = icmp eq i64 [[TYPEDEL]], 0 62*d47b9438SMichael Kruse // CK0: br i1 [[ISNOTDEL]], label %[[INIT:[^,]+]], label %[[LHEAD:[^,]+]] 63*d47b9438SMichael Kruse // CK0: [[INIT]] 64*d47b9438SMichael Kruse // CK0-64-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16 65*d47b9438SMichael Kruse // CK0-32-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 8 66*d47b9438SMichael Kruse // CK0-DAG: [[ITYPE:%.+]] = and i64 [[TYPE]], -4 67*d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[ITYPE]]) 68*d47b9438SMichael Kruse // CK0: br label %[[LHEAD:[^,]+]] 694304e9d1SMichael Kruse 70*d47b9438SMichael Kruse // CK0: [[LHEAD]] 71*d47b9438SMichael Kruse // CK0: [[ISEMPTY:%.+]] = icmp eq %class.C** [[PTRBEGIN]], [[PTREND]] 72*d47b9438SMichael Kruse // CK0: br i1 [[ISEMPTY]], label %[[DONE:[^,]+]], label %[[LBODY:[^,]+]] 73*d47b9438SMichael Kruse // CK0: [[LBODY]] 74*d47b9438SMichael Kruse // CK0: [[PTR:%.+]] = phi %class.C** [ [[PTRBEGIN]], %[[LHEAD]] ], [ [[PTRNEXT:%.+]], %[[LCORRECT:[^,]+]] ] 75*d47b9438SMichael Kruse // CK0: [[OBJ:%.+]] = load %class.C*, %class.C** [[PTR]] 76*d47b9438SMichael Kruse // CK0-DAG: [[ABEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 0 77*d47b9438SMichael Kruse // CK0-DAG: [[BBEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1 78*d47b9438SMichael Kruse // CK0-DAG: [[BBEGIN2:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 1 79*d47b9438SMichael Kruse // CK0-DAG: [[BARRBEGIN:%.+]] = load double*, double** [[BBEGIN2]] 80*d47b9438SMichael Kruse // CK0-DAG: [[BARRBEGINGEP:%.+]] = getelementptr inbounds double, double* [[BARRBEGIN]], i[[sz:64|32]] 0 81*d47b9438SMichael Kruse // CK0-DAG: [[BEND:%.+]] = getelementptr double*, double** [[BBEGIN]], i32 1 82*d47b9438SMichael Kruse // CK0-DAG: [[ABEGINV:%.+]] = bitcast i32* [[ABEGIN]] to i8* 83*d47b9438SMichael Kruse // CK0-DAG: [[BENDV:%.+]] = bitcast double** [[BEND]] to i8* 84*d47b9438SMichael Kruse // CK0-DAG: [[ABEGINI:%.+]] = ptrtoint i8* [[ABEGINV]] to i64 85*d47b9438SMichael Kruse // CK0-DAG: [[BENDI:%.+]] = ptrtoint i8* [[BENDV]] to i64 86*d47b9438SMichael Kruse // CK0-DAG: [[CSIZE:%.+]] = sub i64 [[BENDI]], [[ABEGINI]] 87*d47b9438SMichael Kruse // CK0-DAG: [[CUSIZE:%.+]] = sdiv exact i64 [[CSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64) 88*d47b9438SMichael Kruse // CK0-DAG: [[BPTRADDR0BC:%.+]] = bitcast %class.C* [[OBJ]] to i8* 89*d47b9438SMichael Kruse // CK0-DAG: [[PTRADDR0BC:%.+]] = bitcast i32* [[ABEGIN]] to i8* 90*d47b9438SMichael Kruse // CK0-DAG: [[PRESIZE:%.+]] = call i64 @__tgt_mapper_num_components(i8* [[HANDLE]]) 91*d47b9438SMichael Kruse // CK0-DAG: [[SHIPRESIZE:%.+]] = shl i64 [[PRESIZE]], 48 92*d47b9438SMichael Kruse // CK0-DAG: br label %[[MEMBER:[^,]+]] 93*d47b9438SMichael Kruse // CK0-DAG: [[MEMBER]] 94*d47b9438SMichael Kruse // CK0-DAG: br i1 true, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]] 95*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOM]] 96*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 32, [[SHIPRESIZE]] 97*d47b9438SMichael Kruse // CK0-DAG: br label %[[LTYPE]] 98*d47b9438SMichael Kruse // CK0-DAG: [[LTYPE]] 99*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 32, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ] 100*d47b9438SMichael Kruse // CK0-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3 101*d47b9438SMichael Kruse // CK0-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0 102*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]] 103*d47b9438SMichael Kruse // CK0-DAG: [[ALLOC]] 104*d47b9438SMichael Kruse // CK0-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4 105*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND:[^,]+]] 106*d47b9438SMichael Kruse // CK0-DAG: [[ALLOCELSE]] 107*d47b9438SMichael Kruse // CK0-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1 108*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]] 109*d47b9438SMichael Kruse // CK0-DAG: [[TO]] 110*d47b9438SMichael Kruse // CK0-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3 111*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]] 112*d47b9438SMichael Kruse // CK0-DAG: [[TOELSE]] 113*d47b9438SMichael Kruse // CK0-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2 114*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]] 115*d47b9438SMichael Kruse // CK0-DAG: [[FROM]] 116*d47b9438SMichael Kruse // CK0-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2 117*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]] 118*d47b9438SMichael Kruse // CK0-DAG: [[TYEND]] 119*d47b9438SMichael Kruse // CK0-DAG: [[PHITYPE0:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ] 120*d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR0BC]], i8* [[PTRADDR0BC]], i64 [[CUSIZE]], i64 [[PHITYPE0]]) 121*d47b9438SMichael Kruse // CK0-DAG: [[BPTRADDR1BC:%.+]] = bitcast %class.C* [[OBJ]] to i8* 122*d47b9438SMichael Kruse // CK0-DAG: [[PTRADDR1BC:%.+]] = bitcast i32* [[ABEGIN]] to i8* 123*d47b9438SMichael Kruse // CK0-DAG: br label %[[MEMBER:[^,]+]] 124*d47b9438SMichael Kruse // CK0-DAG: [[MEMBER]] 125*d47b9438SMichael Kruse // CK0-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]] 126*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOM]] 127*d47b9438SMichael Kruse // 281474976710659 == 0x1,000,000,003 128*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710659, [[SHIPRESIZE]] 129*d47b9438SMichael Kruse // CK0-DAG: br label %[[LTYPE]] 130*d47b9438SMichael Kruse // CK0-DAG: [[LTYPE]] 131*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710659, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ] 132*d47b9438SMichael Kruse // CK0-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3 133*d47b9438SMichael Kruse // CK0-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0 134*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]] 135*d47b9438SMichael Kruse // CK0-DAG: [[ALLOC]] 136*d47b9438SMichael Kruse // CK0-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4 137*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND:[^,]+]] 138*d47b9438SMichael Kruse // CK0-DAG: [[ALLOCELSE]] 139*d47b9438SMichael Kruse // CK0-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1 140*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]] 141*d47b9438SMichael Kruse // CK0-DAG: [[TO]] 142*d47b9438SMichael Kruse // CK0-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3 143*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]] 144*d47b9438SMichael Kruse // CK0-DAG: [[TOELSE]] 145*d47b9438SMichael Kruse // CK0-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2 146*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]] 147*d47b9438SMichael Kruse // CK0-DAG: [[FROM]] 148*d47b9438SMichael Kruse // CK0-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2 149*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]] 150*d47b9438SMichael Kruse // CK0-DAG: [[TYEND]] 151*d47b9438SMichael Kruse // CK0-DAG: [[TYPE1:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ] 152*d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR1BC]], i8* [[PTRADDR1BC]], i64 4, i64 [[TYPE1]]) 153*d47b9438SMichael Kruse // CK0-DAG: [[BPTRADDR2BC:%.+]] = bitcast double** [[BBEGIN]] to i8* 154*d47b9438SMichael Kruse // CK0-DAG: [[PTRADDR2BC:%.+]] = bitcast double* [[BARRBEGINGEP]] to i8* 155*d47b9438SMichael Kruse // CK0-DAG: br label %[[MEMBER:[^,]+]] 156*d47b9438SMichael Kruse // CK0-DAG: [[MEMBER]] 157*d47b9438SMichael Kruse // CK0-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]] 158*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOM]] 159*d47b9438SMichael Kruse // 281474976710675 == 0x1,000,000,013 160*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710675, [[SHIPRESIZE]] 161*d47b9438SMichael Kruse // CK0-DAG: br label %[[LTYPE]] 162*d47b9438SMichael Kruse // CK0-DAG: [[LTYPE]] 163*d47b9438SMichael Kruse // CK0-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710675, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ] 164*d47b9438SMichael Kruse // CK0-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3 165*d47b9438SMichael Kruse // CK0-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0 166*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]] 167*d47b9438SMichael Kruse // CK0-DAG: [[ALLOC]] 168*d47b9438SMichael Kruse // CK0-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4 169*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND:[^,]+]] 170*d47b9438SMichael Kruse // CK0-DAG: [[ALLOCELSE]] 171*d47b9438SMichael Kruse // CK0-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1 172*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]] 173*d47b9438SMichael Kruse // CK0-DAG: [[TO]] 174*d47b9438SMichael Kruse // CK0-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3 175*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]] 176*d47b9438SMichael Kruse // CK0-DAG: [[TOELSE]] 177*d47b9438SMichael Kruse // CK0-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2 178*d47b9438SMichael Kruse // CK0-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]] 179*d47b9438SMichael Kruse // CK0-DAG: [[FROM]] 180*d47b9438SMichael Kruse // CK0-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2 181*d47b9438SMichael Kruse // CK0-DAG: br label %[[TYEND]] 182*d47b9438SMichael Kruse // CK0-DAG: [[TYEND]] 183*d47b9438SMichael Kruse // CK0-DAG: [[TYPE2:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ] 184*d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR2BC]], i8* [[PTRADDR2BC]], i64 16, i64 [[TYPE2]]) 185*d47b9438SMichael Kruse // CK0: [[PTRNEXT]] = getelementptr %class.C*, %class.C** [[PTR]], i32 1 186*d47b9438SMichael Kruse // CK0: [[ISDONE:%.+]] = icmp eq %class.C** [[PTRNEXT]], [[PTREND]] 187*d47b9438SMichael Kruse // CK0: br i1 [[ISDONE]], label %[[LEXIT:[^,]+]], label %[[LBODY]] 188*d47b9438SMichael Kruse 189*d47b9438SMichael Kruse // CK0: [[LEXIT]] 190*d47b9438SMichael Kruse // CK0: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1 191*d47b9438SMichael Kruse // CK0: br i1 [[ISARRAY]], label %[[EVALDEL:[^,]+]], label %[[DONE]] 192*d47b9438SMichael Kruse // CK0: [[EVALDEL]] 193*d47b9438SMichael Kruse // CK0: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8 194*d47b9438SMichael Kruse // CK0: [[ISDEL:%.+]] = icmp ne i64 [[TYPEDEL]], 0 195*d47b9438SMichael Kruse // CK0: br i1 [[ISDEL]], label %[[DEL:[^,]+]], label %[[DONE]] 196*d47b9438SMichael Kruse // CK0: [[DEL]] 197*d47b9438SMichael Kruse // CK0-64-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 16 198*d47b9438SMichael Kruse // CK0-32-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 8 199*d47b9438SMichael Kruse // CK0-DAG: [[DTYPE:%.+]] = and i64 [[TYPE]], -4 200*d47b9438SMichael Kruse // CK0: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[DTYPE]]) 201*d47b9438SMichael Kruse // CK0: br label %[[DONE]] 202*d47b9438SMichael Kruse // CK0: [[DONE]] 203*d47b9438SMichael Kruse // CK0: ret void 204*d47b9438SMichael Kruse 205*d47b9438SMichael Kruse 206*d47b9438SMichael Kruse // CK0-LABEL: define {{.*}}void @{{.*}}foo{{.*}} 2074304e9d1SMichael Kruse void foo(int a){ 2084304e9d1SMichael Kruse int i = a; 2094304e9d1SMichael Kruse C c; 2104304e9d1SMichael Kruse c.a = a; 2114304e9d1SMichael Kruse 212*d47b9438SMichael Kruse // CK0-DAG: call i32 @__tgt_target(i64 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 213*d47b9438SMichael Kruse // CK0-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 214*d47b9438SMichael Kruse // CK0-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 215*d47b9438SMichael Kruse // CK0-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 216*d47b9438SMichael Kruse // CK0-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 217*d47b9438SMichael Kruse // CK0-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to %class.C** 218*d47b9438SMichael Kruse // CK0-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to %class.C** 219*d47b9438SMichael Kruse // CK0-DAG: store %class.C* [[VAL:%[^,]+]], %class.C** [[CBP1]] 220*d47b9438SMichael Kruse // CK0-DAG: store %class.C* [[VAL]], %class.C** [[CP1]] 221*d47b9438SMichael Kruse // CK0: call void [[KERNEL:@.+]](%class.C* [[VAL]]) 2224304e9d1SMichael Kruse #pragma omp target map(mapper(id),tofrom: c) 2234304e9d1SMichael Kruse { 2244304e9d1SMichael Kruse ++c.a; 2254304e9d1SMichael Kruse } 22601f670dfSMichael Kruse 227*d47b9438SMichael Kruse // CK0-DAG: call void @__tgt_target_data_update(i64 -1, i32 1, i8** [[TGEPBP:%.+]], i8** [[TGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[TSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[TTYPES]]{{.+}}) 228*d47b9438SMichael Kruse // CK0-DAG: [[TGEPBP]] = getelementptr inbounds {{.+}}[[TBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0 229*d47b9438SMichael Kruse // CK0-DAG: [[TGEPP]] = getelementptr inbounds {{.+}}[[TP:%[^,]+]], i{{.+}} 0, i{{.+}} 0 230*d47b9438SMichael Kruse // CK0-DAG: [[TBP0:%.+]] = getelementptr inbounds {{.+}}[[TBP]], i{{.+}} 0, i{{.+}} 0 231*d47b9438SMichael Kruse // CK0-DAG: [[TP0:%.+]] = getelementptr inbounds {{.+}}[[TP]], i{{.+}} 0, i{{.+}} 0 232*d47b9438SMichael Kruse // CK0-DAG: [[TCBP0:%.+]] = bitcast i8** [[TBP0]] to %class.C** 233*d47b9438SMichael Kruse // CK0-DAG: [[TCP0:%.+]] = bitcast i8** [[TP0]] to %class.C** 234*d47b9438SMichael Kruse // CK0-DAG: store %class.C* [[VAL]], %class.C** [[TCBP0]] 235*d47b9438SMichael Kruse // CK0-DAG: store %class.C* [[VAL]], %class.C** [[TCP0]] 23601f670dfSMichael Kruse #pragma omp target update to(mapper(id): c) 2370336c75cSMichael Kruse 238*d47b9438SMichael Kruse // CK0-DAG: call void @__tgt_target_data_update(i64 -1, i32 1, i8** [[FGEPBP:%.+]], i8** [[FGEPP:%.+]], i64* getelementptr {{.+}}[1 x i64]* [[FSIZES]], i32 0, i32 0), {{.+}}getelementptr {{.+}}[1 x i64]* [[FTYPES]]{{.+}}) 239*d47b9438SMichael Kruse // CK0-DAG: [[FGEPBP]] = getelementptr inbounds {{.+}}[[FBP:%[^,]+]], i{{.+}} 0, i{{.+}} 0 240*d47b9438SMichael Kruse // CK0-DAG: [[FGEPP]] = getelementptr inbounds {{.+}}[[FP:%[^,]+]], i{{.+}} 0, i{{.+}} 0 241*d47b9438SMichael Kruse // CK0-DAG: [[FBP0:%.+]] = getelementptr inbounds {{.+}}[[FBP]], i{{.+}} 0, i{{.+}} 0 242*d47b9438SMichael Kruse // CK0-DAG: [[FP0:%.+]] = getelementptr inbounds {{.+}}[[FP]], i{{.+}} 0, i{{.+}} 0 243*d47b9438SMichael Kruse // CK0-DAG: [[FCBP0:%.+]] = bitcast i8** [[FBP0]] to %class.C** 244*d47b9438SMichael Kruse // CK0-DAG: [[FCP0:%.+]] = bitcast i8** [[FP0]] to %class.C** 245*d47b9438SMichael Kruse // CK0-DAG: store %class.C* [[VAL]], %class.C** [[FCBP0]] 246*d47b9438SMichael Kruse // CK0-DAG: store %class.C* [[VAL]], %class.C** [[FCP0]] 2470336c75cSMichael Kruse #pragma omp target update from(mapper(id): c) 2484304e9d1SMichael Kruse } 2494304e9d1SMichael Kruse 2504304e9d1SMichael Kruse 251*d47b9438SMichael Kruse // CK0: define internal void [[KERNEL]](%class.C* {{.+}}[[ARG:%.+]]) 252*d47b9438SMichael Kruse // CK0: [[ADDR:%.+]] = alloca %class.C*, 253*d47b9438SMichael Kruse // CK0: store %class.C* [[ARG]], %class.C** [[ADDR]] 254*d47b9438SMichael Kruse // CK0: [[CADDR:%.+]] = load %class.C*, %class.C** [[ADDR]] 255*d47b9438SMichael Kruse // CK0: [[CAADDR:%.+]] = getelementptr inbounds %class.C, %class.C* [[CADDR]], i32 0, i32 0 256*d47b9438SMichael Kruse // CK0: [[VAL:%[^,]+]] = load i32, i32* [[CAADDR]] 257*d47b9438SMichael Kruse // CK0: {{.+}} = add nsw i32 [[VAL]], 1 258*d47b9438SMichael Kruse // CK0: } 259*d47b9438SMichael Kruse 260*d47b9438SMichael Kruse #endif 261*d47b9438SMichael Kruse 262*d47b9438SMichael Kruse 263*d47b9438SMichael Kruse ///==========================================================================/// 264*d47b9438SMichael 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 265*d47b9438SMichael 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 266*d47b9438SMichael 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 267*d47b9438SMichael 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 268*d47b9438SMichael 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 269*d47b9438SMichael 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 270*d47b9438SMichael Kruse 271*d47b9438SMichael 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 272*d47b9438SMichael 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 273*d47b9438SMichael 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 274*d47b9438SMichael 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 275*d47b9438SMichael 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 276*d47b9438SMichael 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 277*d47b9438SMichael Kruse 278*d47b9438SMichael Kruse #ifdef CK1 279*d47b9438SMichael Kruse 280*d47b9438SMichael Kruse template <class T> 281*d47b9438SMichael Kruse class C { 282*d47b9438SMichael Kruse public: 283*d47b9438SMichael Kruse T a; 284*d47b9438SMichael Kruse }; 285*d47b9438SMichael Kruse 286*d47b9438SMichael Kruse #pragma omp declare mapper(id: C<int> s) map(s.a) 287*d47b9438SMichael Kruse 288*d47b9438SMichael Kruse // CK1-LABEL: define {{.*}}void @.omp_mapper.{{.*}}C{{.*}}.id{{.*}}(i8*{{.*}}, i8*{{.*}}, i8*{{.*}}, i64{{.*}}, i64{{.*}}) 289*d47b9438SMichael Kruse // CK1: store i8* %{{[^,]+}}, i8** [[HANDLEADDR:%[^,]+]] 290*d47b9438SMichael Kruse // CK1: store i8* %{{[^,]+}}, i8** [[BPTRADDR:%[^,]+]] 291*d47b9438SMichael Kruse // CK1: store i8* %{{[^,]+}}, i8** [[VPTRADDR:%[^,]+]] 292*d47b9438SMichael Kruse // CK1: store i64 %{{[^,]+}}, i{{64|32}}* [[SIZEADDR:%[^,]+]] 293*d47b9438SMichael Kruse // CK1: store i64 %{{[^,]+}}, i64* [[TYPEADDR:%[^,]+]] 294*d47b9438SMichael Kruse // CK1-DAG: [[SIZE:%.+]] = load i64, i64* [[SIZEADDR]] 295*d47b9438SMichael Kruse // CK1-DAG: [[TYPE:%.+]] = load i64, i64* [[TYPEADDR]] 296*d47b9438SMichael Kruse // CK1-DAG: [[HANDLE:%.+]] = load i8*, i8** [[HANDLEADDR]] 297*d47b9438SMichael Kruse // CK1-DAG: [[PTRBEGIN:%.+]] = bitcast i8** [[VPTRADDR]] to %class.C** 298*d47b9438SMichael Kruse // CK1-DAG: [[PTREND:%.+]] = getelementptr %class.C*, %class.C** [[PTRBEGIN]], i64 [[SIZE]] 299*d47b9438SMichael Kruse // CK1-DAG: [[BPTR:%.+]] = load i8*, i8** [[BPTRADDR]] 300*d47b9438SMichael Kruse // CK1-DAG: [[BEGIN:%.+]] = load i8*, i8** [[VPTRADDR]] 301*d47b9438SMichael Kruse // CK1: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1 302*d47b9438SMichael Kruse // CK1: br i1 [[ISARRAY]], label %[[INITEVALDEL:[^,]+]], label %[[LHEAD:[^,]+]] 303*d47b9438SMichael Kruse 304*d47b9438SMichael Kruse // CK1: [[INITEVALDEL]] 305*d47b9438SMichael Kruse // CK1: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8 306*d47b9438SMichael Kruse // CK1: [[ISNOTDEL:%.+]] = icmp eq i64 [[TYPEDEL]], 0 307*d47b9438SMichael Kruse // CK1: br i1 [[ISNOTDEL]], label %[[INIT:[^,]+]], label %[[LHEAD:[^,]+]] 308*d47b9438SMichael Kruse // CK1: [[INIT]] 309*d47b9438SMichael Kruse // CK1-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 4 310*d47b9438SMichael Kruse // CK1-DAG: [[ITYPE:%.+]] = and i64 [[TYPE]], -4 311*d47b9438SMichael Kruse // CK1: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[ITYPE]]) 312*d47b9438SMichael Kruse // CK1: br label %[[LHEAD:[^,]+]] 313*d47b9438SMichael Kruse 314*d47b9438SMichael Kruse // CK1: [[LHEAD]] 315*d47b9438SMichael Kruse // CK1: [[ISEMPTY:%.+]] = icmp eq %class.C** [[PTRBEGIN]], [[PTREND]] 316*d47b9438SMichael Kruse // CK1: br i1 [[ISEMPTY]], label %[[DONE:[^,]+]], label %[[LBODY:[^,]+]] 317*d47b9438SMichael Kruse // CK1: [[LBODY]] 318*d47b9438SMichael Kruse // CK1: [[PTR:%.+]] = phi %class.C** [ [[PTRBEGIN]], %[[LHEAD]] ], [ [[PTRNEXT:%.+]], %[[LCORRECT:[^,]+]] ] 319*d47b9438SMichael Kruse // CK1: [[OBJ:%.+]] = load %class.C*, %class.C** [[PTR]] 320*d47b9438SMichael Kruse // CK1-DAG: [[ABEGIN:%.+]] = getelementptr inbounds %class.C, %class.C* [[OBJ]], i32 0, i32 0 321*d47b9438SMichael Kruse // CK1-DAG: [[AEND:%.+]] = getelementptr i32, i32* [[ABEGIN]], i32 1 322*d47b9438SMichael Kruse // CK1-DAG: [[ABEGINV:%.+]] = bitcast i32* [[ABEGIN]] to i8* 323*d47b9438SMichael Kruse // CK1-DAG: [[AENDV:%.+]] = bitcast i32* [[AEND]] to i8* 324*d47b9438SMichael Kruse // CK1-DAG: [[ABEGINI:%.+]] = ptrtoint i8* [[ABEGINV]] to i64 325*d47b9438SMichael Kruse // CK1-DAG: [[AENDI:%.+]] = ptrtoint i8* [[AENDV]] to i64 326*d47b9438SMichael Kruse // CK1-DAG: [[CSIZE:%.+]] = sub i64 [[AENDI]], [[ABEGINI]] 327*d47b9438SMichael Kruse // CK1-DAG: [[CUSIZE:%.+]] = sdiv exact i64 [[CSIZE]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64) 328*d47b9438SMichael Kruse // CK1-DAG: [[BPTRADDR0BC:%.+]] = bitcast %class.C* [[OBJ]] to i8* 329*d47b9438SMichael Kruse // CK1-DAG: [[PTRADDR0BC:%.+]] = bitcast i32* [[ABEGIN]] to i8* 330*d47b9438SMichael Kruse // CK1-DAG: [[PRESIZE:%.+]] = call i64 @__tgt_mapper_num_components(i8* [[HANDLE]]) 331*d47b9438SMichael Kruse // CK1-DAG: [[SHIPRESIZE:%.+]] = shl i64 [[PRESIZE]], 48 332*d47b9438SMichael Kruse // CK1-DAG: br label %[[MEMBER:[^,]+]] 333*d47b9438SMichael Kruse // CK1-DAG: [[MEMBER]] 334*d47b9438SMichael Kruse // CK1-DAG: br i1 true, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]] 335*d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOM]] 336*d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 32, [[SHIPRESIZE]] 337*d47b9438SMichael Kruse // CK1-DAG: br label %[[LTYPE]] 338*d47b9438SMichael Kruse // CK1-DAG: [[LTYPE]] 339*d47b9438SMichael Kruse // CK1-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 32, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ] 340*d47b9438SMichael Kruse // CK1-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3 341*d47b9438SMichael Kruse // CK1-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0 342*d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]] 343*d47b9438SMichael Kruse // CK1-DAG: [[ALLOC]] 344*d47b9438SMichael Kruse // CK1-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4 345*d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND:[^,]+]] 346*d47b9438SMichael Kruse // CK1-DAG: [[ALLOCELSE]] 347*d47b9438SMichael Kruse // CK1-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1 348*d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]] 349*d47b9438SMichael Kruse // CK1-DAG: [[TO]] 350*d47b9438SMichael Kruse // CK1-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3 351*d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]] 352*d47b9438SMichael Kruse // CK1-DAG: [[TOELSE]] 353*d47b9438SMichael Kruse // CK1-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2 354*d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]] 355*d47b9438SMichael Kruse // CK1-DAG: [[FROM]] 356*d47b9438SMichael Kruse // CK1-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2 357*d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]] 358*d47b9438SMichael Kruse // CK1-DAG: [[TYEND]] 359*d47b9438SMichael Kruse // CK1-DAG: [[TYPE0:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ] 360*d47b9438SMichael Kruse // CK1-64: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR0BC]], i8* [[PTRADDR0BC]], i64 [[CUSIZE]], i64 [[TYPE0]]) 361*d47b9438SMichael Kruse // CK1-DAG: [[BPTRADDR1BC:%.+]] = bitcast %class.C* [[OBJ]] to i8* 362*d47b9438SMichael Kruse // CK1-DAG: [[PTRADDR1BC:%.+]] = bitcast i32* [[ABEGIN]] to i8* 363*d47b9438SMichael Kruse // CK1-DAG: br label %[[MEMBER:[^,]+]] 364*d47b9438SMichael Kruse // CK1-DAG: [[MEMBER]] 365*d47b9438SMichael Kruse // CK1-DAG: br i1 false, label %[[LTYPE:[^,]+]], label %[[MEMBERCOM:[^,]+]] 366*d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOM]] 367*d47b9438SMichael Kruse // 281474976710659 == 0x1,000,000,003 368*d47b9438SMichael Kruse // CK1-DAG: [[MEMBERCOMTYPE:%.+]] = add nuw i64 281474976710659, [[SHIPRESIZE]] 369*d47b9438SMichael Kruse // CK1-DAG: br label %[[LTYPE]] 370*d47b9438SMichael Kruse // CK1-DAG: [[LTYPE]] 371*d47b9438SMichael Kruse // CK1-DAG: [[MEMBERTYPE:%.+]] = phi i64 [ 281474976710659, %[[MEMBER]] ], [ [[MEMBERCOMTYPE]], %[[MEMBERCOM]] ] 372*d47b9438SMichael Kruse // CK1-DAG: [[TYPETF:%.+]] = and i64 [[TYPE]], 3 373*d47b9438SMichael Kruse // CK1-DAG: [[ISALLOC:%.+]] = icmp eq i64 [[TYPETF]], 0 374*d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISALLOC]], label %[[ALLOC:[^,]+]], label %[[ALLOCELSE:[^,]+]] 375*d47b9438SMichael Kruse // CK1-DAG: [[ALLOC]] 376*d47b9438SMichael Kruse // CK1-DAG: [[ALLOCTYPE:%.+]] = and i64 [[MEMBERTYPE]], -4 377*d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND:[^,]+]] 378*d47b9438SMichael Kruse // CK1-DAG: [[ALLOCELSE]] 379*d47b9438SMichael Kruse // CK1-DAG: [[ISTO:%.+]] = icmp eq i64 [[TYPETF]], 1 380*d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISTO]], label %[[TO:[^,]+]], label %[[TOELSE:[^,]+]] 381*d47b9438SMichael Kruse // CK1-DAG: [[TO]] 382*d47b9438SMichael Kruse // CK1-DAG: [[TOTYPE:%.+]] = and i64 [[MEMBERTYPE]], -3 383*d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]] 384*d47b9438SMichael Kruse // CK1-DAG: [[TOELSE]] 385*d47b9438SMichael Kruse // CK1-DAG: [[ISFROM:%.+]] = icmp eq i64 [[TYPETF]], 2 386*d47b9438SMichael Kruse // CK1-DAG: br i1 [[ISFROM]], label %[[FROM:[^,]+]], label %[[TYEND]] 387*d47b9438SMichael Kruse // CK1-DAG: [[FROM]] 388*d47b9438SMichael Kruse // CK1-DAG: [[FROMTYPE:%.+]] = and i64 [[MEMBERTYPE]], -2 389*d47b9438SMichael Kruse // CK1-DAG: br label %[[TYEND]] 390*d47b9438SMichael Kruse // CK1-DAG: [[TYEND]] 391*d47b9438SMichael Kruse // CK1-DAG: [[TYPE1:%.+]] = phi i64 [ [[ALLOCTYPE]], %[[ALLOC]] ], [ [[TOTYPE]], %[[TO]] ], [ [[FROMTYPE]], %[[FROM]] ], [ [[MEMBERTYPE]], %[[TOELSE]] ] 392*d47b9438SMichael Kruse // CK1: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTRADDR1BC]], i8* [[PTRADDR1BC]], i64 4, i64 [[TYPE1]]) 393*d47b9438SMichael Kruse // CK1: [[PTRNEXT]] = getelementptr %class.C*, %class.C** [[PTR]], i32 1 394*d47b9438SMichael Kruse // CK1: [[ISDONE:%.+]] = icmp eq %class.C** [[PTRNEXT]], [[PTREND]] 395*d47b9438SMichael Kruse // CK1: br i1 [[ISDONE]], label %[[LEXIT:[^,]+]], label %[[LBODY]] 396*d47b9438SMichael Kruse 397*d47b9438SMichael Kruse // CK1: [[LEXIT]] 398*d47b9438SMichael Kruse // CK1: [[ISARRAY:%.+]] = icmp sge i64 [[SIZE]], 1 399*d47b9438SMichael Kruse // CK1: br i1 [[ISARRAY]], label %[[EVALDEL:[^,]+]], label %[[DONE]] 400*d47b9438SMichael Kruse // CK1: [[EVALDEL]] 401*d47b9438SMichael Kruse // CK1: [[TYPEDEL:%.+]] = and i64 [[TYPE]], 8 402*d47b9438SMichael Kruse // CK1: [[ISDEL:%.+]] = icmp ne i64 [[TYPEDEL]], 0 403*d47b9438SMichael Kruse // CK1: br i1 [[ISDEL]], label %[[DEL:[^,]+]], label %[[DONE]] 404*d47b9438SMichael Kruse // CK1: [[DEL]] 405*d47b9438SMichael Kruse // CK1-DAG: [[ARRSIZE:%.+]] = mul nuw i64 [[SIZE]], 4 406*d47b9438SMichael Kruse // CK1-DAG: [[DTYPE:%.+]] = and i64 [[TYPE]], -4 407*d47b9438SMichael Kruse // CK1: call void @__tgt_push_mapper_component(i8* [[HANDLE]], i8* [[BPTR]], i8* [[BEGIN]], i64 [[ARRSIZE]], i64 [[DTYPE]]) 408*d47b9438SMichael Kruse // CK1: br label %[[DONE]] 409*d47b9438SMichael Kruse // CK1: [[DONE]] 410*d47b9438SMichael Kruse // CK1: ret void 411*d47b9438SMichael Kruse 412*d47b9438SMichael Kruse #endif 4134304e9d1SMichael Kruse 4144304e9d1SMichael Kruse #endif 415