1d04d9220SAlexey 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 
12*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
16*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
19*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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 
27*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
31*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
34*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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 
46*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
50*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
53*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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 
61*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
65*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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
68*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -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 //.
86d04d9220SAlexey 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]]]
88d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
89d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2427]]]
90d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
91d04d9220SAlexey Bataev // CHECK-USE-PPC64LE: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2020]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
9283ddfa0dSJoel E. Denny //.
93d04d9220SAlexey 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]]]
95d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
96d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2427]]]
97d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
98d04d9220SAlexey Bataev // CHECK-USE-I386: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2020]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
9983ddfa0dSJoel E. Denny //.
100d04d9220SAlexey 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]]]
102d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
103d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2407]]]
104d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
105d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE: @.offload_maptypes.4 = private unnamed_addr constant [3 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002003]]]
10683ddfa0dSJoel E. Denny //.
107d04d9220SAlexey 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]]]
109d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 4]
110d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2407]]]
111d04d9220SAlexey Bataev // CHECK-NOUSE-I386: @.offload_sizes.3 = private unnamed_addr constant [3 x i64] [i64 0, i64 4, i64 4]
112d04d9220SAlexey 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)
154d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
155d04d9220SAlexey 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)
156d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
157d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
158d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 8
159d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
160d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
161d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP19]], align 8
162d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
163d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 8
164d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
165d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP21]], align 8
166d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
167d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
168d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 8
169d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
170d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
171d04d9220SAlexey 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
180d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
181d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP31]], align 8
182d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
183d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
184d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP33]], align 8
185d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
186d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
187d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP35]], align 8
188d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3
189d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP36]], align 8
190d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
191d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
192d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 8
193d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
194d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
195d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 8
196d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
197d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 8
198d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4
199d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP42]], align 8
200d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
201d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
202d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 8
203d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
204d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
205d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 8
206d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 5
207d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP47]], align 8
208d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
209d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
210d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 8
211d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
212d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
213d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 8
214d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 6
215d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP52]], align 8
216d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
217d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
218d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
219d04d9220SAlexey 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)
220d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
221d04d9220SAlexey 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:
223d04d9220SAlexey 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:
226d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
227d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
228d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP59]], align 8
229d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
230d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
231d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP61]], align 8
232d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
233d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP62]], align 8
234d04d9220SAlexey 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
236d04d9220SAlexey 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)
237d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
238d04d9220SAlexey 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:
240d04d9220SAlexey 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)
279d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
280d04d9220SAlexey 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)
281d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
282d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
283d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 4
284d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
285d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
286d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I]], i32** [[TMP19]], align 4
287d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
288d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 4
289d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
290d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP21]], align 4
291d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
292d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
293d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 4
294d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
295d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
296d04d9220SAlexey 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
305d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
306d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP31]], align 4
307d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
308d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
309d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP33]], align 4
310d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
311d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
312d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP35]], align 4
313d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3
314d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP36]], align 4
315d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
316d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
317d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 4
318d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
319d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
320d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 4
321d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
322d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 4
323d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 4
324d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP42]], align 4
325d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
326d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
327d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 4
328d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
329d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
330d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 4
331d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 5
332d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP47]], align 4
333d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
334d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
335d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 4
336d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
337d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
338d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 4
339d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 6
340d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP52]], align 4
341d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
342d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
343d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
344d04d9220SAlexey 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)
345d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
346d04d9220SAlexey 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:
348d04d9220SAlexey 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:
351d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
352d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
353d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP59]], align 4
354d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
355d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
356d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[A]], i32** [[TMP61]], align 4
357d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
358d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP62]], align 4
359d04d9220SAlexey 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
361d04d9220SAlexey 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)
362d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
363d04d9220SAlexey 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:
365d04d9220SAlexey 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)
404d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
405d04d9220SAlexey 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)
406d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
407d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
408d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 8
409d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
410d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
411d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP19]], align 8
412d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
413d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 8
414d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
415d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP21]], align 8
416d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
417d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
418d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 8
419d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
420d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
421d04d9220SAlexey 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
430d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
431d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP31]], align 8
432d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
433d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
434d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP33]], align 8
435d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
436d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
437d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP35]], align 8
438d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 3
439d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP36]], align 8
440d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
441d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
442d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 8
443d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
444d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
445d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 8
446d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
447d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 8
448d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 4
449d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP42]], align 8
450d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
451d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
452d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 8
453d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
454d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
455d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 8
456d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 5
457d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP47]], align 8
458d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
459d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
460d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 8
461d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
462d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
463d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 8
464d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 6
465d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP52]], align 8
466d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
467d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
468d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
469d04d9220SAlexey 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)
470d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
471d04d9220SAlexey 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:
473d04d9220SAlexey 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:
476d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
477d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
478d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP59]], align 8
479d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
480d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
481d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[A]], i32** [[TMP61]], align 8
482d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i64 0, i64 0
483d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP62]], align 8
484d04d9220SAlexey 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
486d04d9220SAlexey 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)
487d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
488d04d9220SAlexey 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:
490d04d9220SAlexey 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)
529d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP15:%.*]] = bitcast [7 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
530d04d9220SAlexey 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)
531d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
532d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to %struct.ST**
533d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP17]], align 4
534d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
535d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP19:%.*]] = bitcast i8** [[TMP18]] to i32**
536d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I]], i32** [[TMP19]], align 4
537d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
538d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i64 [[TMP7]], i64* [[TMP20]], align 4
539d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
540d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP21]], align 4
541d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
542d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to %struct.ST**
543d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST1]], %struct.ST** [[TMP23]], align 4
544d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
545d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32**
546d04d9220SAlexey 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
555d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP31:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
556d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP31]], align 4
557d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 3
558d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP33:%.*]] = bitcast i8** [[TMP32]] to i32**
559d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP33]], align 4
560d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 3
561d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP35:%.*]] = bitcast i8** [[TMP34]] to i32**
562d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP35]], align 4
563d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP36:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 3
564d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP36]], align 4
565d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP37:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 4
566d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP38:%.*]] = bitcast i8** [[TMP37]] to %struct.ST**
567d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP38]], align 4
568d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP39:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 4
569d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP40:%.*]] = bitcast i8** [[TMP39]] to i32**
570d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I1]], i32** [[TMP40]], align 4
571d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP41:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
572d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i64 [[TMP14]], i64* [[TMP41]], align 4
573d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 4
574d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP42]], align 4
575d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP43:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 5
576d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP44:%.*]] = bitcast i8** [[TMP43]] to %struct.ST**
577d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP44]], align 4
578d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP45:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 5
579d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP46:%.*]] = bitcast i8** [[TMP45]] to i32**
580d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I1]], i32** [[TMP46]], align 4
581d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 5
582d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP47]], align 4
583d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP48:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 6
584d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP49:%.*]] = bitcast i8** [[TMP48]] to %struct.ST**
585d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[ST2]], %struct.ST** [[TMP49]], align 4
586d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP50:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 6
587d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP51:%.*]] = bitcast i8** [[TMP50]] to i32**
588d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[J2]], i32** [[TMP51]], align 4
589d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP52:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 6
590d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP52]], align 4
591d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP53:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
592d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP54:%.*]] = getelementptr inbounds [7 x i8*], [7 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
593d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP55:%.*]] = getelementptr inbounds [7 x i64], [7 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
594d04d9220SAlexey 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)
595d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP57:%.*]] = icmp ne i32 [[TMP56]], 0
596d04d9220SAlexey 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:
598d04d9220SAlexey 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:
601d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP58:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS3]], i32 0, i32 0
602d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP59:%.*]] = bitcast i8** [[TMP58]] to i32**
603d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP59]], align 4
604d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS4]], i32 0, i32 0
605d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP61:%.*]] = bitcast i8** [[TMP60]] to i32**
606d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[A]], i32** [[TMP61]], align 4
607d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP62:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS5]], i32 0, i32 0
608d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP62]], align 4
609d04d9220SAlexey 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
611d04d9220SAlexey 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)
612d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP66:%.*]] = icmp ne i32 [[TMP65]], 0
613d04d9220SAlexey 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:
615d04d9220SAlexey 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)
670d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
671d04d9220SAlexey 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)
672d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
673d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
674d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 8
675d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
676d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
677d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP11]], align 8
678d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
679d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 8
680d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
681d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP13]], align 8
682d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
683d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
684d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 8
685d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
686d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
687d04d9220SAlexey 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
696d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
697d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    store i8* null, i8** [[TMP23]], align 8
698d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
699d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
700d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
701d04d9220SAlexey 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)
702d04d9220SAlexey Bataev // CHECK-USE-PPC64LE-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
703d04d9220SAlexey 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:
705d04d9220SAlexey 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)
728d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
729d04d9220SAlexey 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)
730d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
731d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
732d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 4
733d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
734d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
735d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i32* [[I]], i32** [[TMP11]], align 4
736d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
737d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 4
738d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
739d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP13]], align 4
740d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
741d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
742d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 4
743d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
744d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
745d04d9220SAlexey 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
754d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
755d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    store i8* null, i8** [[TMP23]], align 4
756d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
757d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
758d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
759d04d9220SAlexey 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)
760d04d9220SAlexey Bataev // CHECK-USE-I386-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
761d04d9220SAlexey 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:
763d04d9220SAlexey 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)
786d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
787d04d9220SAlexey 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)
788d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
789d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
790d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 8
791d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
792d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
793d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i32* [[I]], i32** [[TMP11]], align 8
794d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
795d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 8
796d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
797d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP13]], align 8
798d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
799d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
800d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 8
801d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
802d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
803d04d9220SAlexey 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
812d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 2
813d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    store i8* null, i8** [[TMP23]], align 8
814d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
815d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
816d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
817d04d9220SAlexey 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)
818d04d9220SAlexey Bataev // CHECK-NOUSE-PPC64LE-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
819d04d9220SAlexey 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:
821d04d9220SAlexey 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)
844d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP7:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8*
845d04d9220SAlexey 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)
846d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
847d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP9:%.*]] = bitcast i8** [[TMP8]] to %struct.ST**
848d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP9]], align 4
849d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
850d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to i32**
851d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i32* [[I]], i32** [[TMP11]], align 4
852d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
853d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i64 [[TMP6]], i64* [[TMP12]], align 4
854d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP13:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
855d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP13]], align 4
856d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1
857d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP15:%.*]] = bitcast i8** [[TMP14]] to %struct.ST**
858d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store %struct.ST* [[THIS1]], %struct.ST** [[TMP15]], align 4
859d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1
860d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP17:%.*]] = bitcast i8** [[TMP16]] to i32**
861d04d9220SAlexey 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
870d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP23:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2
871d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    store i8* null, i8** [[TMP23]], align 4
872d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
873d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
874d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
875d04d9220SAlexey 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)
876d04d9220SAlexey Bataev // CHECK-NOUSE-I386-NEXT:    [[TMP28:%.*]] = icmp ne i32 [[TMP27]], 0
877d04d9220SAlexey 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:
879d04d9220SAlexey 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