1*d04d9220SAlexey Bataev // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" --prefix-filecheck-ir-name _ --global-value-regex ".offload_maptypes.*" ".offload_sizes.*" --global-hex-value-regex ".offload_maptypes.*"
283ddfa0dSJoel E. Denny // expected-no-diagnostics
383ddfa0dSJoel E. Denny #ifndef HEADER
483ddfa0dSJoel E. Denny #define HEADER
583ddfa0dSJoel E. Denny 
683ddfa0dSJoel E. Denny //--------------------------------------------------
783ddfa0dSJoel E. Denny // With -DUSE.
883ddfa0dSJoel E. Denny //--------------------------------------------------
983ddfa0dSJoel E. Denny 
1083ddfa0dSJoel E. Denny // powerpc64le-ibm-linux-gnu
1183ddfa0dSJoel E. Denny 
1283ddfa0dSJoel E. Denny // RUN: %clang_cc1 -DUSE -verify -fopenmp -fopenmp-extensions \
1383ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ \
1483ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | \
1583ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-USE-PPC64LE
1683ddfa0dSJoel E. Denny // RUN: %clang_cc1 -DUSE -fopenmp -fopenmp-extensions \
1783ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 \
1883ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
1983ddfa0dSJoel E. Denny // RUN: %clang_cc1 -DUSE -fopenmp -fopenmp-extensions \
2083ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ \
2183ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t \
2283ddfa0dSJoel E. Denny // RUN:     -verify %s -emit-llvm -o - | \
2383ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-USE-PPC64LE
2483ddfa0dSJoel E. Denny 
2583ddfa0dSJoel E. Denny // i386-pc-linux-gnu
2683ddfa0dSJoel E. Denny 
2783ddfa0dSJoel E. Denny // RUN: %clang_cc1 -DUSE -verify -fopenmp -fopenmp-extensions \
2883ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ \
2983ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -emit-llvm %s -o - | \
3083ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-USE-I386
3183ddfa0dSJoel E. Denny // RUN: %clang_cc1 -DUSE -fopenmp -fopenmp-extensions \
3283ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 \
3383ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -emit-pch -o %t %s
3483ddfa0dSJoel E. Denny // RUN: %clang_cc1 -DUSE -fopenmp -fopenmp-extensions \
3583ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ \
3683ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s \
3783ddfa0dSJoel E. Denny // RUN:     -emit-llvm -o - | \
3883ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-USE-I386
3983ddfa0dSJoel E. Denny 
4083ddfa0dSJoel E. Denny //--------------------------------------------------
4183ddfa0dSJoel E. Denny // Without -DUSE.
4283ddfa0dSJoel E. Denny //--------------------------------------------------
4383ddfa0dSJoel E. Denny 
4483ddfa0dSJoel E. Denny // powerpc64le-ibm-linux-gnu
4583ddfa0dSJoel E. Denny 
4683ddfa0dSJoel E. Denny // RUN: %clang_cc1 -verify -fopenmp -fopenmp-extensions \
4783ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ \
4883ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | \
4983ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-NOUSE-PPC64LE
5083ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
5183ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 \
5283ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
5383ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
5483ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ \
5583ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t \
5683ddfa0dSJoel E. Denny // RUN:     -verify %s -emit-llvm -o - | \
5783ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-NOUSE-PPC64LE
5883ddfa0dSJoel E. Denny 
5983ddfa0dSJoel E. Denny // i386-pc-linux-gnu
6083ddfa0dSJoel E. Denny 
6183ddfa0dSJoel E. Denny // RUN: %clang_cc1 -verify -fopenmp -fopenmp-extensions \
6283ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ \
6383ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -emit-llvm %s -o - | \
6483ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-NOUSE-I386
6583ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
6683ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 \
6783ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -emit-pch -o %t %s
6883ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
6983ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ \
7083ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s \
7183ddfa0dSJoel E. Denny // RUN:     -emit-llvm -o - | \
7283ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-NOUSE-I386
7383ddfa0dSJoel E. Denny 
7483ddfa0dSJoel E. Denny // Map flags used in @.offload_maptypes* below:
7583ddfa0dSJoel E. Denny //
7683ddfa0dSJoel E. Denny // TO           = 0x1
7783ddfa0dSJoel E. Denny // FROM         = 0x2
7883ddfa0dSJoel E. Denny // ALWAYS       = 0x4
7983ddfa0dSJoel E. Denny // TARGET_PARAM = 0x20
8083ddfa0dSJoel E. Denny // CLOSE        = 0x400
8183ddfa0dSJoel E. Denny // OMPX_HOLD    = 0x2000
8283ddfa0dSJoel E. Denny // MEMBER_OF_1  = 0x1000000000000
8383ddfa0dSJoel E. Denny // MEMBER_OF_5  = 0x5000000000000
8483ddfa0dSJoel E. Denny 
8583ddfa0dSJoel E. Denny //.
86*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_sizes = private unnamed_addr constant [7 x i64] [i64 0, i64 4, i64 4, i64 4, i64 0, i64 4, i64 4]
8783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE: @.offload_maptypes = private unnamed_addr constant [7 x i64] [i64 [[#0x2020]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]], i64 [[#0x2023]], i64 [[#0x2020]], i64 [[#0x5000000002003]], i64 [[#0x5000000002003]]]
88*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
89*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2427]]]
90*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
91*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2020]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
9283ddfa0dSJoel E. Denny //.
93*d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_sizes = private unnamed_addr constant [7 x i64] [i64 0, i64 4, i64 4, i64 4, i64 0, i64 4, i64 4]
9483ddfa0dSJoel E. Denny // CHECK-USE-I386: @.offload_maptypes = private unnamed_addr constant [7 x i64] [i64 [[#0x2020]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]], i64 [[#0x2023]], i64 [[#0x2020]], i64 [[#0x5000000002003]], i64 [[#0x5000000002003]]]
95*d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
96*d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2427]]]
97*d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
98*d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2020]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
9983ddfa0dSJoel E. Denny //.
100*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_sizes = private unnamed_addr constant [7 x i64] [i64 0, i64 4, i64 4, i64 4, i64 0, i64 4, i64 4]
10183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE: @.offload_maptypes = private unnamed_addr constant [7 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]], i64 [[#0x2003]], i64 [[#0x2000]], i64 [[#0x5000000002003]], i64 [[#0x5000000002003]]]
102*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
103*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2407]]]
104*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
105*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
10683ddfa0dSJoel E. Denny //.
107*d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_sizes = private unnamed_addr constant [7 x i64] [i64 0, i64 4, i64 4, i64 4, i64 0, i64 4, i64 4]
10883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386: @.offload_maptypes = private unnamed_addr constant [7 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]], i64 [[#0x2003]], i64 [[#0x2000]], i64 [[#0x5000000002003]], i64 [[#0x5000000002003]]]
109*d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
110*d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2407]]]
111*d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
112*d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
11383ddfa0dSJoel E. Denny //.
11483ddfa0dSJoel E. Denny struct ST {
11583ddfa0dSJoel E. Denny   int i;
11683ddfa0dSJoel E. Denny   int j;
11783ddfa0dSJoel E. Denny   void test_present_members();
11883ddfa0dSJoel E. Denny };
11983ddfa0dSJoel E. Denny 
12083ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-LABEL: @_Z20explicit_maps_singlei(
12183ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:  entry:
12283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[II_ADDR:%.*]] = alloca i32, align 4
12383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[A:%.*]] = alloca i32, align 4
12483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[ST1:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
12583ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[ST2:%.*]] = alloca [[STRUCT_ST]], align 4
12683ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [7 x i8*], align 8
12783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [7 x i8*], align 8
12883ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [7 x i8*], align 8
129ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [7 x i64], align 8
13083ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 8
13183ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 8
13283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 8
13383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    store i32 [[II:%.*]], i32* [[II_ADDR]], align 4
13483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP0:%.*]] = load i32, i32* [[II_ADDR]], align 4
13583ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    store i32 [[TMP0]], i32* [[A]], align 4
13683ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 0
13783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 1
13883ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP1:%.*]] = getelementptr i32, i32* [[J]], i32 1
13983ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP2:%.*]] = bitcast i32* [[I]] to i8*
14083ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP3:%.*]] = bitcast i32* [[TMP1]] to i8*
14183ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP3]] to i64
14283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP5:%.*]] = ptrtoint i8* [[TMP2]] to i64
14383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP6:%.*]] = sub i64 [[TMP4]], [[TMP5]]
14483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP7:%.*]] = sdiv exact i64 [[TMP6]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
14583ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[I1:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 0
14683ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[J2:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 1
14783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr i32, i32* [[J2]], i32 1
14883ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP9:%.*]] = bitcast i32* [[I1]] to i8*
14983ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP10:%.*]] = bitcast i32* [[TMP8]] to i8*
15083ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP11:%.*]] = ptrtoint i8* [[TMP10]] to i64
15183ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP12:%.*]] = ptrtoint i8* [[TMP9]] to i64
15283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP13:%.*]] = sub i64 [[TMP11]], [[TMP12]]
15383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP14:%.*]] = sdiv exact i64 [[TMP13]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
154*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
155*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP15]], i8* align 8 bitcast ([7 x i64]* @.offload_sizes to i8*), i64 56, i1 false)
156*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
157*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
158*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 8
159*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
160*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
161*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP19]], align 8
162*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
163*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 8
164*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
165*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP21]], align 8
166*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
167*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
168*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 8
169*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
170*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
171*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP25]], align 8
172ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
173ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP26]], align 8
174ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
175ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to %struct.ST**
176ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP28]], align 8
177ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
178ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP30:%.*]] = bitcast i8** [[TMP29]] to i32**
179ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[J]], i32** [[TMP30]], align 8
180*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
181*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP31]], align 8
182*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
183*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
184*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP33]], align 8
185*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
186*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
187*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP35]], align 8
188*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3
189*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP36]], align 8
190*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
191*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
192*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 8
193*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
194*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
195*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 8
196*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
197*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 8
198*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4
199*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP42]], align 8
200*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
201*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
202*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 8
203*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
204*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
205*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 8
206*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 5
207*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP47]], align 8
208*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
209*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
210*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 8
211*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
212*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
213*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 8
214*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 6
215*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP52]], align 8
216*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
217*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
218*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
219*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP56:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630.region_id, i32 7, i8** [[TMP53]], i8** [[TMP54]], i64* [[TMP55]], i64* getelementptr inbounds ([7 x i64], [7 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
220*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
221*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    br i1 [[TMP57]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
22283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE:       omp_offload.failed:
223*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630(%struct.ST* [[ST1]], i32* [[A]], %struct.ST* [[ST2]]) #[[ATTR3:[0-9]+]]
22483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    br label [[OMP_OFFLOAD_CONT]]
22583ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE:       omp_offload.cont:
226*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
227*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
228*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP59]], align 8
229*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
230*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
231*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP61]], align 8
232*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
233*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP62]], align 8
234*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
235ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
236*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP65:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644.region_id, i32 1, i8** [[TMP63]], i8** [[TMP64]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.1, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.2, i32 0, i32 0), i8** null, i8** null)
237*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
238*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    br i1 [[TMP66]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
23983ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE:       omp_offload.failed6:
240*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644(i32* [[A]]) #[[ATTR3]]
24183ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
24283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE:       omp_offload.cont7:
24383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    ret void
24483ddfa0dSJoel E. Denny //
24583ddfa0dSJoel E. Denny // CHECK-USE-I386-LABEL: @_Z20explicit_maps_singlei(
24683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:  entry:
24783ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[II_ADDR:%.*]] = alloca i32, align 4
24883ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[A:%.*]] = alloca i32, align 4
24983ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[ST1:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
25083ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[ST2:%.*]] = alloca [[STRUCT_ST]], align 4
25183ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [7 x i8*], align 4
25283ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [7 x i8*], align 4
25383ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [7 x i8*], align 4
254ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [7 x i64], align 4
25583ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
25683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
25783ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
25883ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    store i32 [[II:%.*]], i32* [[II_ADDR]], align 4
25983ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP0:%.*]] = load i32, i32* [[II_ADDR]], align 4
26083ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    store i32 [[TMP0]], i32* [[A]], align 4
26183ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 0
26283ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 1
26383ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP1:%.*]] = getelementptr i32, i32* [[J]], i32 1
26483ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP2:%.*]] = bitcast i32* [[I]] to i8*
26583ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP3:%.*]] = bitcast i32* [[TMP1]] to i8*
26683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP3]] to i64
26783ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP5:%.*]] = ptrtoint i8* [[TMP2]] to i64
26883ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP6:%.*]] = sub i64 [[TMP4]], [[TMP5]]
26983ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP7:%.*]] = sdiv exact i64 [[TMP6]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
27083ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[I1:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 0
27183ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[J2:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 1
27283ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP8:%.*]] = getelementptr i32, i32* [[J2]], i32 1
27383ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP9:%.*]] = bitcast i32* [[I1]] to i8*
27483ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP10:%.*]] = bitcast i32* [[TMP8]] to i8*
27583ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP11:%.*]] = ptrtoint i8* [[TMP10]] to i64
27683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP12:%.*]] = ptrtoint i8* [[TMP9]] to i64
27783ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP13:%.*]] = sub i64 [[TMP11]], [[TMP12]]
27883ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP14:%.*]] = sdiv exact i64 [[TMP13]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
279*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
280*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP15]], i8* align 4 bitcast ([7 x i64]* @.offload_sizes to i8*), i32 56, i1 false)
281*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
282*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
283*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 4
284*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
285*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
286*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I]], i32** [[TMP19]], align 4
287*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
288*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 4
289*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
290*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP21]], align 4
291*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
292*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
293*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 4
294*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
295*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
296*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I]], i32** [[TMP25]], align 4
297ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
298ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP26]], align 4
299ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
300ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to %struct.ST**
301ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP28]], align 4
302ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
303ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP30:%.*]] = bitcast i8** [[TMP29]] to i32**
304ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[J]], i32** [[TMP30]], align 4
305*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
306*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP31]], align 4
307*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
308*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
309*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP33]], align 4
310*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
311*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
312*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP35]], align 4
313*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3
314*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP36]], align 4
315*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
316*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
317*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 4
318*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
319*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
320*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 4
321*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
322*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 4
323*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 4
324*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP42]], align 4
325*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
326*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
327*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 4
328*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
329*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
330*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 4
331*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 5
332*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP47]], align 4
333*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
334*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
335*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 4
336*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
337*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
338*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 4
339*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 6
340*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP52]], align 4
341*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
342*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
343*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
344*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP56:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630.region_id, i32 7, i8** [[TMP53]], i8** [[TMP54]], i64* [[TMP55]], i64* getelementptr inbounds ([7 x i64], [7 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
345*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
346*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    br i1 [[TMP57]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
34783ddfa0dSJoel E. Denny // CHECK-USE-I386:       omp_offload.failed:
348*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630(%struct.ST* [[ST1]], i32* [[A]], %struct.ST* [[ST2]]) #[[ATTR3:[0-9]+]]
34983ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    br label [[OMP_OFFLOAD_CONT]]
35083ddfa0dSJoel E. Denny // CHECK-USE-I386:       omp_offload.cont:
351*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
352*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
353*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP59]], align 4
354*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
355*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
356*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP61]], align 4
357*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
358*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP62]], align 4
359*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
360ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
361*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP65:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644.region_id, i32 1, i8** [[TMP63]], i8** [[TMP64]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.1, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.2, i32 0, i32 0), i8** null, i8** null)
362*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
363*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    br i1 [[TMP66]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
36483ddfa0dSJoel E. Denny // CHECK-USE-I386:       omp_offload.failed6:
365*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644(i32* [[A]]) #[[ATTR3]]
36683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
36783ddfa0dSJoel E. Denny // CHECK-USE-I386:       omp_offload.cont7:
36883ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    ret void
36983ddfa0dSJoel E. Denny //
37083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-LABEL: @_Z20explicit_maps_singlei(
37183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:  entry:
37283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[II_ADDR:%.*]] = alloca i32, align 4
37383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[A:%.*]] = alloca i32, align 4
37483ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[ST1:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
37583ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[ST2:%.*]] = alloca [[STRUCT_ST]], align 4
37683ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [7 x i8*], align 8
37783ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [7 x i8*], align 8
37883ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [7 x i8*], align 8
379ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [7 x i64], align 8
38083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 8
38183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 8
38283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 8
38383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    store i32 [[II:%.*]], i32* [[II_ADDR]], align 4
38483ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP0:%.*]] = load i32, i32* [[II_ADDR]], align 4
38583ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    store i32 [[TMP0]], i32* [[A]], align 4
38683ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 0
38783ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 1
38883ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP1:%.*]] = getelementptr i32, i32* [[J]], i32 1
38983ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP2:%.*]] = bitcast i32* [[I]] to i8*
39083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP3:%.*]] = bitcast i32* [[TMP1]] to i8*
39183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP3]] to i64
39283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP5:%.*]] = ptrtoint i8* [[TMP2]] to i64
39383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP6:%.*]] = sub i64 [[TMP4]], [[TMP5]]
39483ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP7:%.*]] = sdiv exact i64 [[TMP6]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
39583ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[I1:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 0
39683ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[J2:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 1
39783ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr i32, i32* [[J2]], i32 1
39883ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP9:%.*]] = bitcast i32* [[I1]] to i8*
39983ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP10:%.*]] = bitcast i32* [[TMP8]] to i8*
40083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP11:%.*]] = ptrtoint i8* [[TMP10]] to i64
40183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP12:%.*]] = ptrtoint i8* [[TMP9]] to i64
40283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP13:%.*]] = sub i64 [[TMP11]], [[TMP12]]
40383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP14:%.*]] = sdiv exact i64 [[TMP13]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
404*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
405*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP15]], i8* align 8 bitcast ([7 x i64]* @.offload_sizes to i8*), i64 56, i1 false)
406*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
407*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
408*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 8
409*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
410*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
411*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP19]], align 8
412*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
413*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 8
414*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
415*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP21]], align 8
416*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
417*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
418*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 8
419*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
420*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
421*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP25]], align 8
422ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
423ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP26]], align 8
424ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
425ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to %struct.ST**
426ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP28]], align 8
427ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
428ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP30:%.*]] = bitcast i8** [[TMP29]] to i32**
429ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[J]], i32** [[TMP30]], align 8
430*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
431*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP31]], align 8
432*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
433*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
434*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP33]], align 8
435*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
436*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
437*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP35]], align 8
438*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3
439*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP36]], align 8
440*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
441*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
442*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 8
443*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
444*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
445*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 8
446*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
447*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 8
448*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4
449*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP42]], align 8
450*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
451*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
452*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 8
453*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
454*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
455*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 8
456*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 5
457*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP47]], align 8
458*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
459*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
460*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 8
461*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
462*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
463*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 8
464*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 6
465*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP52]], align 8
466*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
467*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
468*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
469*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP56:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630.region_id, i32 7, i8** [[TMP53]], i8** [[TMP54]], i64* [[TMP55]], i64* getelementptr inbounds ([7 x i64], [7 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
470*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
471*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    br i1 [[TMP57]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
47283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE:       omp_offload.failed:
473*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630() #[[ATTR3:[0-9]+]]
47483ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    br label [[OMP_OFFLOAD_CONT]]
47583ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE:       omp_offload.cont:
476*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
477*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
478*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP59]], align 8
479*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
480*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
481*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP61]], align 8
482*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
483*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP62]], align 8
484*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
485ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
486*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP65:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644.region_id, i32 1, i8** [[TMP63]], i8** [[TMP64]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.1, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.2, i32 0, i32 0), i8** null, i8** null)
487*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
488*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    br i1 [[TMP66]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
48983ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE:       omp_offload.failed6:
490*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644() #[[ATTR3]]
49183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
49283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE:       omp_offload.cont7:
49383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    ret void
49483ddfa0dSJoel E. Denny //
49583ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-LABEL: @_Z20explicit_maps_singlei(
49683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:  entry:
49783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[II_ADDR:%.*]] = alloca i32, align 4
49883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[A:%.*]] = alloca i32, align 4
49983ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[ST1:%.*]] = alloca [[STRUCT_ST:%.*]], align 4
50083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[ST2:%.*]] = alloca [[STRUCT_ST]], align 4
50183ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [7 x i8*], align 4
50283ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [7 x i8*], align 4
50383ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [7 x i8*], align 4
504ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [7 x i64], align 4
50583ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS3:%.*]] = alloca [1 x i8*], align 4
50683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_PTRS4:%.*]] = alloca [1 x i8*], align 4
50783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_MAPPERS5:%.*]] = alloca [1 x i8*], align 4
50883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    store i32 [[II:%.*]], i32* [[II_ADDR]], align 4
50983ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP0:%.*]] = load i32, i32* [[II_ADDR]], align 4
51083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    store i32 [[TMP0]], i32* [[A]], align 4
51183ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 0
51283ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST1]], i32 0, i32 1
51383ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP1:%.*]] = getelementptr i32, i32* [[J]], i32 1
51483ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP2:%.*]] = bitcast i32* [[I]] to i8*
51583ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP3:%.*]] = bitcast i32* [[TMP1]] to i8*
51683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP3]] to i64
51783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP5:%.*]] = ptrtoint i8* [[TMP2]] to i64
51883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP6:%.*]] = sub i64 [[TMP4]], [[TMP5]]
51983ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP7:%.*]] = sdiv exact i64 [[TMP6]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
52083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[I1:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 0
52183ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[J2:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[ST2]], i32 0, i32 1
52283ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP8:%.*]] = getelementptr i32, i32* [[J2]], i32 1
52383ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP9:%.*]] = bitcast i32* [[I1]] to i8*
52483ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP10:%.*]] = bitcast i32* [[TMP8]] to i8*
52583ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP11:%.*]] = ptrtoint i8* [[TMP10]] to i64
52683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP12:%.*]] = ptrtoint i8* [[TMP9]] to i64
52783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP13:%.*]] = sub i64 [[TMP11]], [[TMP12]]
52883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP14:%.*]] = sdiv exact i64 [[TMP13]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
529*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
530*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP15]], i8* align 4 bitcast ([7 x i64]* @.offload_sizes to i8*), i32 56, i1 false)
531*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
532*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
533*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 4
534*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
535*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
536*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I]], i32** [[TMP19]], align 4
537*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
538*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 4
539*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
540*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP21]], align 4
541*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
542*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
543*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 4
544*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
545*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
546*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I]], i32** [[TMP25]], align 4
547ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
548ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP26]], align 4
549ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP27:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
550ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP28:%.*]] = bitcast i8** [[TMP27]] to %struct.ST**
551ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP28]], align 4
552ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
553ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP30:%.*]] = bitcast i8** [[TMP29]] to i32**
554ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[J]], i32** [[TMP30]], align 4
555*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
556*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP31]], align 4
557*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
558*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
559*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP33]], align 4
560*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
561*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
562*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP35]], align 4
563*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3
564*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP36]], align 4
565*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
566*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
567*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 4
568*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
569*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
570*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 4
571*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
572*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 4
573*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 4
574*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP42]], align 4
575*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
576*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
577*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 4
578*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
579*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
580*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 4
581*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 5
582*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP47]], align 4
583*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
584*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
585*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 4
586*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
587*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
588*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 4
589*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 6
590*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP52]], align 4
591*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
592*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
593*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
594*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP56:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630.region_id, i32 7, i8** [[TMP53]], i8** [[TMP54]], i64* [[TMP55]], i64* getelementptr inbounds ([7 x i64], [7 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
595*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
596*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    br i1 [[TMP57]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
59783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386:       omp_offload.failed:
598*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l630() #[[ATTR3:[0-9]+]]
59983ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    br label [[OMP_OFFLOAD_CONT]]
60083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386:       omp_offload.cont:
601*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
602*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
603*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP59]], align 4
604*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
605*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
606*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP61]], align 4
607*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
608*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP62]], align 4
609*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP63:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
610ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP64:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
611*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP65:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644.region_id, i32 1, i8** [[TMP63]], i8** [[TMP64]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.1, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.2, i32 0, i32 0), i8** null, i8** null)
612*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
613*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    br i1 [[TMP66]], label [[OMP_OFFLOAD_FAILED6:%.*]], label [[OMP_OFFLOAD_CONT7:%.*]]
61483ddfa0dSJoel E. Denny // CHECK-NOUSE-I386:       omp_offload.failed6:
615*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z20explicit_maps_singlei_l644() #[[ATTR3]]
61683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    br label [[OMP_OFFLOAD_CONT7]]
61783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386:       omp_offload.cont7:
61883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    ret void
61983ddfa0dSJoel E. Denny //
62083ddfa0dSJoel E. Denny void explicit_maps_single(int ii) {
62183ddfa0dSJoel E. Denny 
62283ddfa0dSJoel E. Denny   // Map of a scalar.
62383ddfa0dSJoel E. Denny   int a = ii;
62483ddfa0dSJoel E. Denny 
62583ddfa0dSJoel E. Denny   struct ST st1;
62683ddfa0dSJoel E. Denny   struct ST st2;
62783ddfa0dSJoel E. Denny 
62883ddfa0dSJoel E. Denny   // Make sure the struct picks up ompx_hold even if another element of the
62983ddfa0dSJoel E. Denny   // struct doesn't have ompx_hold.
63083ddfa0dSJoel E. Denny   #pragma omp target map(tofrom : st1.i) \
63183ddfa0dSJoel E. Denny                      map(ompx_hold, tofrom : a, st1.j, st2.i) \
63283ddfa0dSJoel E. Denny                      map(tofrom : st2.j)
63383ddfa0dSJoel E. Denny   {
63483ddfa0dSJoel E. Denny #ifdef USE
63583ddfa0dSJoel E. Denny     st1.i++;
63683ddfa0dSJoel E. Denny     a++;
63783ddfa0dSJoel E. Denny     st1.j++;
63883ddfa0dSJoel E. Denny     st2.i++;
63983ddfa0dSJoel E. Denny     st2.j++;
64083ddfa0dSJoel E. Denny #endif
64183ddfa0dSJoel E. Denny   }
64283ddfa0dSJoel E. Denny 
64383ddfa0dSJoel E. Denny   // Always Close Hold.
64483ddfa0dSJoel E. Denny   #pragma omp target map(always close ompx_hold tofrom: a)
64583ddfa0dSJoel E. Denny   {
64683ddfa0dSJoel E. Denny #ifdef USE
64783ddfa0dSJoel E. Denny     a++;
64883ddfa0dSJoel E. Denny #endif
64983ddfa0dSJoel E. Denny   }
65083ddfa0dSJoel E. Denny }
65183ddfa0dSJoel E. Denny 
65283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-LABEL: @_ZN2ST20test_present_membersEv(
65383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:  entry:
65483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.ST*, align 8
65583ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
65683ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
65783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
658ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8
65983ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[THIS:%.*]], %struct.ST** [[THIS_ADDR]], align 8
66083ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[THIS1:%.*]] = load %struct.ST*, %struct.ST** [[THIS_ADDR]], align 8
66183ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.ST* [[THIS1]], i32 0, i32 0
66283ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[THIS1]], i32 0, i32 1
66383ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[J]], i32 1
66483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP1:%.*]] = bitcast i32* [[I]] to i8*
66583ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP2:%.*]] = bitcast i32* [[TMP0]] to i8*
66683ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP3:%.*]] = ptrtoint i8* [[TMP2]] to i64
66783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP1]] to i64
66883ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP5:%.*]] = sub i64 [[TMP3]], [[TMP4]]
66983ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    [[TMP6:%.*]] = sdiv exact i64 [[TMP5]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
670*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
671*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP7]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes.3 to i8*), i64 24, i1 false)
672*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
673*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
674*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 8
675*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
676*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
677*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP11]], align 8
678*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
679*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 8
680*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
681*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP13]], align 8
682*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
683*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
684*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 8
685*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
686*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
687*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP17]], align 8
688ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
689ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP18]], align 8
690ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
691ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to %struct.ST**
692ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP20]], align 8
693ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
694ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32**
695ca6fa71bSAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[J]], i32** [[TMP22]], align 8
696*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
697*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP23]], align 8
698*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
699*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
700*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
701*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP27:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
702*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
703*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    br i1 [[TMP28]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
70483ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE:       omp_offload.failed:
705*d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887(%struct.ST* [[THIS1]]) #[[ATTR3]]
70683ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    br label [[OMP_OFFLOAD_CONT]]
70783ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE:       omp_offload.cont:
70883ddfa0dSJoel E. Denny // CHECK-USE-PPC64LE-NEXT:    ret void
70983ddfa0dSJoel E. Denny //
71083ddfa0dSJoel E. Denny // CHECK-USE-I386-LABEL: @_ZN2ST20test_present_membersEv(
71183ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:  entry:
71283ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.ST*, align 4
71383ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
71483ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
71583ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
716ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4
71783ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    store %struct.ST* [[THIS:%.*]], %struct.ST** [[THIS_ADDR]], align 4
71883ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[THIS1:%.*]] = load %struct.ST*, %struct.ST** [[THIS_ADDR]], align 4
71983ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.ST* [[THIS1]], i32 0, i32 0
72083ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[THIS1]], i32 0, i32 1
72183ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[J]], i32 1
72283ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP1:%.*]] = bitcast i32* [[I]] to i8*
72383ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP2:%.*]] = bitcast i32* [[TMP0]] to i8*
72483ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP3:%.*]] = ptrtoint i8* [[TMP2]] to i64
72583ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP1]] to i64
72683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP5:%.*]] = sub i64 [[TMP3]], [[TMP4]]
72783ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    [[TMP6:%.*]] = sdiv exact i64 [[TMP5]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
728*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
729*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP7]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.3 to i8*), i32 24, i1 false)
730*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
731*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
732*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 4
733*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
734*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
735*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I]], i32** [[TMP11]], align 4
736*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
737*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 4
738*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
739*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP13]], align 4
740*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
741*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
742*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 4
743*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
744*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
745*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I]], i32** [[TMP17]], align 4
746ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
747ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP18]], align 4
748ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
749ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to %struct.ST**
750ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP20]], align 4
751ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
752ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32**
753ca6fa71bSAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[J]], i32** [[TMP22]], align 4
754*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
755*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP23]], align 4
756*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
757*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
758*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
759*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP27:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
760*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
761*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    br i1 [[TMP28]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
76283ddfa0dSJoel E. Denny // CHECK-USE-I386:       omp_offload.failed:
763*d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887(%struct.ST* [[THIS1]]) #[[ATTR3]]
76483ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    br label [[OMP_OFFLOAD_CONT]]
76583ddfa0dSJoel E. Denny // CHECK-USE-I386:       omp_offload.cont:
76683ddfa0dSJoel E. Denny // CHECK-USE-I386-NEXT:    ret void
76783ddfa0dSJoel E. Denny //
76883ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-LABEL: @_ZN2ST20test_present_membersEv(
76983ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:  entry:
77083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.ST*, align 8
77183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 8
77283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 8
77383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 8
774ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 8
77583ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[THIS:%.*]], %struct.ST** [[THIS_ADDR]], align 8
77683ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[THIS1:%.*]] = load %struct.ST*, %struct.ST** [[THIS_ADDR]], align 8
77783ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.ST* [[THIS1]], i32 0, i32 0
77883ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[THIS1]], i32 0, i32 1
77983ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[J]], i32 1
78083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP1:%.*]] = bitcast i32* [[I]] to i8*
78183ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP2:%.*]] = bitcast i32* [[TMP0]] to i8*
78283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP3:%.*]] = ptrtoint i8* [[TMP2]] to i64
78383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP1]] to i64
78483ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP5:%.*]] = sub i64 [[TMP3]], [[TMP4]]
78583ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP6:%.*]] = sdiv exact i64 [[TMP5]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
786*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
787*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 [[TMP7]], i8* align 8 bitcast ([3 x i64]* @.offload_sizes.3 to i8*), i64 24, i1 false)
788*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
789*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
790*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 8
791*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
792*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
793*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP11]], align 8
794*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
795*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 8
796*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
797*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP13]], align 8
798*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
799*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
800*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 8
801*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
802*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
803*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP17]], align 8
804ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 1
805ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP18]], align 8
806ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
807ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to %struct.ST**
808ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP20]], align 8
809ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
810ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32**
811ca6fa71bSAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[J]], i32** [[TMP22]], align 8
812*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
813*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP23]], align 8
814*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
815*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
816*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
817*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP27:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
818*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
819*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    br i1 [[TMP28]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
82083ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE:       omp_offload.failed:
821*d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887() #[[ATTR3]]
82283ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    br label [[OMP_OFFLOAD_CONT]]
82383ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE:       omp_offload.cont:
82483ddfa0dSJoel E. Denny // CHECK-NOUSE-PPC64LE-NEXT:    ret void
82583ddfa0dSJoel E. Denny //
82683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-LABEL: @_ZN2ST20test_present_membersEv(
82783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:  entry:
82883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[THIS_ADDR:%.*]] = alloca %struct.ST*, align 4
82983ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4
83083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4
83183ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4
832ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4
83383ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[THIS:%.*]], %struct.ST** [[THIS_ADDR]], align 4
83483ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[THIS1:%.*]] = load %struct.ST*, %struct.ST** [[THIS_ADDR]], align 4
83583ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[I:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.ST* [[THIS1]], i32 0, i32 0
83683ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[J:%.*]] = getelementptr inbounds [[STRUCT_ST]], %struct.ST* [[THIS1]], i32 0, i32 1
83783ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP0:%.*]] = getelementptr i32, i32* [[J]], i32 1
83883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP1:%.*]] = bitcast i32* [[I]] to i8*
83983ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP2:%.*]] = bitcast i32* [[TMP0]] to i8*
84083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP3:%.*]] = ptrtoint i8* [[TMP2]] to i64
84183ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP4:%.*]] = ptrtoint i8* [[TMP1]] to i64
84283ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP5:%.*]] = sub i64 [[TMP3]], [[TMP4]]
84383ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    [[TMP6:%.*]] = sdiv exact i64 [[TMP5]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
844*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
845*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP7]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.3 to i8*), i32 24, i1 false)
846*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
847*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
848*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 4
849*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
850*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
851*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I]], i32** [[TMP11]], align 4
852*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
853*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 4
854*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
855*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP13]], align 4
856*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
857*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
858*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 4
859*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
860*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
861*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I]], i32** [[TMP17]], align 4
862ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1
863ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP18]], align 4
864ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2
865ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP20:%.*]] = bitcast i8** [[TMP19]] to %struct.ST**
866ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP20]], align 4
867ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2
868ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP22:%.*]] = bitcast i8** [[TMP21]] to i32**
869ca6fa71bSAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[J]], i32** [[TMP22]], align 4
870*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
871*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP23]], align 4
872*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
873*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
874*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
875*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP27:%.*]] = call i32 @__tgt_target_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887.region_id, i32 3, i8** [[TMP24]], i8** [[TMP25]], i64* [[TMP26]], i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
876*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
877*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    br i1 [[TMP28]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]]
87883ddfa0dSJoel E. Denny // CHECK-NOUSE-I386:       omp_offload.failed:
879*d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__ZN2ST20test_present_membersEv_l887() #[[ATTR3]]
88083ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    br label [[OMP_OFFLOAD_CONT]]
88183ddfa0dSJoel E. Denny // CHECK-NOUSE-I386:       omp_offload.cont:
88283ddfa0dSJoel E. Denny // CHECK-NOUSE-I386-NEXT:    ret void
88383ddfa0dSJoel E. Denny //
88483ddfa0dSJoel E. Denny void ST::test_present_members() {
88583ddfa0dSJoel E. Denny   // Make sure the struct picks up ompx_hold even if another element of the
88683ddfa0dSJoel E. Denny   // struct doesn't have ompx_hold.
88783ddfa0dSJoel E. Denny   #pragma omp target map(tofrom : i) map(ompx_hold, tofrom : j)
88883ddfa0dSJoel E. Denny   {
88983ddfa0dSJoel E. Denny #ifdef USE
89083ddfa0dSJoel E. Denny     i++;
89183ddfa0dSJoel E. Denny     j++;
89283ddfa0dSJoel E. Denny #endif
89383ddfa0dSJoel E. Denny   }
89483ddfa0dSJoel E. Denny }
89583ddfa0dSJoel E. Denny 
89683ddfa0dSJoel E. Denny #endif
897