1*ca6fa71bSAlexey Bataev // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals --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 // powerpc64le-ibm-linux-gnu
783ddfa0dSJoel E. Denny 
883ddfa0dSJoel E. Denny // RUN: %clang_cc1 -verify -fopenmp -fopenmp-extensions \
983ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ \
1083ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | \
1183ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-PPC64LE
1283ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
1383ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 \
1483ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
1583ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
1683ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ \
1783ddfa0dSJoel E. Denny // RUN:     -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t \
1883ddfa0dSJoel E. Denny // RUN:     -verify %s -emit-llvm -o - | \
1983ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-PPC64LE
2083ddfa0dSJoel E. Denny 
2183ddfa0dSJoel E. Denny // i386-pc-linux-gnu
2283ddfa0dSJoel E. Denny 
2383ddfa0dSJoel E. Denny // RUN: %clang_cc1 -verify -fopenmp -fopenmp-extensions \
2483ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ \
2583ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -emit-llvm %s -o - | \
2683ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-I386
2783ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
2883ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 \
2983ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -emit-pch -o %t %s
3083ddfa0dSJoel E. Denny // RUN: %clang_cc1 -fopenmp -fopenmp-extensions \
3183ddfa0dSJoel E. Denny // RUN:     -fopenmp-targets=i386-pc-linux-gnu -x c++ \
3283ddfa0dSJoel E. Denny // RUN:     -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s \
3383ddfa0dSJoel E. Denny // RUN:     -emit-llvm -o - | \
3483ddfa0dSJoel E. Denny // RUN:   FileCheck %s --check-prefixes=CHECK-I386
3583ddfa0dSJoel E. Denny 
3683ddfa0dSJoel E. Denny struct S1 {
3783ddfa0dSJoel E. Denny   int i;
3883ddfa0dSJoel E. Denny };
3983ddfa0dSJoel E. Denny struct S2 {
4083ddfa0dSJoel E. Denny   S1 s;
4183ddfa0dSJoel E. Denny   struct S2 *ps;
4283ddfa0dSJoel E. Denny };
4383ddfa0dSJoel E. Denny 
4483ddfa0dSJoel E. Denny // Map flags used in @.offload_maptypes* below:
4583ddfa0dSJoel E. Denny //
4683ddfa0dSJoel E. Denny //   TO          = 0x1
4783ddfa0dSJoel E. Denny //   FROM        = 0x2
4883ddfa0dSJoel E. Denny //   ALWAYS      = 0x4
4983ddfa0dSJoel E. Denny //   PTR_AND_OBJ = 0x10
5083ddfa0dSJoel E. Denny //   CLOSE       = 0x400
5183ddfa0dSJoel E. Denny //   OMPX_HOLD   = 0x2000
5283ddfa0dSJoel E. Denny //   MEMBER_OF_1 = 0x1000000000000
5383ddfa0dSJoel E. Denny //   MEMBER_OF_7 = 0x7000000000000
5483ddfa0dSJoel E. Denny 
5583ddfa0dSJoel E. Denny //.
5683ddfa0dSJoel E. Denny // CHECK-PPC64LE: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 20]
5783ddfa0dSJoel E. Denny // CHECK-PPC64LE: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 [[#0x2001]]]
5883ddfa0dSJoel E. Denny // CHECK-PPC64LE: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 20]
5983ddfa0dSJoel E. Denny // CHECK-PPC64LE: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2405]]]
6083ddfa0dSJoel E. Denny // CHECK-PPC64LE: @.offload_sizes.3 = private unnamed_addr constant [1 x i64] [i64 4]
6183ddfa0dSJoel E. Denny // CHECK-PPC64LE: @.offload_maptypes.4 = private unnamed_addr constant [1 x i64] [i64 [[#0x2003]]]
62*ca6fa71bSAlexey Bataev // CHECK-PPC64LE: @.offload_maptypes.5 = private unnamed_addr constant [11 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002010]], i64 [[#0x2010]], i64 [[#0x2013]], i64 [[#0x3]], i64 [[#0x2000]], i64 [[#0x7000000002003]], i64 [[#0x7000000002010]], i64 [[#0x2010]], i64 [[#0x2013]]]
6383ddfa0dSJoel E. Denny //.
6483ddfa0dSJoel E. Denny // CHECK-I386: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 20]
6583ddfa0dSJoel E. Denny // CHECK-I386: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 [[#0x2001]]]
6683ddfa0dSJoel E. Denny // CHECK-I386: @.offload_sizes.1 = private unnamed_addr constant [1 x i64] [i64 20]
6783ddfa0dSJoel E. Denny // CHECK-I386: @.offload_maptypes.2 = private unnamed_addr constant [1 x i64] [i64 [[#0x2405]]]
6883ddfa0dSJoel E. Denny // CHECK-I386: @.offload_sizes.3 = private unnamed_addr constant [1 x i64] [i64 4]
6983ddfa0dSJoel E. Denny // CHECK-I386: @.offload_maptypes.4 = private unnamed_addr constant [1 x i64] [i64 [[#0x2003]]]
70*ca6fa71bSAlexey Bataev // CHECK-I386: @.offload_maptypes.5 = private unnamed_addr constant [11 x i64] [i64 [[#0x2000]], i64 [[#0x1000000002003]], i64 [[#0x1000000002010]], i64 [[#0x2010]], i64 [[#0x2013]], i64 [[#0x3]], i64 [[#0x2000]], i64 [[#0x7000000002003]], i64 [[#0x7000000002010]], i64 [[#0x2010]], i64 [[#0x2013]]]
7183ddfa0dSJoel E. Denny //.
7283ddfa0dSJoel E. Denny // CHECK-PPC64LE-LABEL: @_Z3fooi(
7383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:  entry:
7483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[ARG_ADDR:%.*]] = alloca i32, align 4
7583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[LB:%.*]] = alloca [5 x float], align 4
7683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS1:%.*]] = alloca %struct.S2*, align 8
7783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS2:%.*]] = alloca %struct.S2*, align 8
7883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8
7983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8
8083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8
8183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 8
8283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 8
8383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 8
8483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [1 x i8*], align 8
8583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [1 x i8*], align 8
8683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [1 x i8*], align 8
8783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_BASEPTRS29:%.*]] = alloca [11 x i8*], align 8
8883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_PTRS30:%.*]] = alloca [11 x i8*], align 8
8983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_MAPPERS31:%.*]] = alloca [11 x i8*], align 8
90*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [11 x i64], align 8
9183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32 [[ARG:%.*]], i32* [[ARG_ADDR]], align 4
9283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
9383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [5 x float]**
9483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP1]], align 8
9583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
9683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [5 x float]**
9783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP3]], align 8
9883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0
9983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP4]], align 8
10083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
10183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
10283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
10383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP7:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
10483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
10583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32 [[INC]], i32* [[ARG_ADDR]], align 4
10683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
10783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
10883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP8]], i8** [[TMP9]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
10983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
11083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to [5 x float]**
11183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP11]], align 8
11283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
11383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to [5 x float]**
11483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP13]], align 8
11583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i64 0, i64 0
11683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP14]], align 8
11783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
11883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
11983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP15]], i8** [[TMP16]], 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)
12083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP17:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
12183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[INC4:%.*]] = add nsw i32 [[TMP17]], 1
12283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32 [[INC4]], i32* [[ARG_ADDR]], align 4
12383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
12483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
12583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP18]], i8** [[TMP19]], 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)
12683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
12783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
12883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP21]], align 8
12983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
13083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32**
13183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP23]], align 8
13283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i64 0, i64 0
13383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP24]], align 8
13483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
13583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
13683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP25]], i8** [[TMP26]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.3, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
13783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
13883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[INC8:%.*]] = add nsw i32 [[TMP27]], 1
13983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32 [[INC8]], i32* [[ARG_ADDR]], align 4
14083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
14183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
14283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP28]], i8** [[TMP29]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.3, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
14383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP30:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
14483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP31:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
14583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[S:%.*]] = getelementptr inbounds [[STRUCT_S2:%.*]], %struct.S2* [[TMP31]], i32 0, i32 0
14683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP32:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
14783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP33:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
14883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP33]], i32 0, i32 1
14983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP34:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
15083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS9:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP34]], i32 0, i32 1
15183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP35:%.*]] = load %struct.S2*, %struct.S2** [[PS9]], align 8
15283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS10:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP35]], i32 0, i32 1
15383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP36:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
15483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS11:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP36]], i32 0, i32 1
15583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP37:%.*]] = load %struct.S2*, %struct.S2** [[PS11]], align 8
15683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS12:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP37]], i32 0, i32 1
15783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP38:%.*]] = load %struct.S2*, %struct.S2** [[PS12]], align 8
15883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS13:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP38]], i32 0, i32 1
15983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP39:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 8
16083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS14:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP39]], i32 0, i32 1
16183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP40:%.*]] = load %struct.S2*, %struct.S2** [[PS14]], align 8
16283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS15:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP40]], i32 0, i32 1
16383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP41:%.*]] = load %struct.S2*, %struct.S2** [[PS15]], align 8
16483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS16:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP41]], i32 0, i32 1
16583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP42:%.*]] = load %struct.S2*, %struct.S2** [[PS16]], align 8
16683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[S17:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP42]], i32 0, i32 0
16783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP43:%.*]] = getelementptr %struct.S2*, %struct.S2** [[PS]], i32 1
16883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP44:%.*]] = bitcast %struct.S1* [[S]] to i8*
16983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP45:%.*]] = bitcast %struct.S2** [[TMP43]] to i8*
17083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP46:%.*]] = ptrtoint i8* [[TMP45]] to i64
17183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP47:%.*]] = ptrtoint i8* [[TMP44]] to i64
17283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP48:%.*]] = sub i64 [[TMP46]], [[TMP47]]
17383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP49:%.*]] = sdiv exact i64 [[TMP48]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
17483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP50:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
17583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP51:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
17683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[S18:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP51]], i32 0, i32 0
17783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP52:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
17883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP53:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
17983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS19:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP53]], i32 0, i32 1
18083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP54:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
18183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS20:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP54]], i32 0, i32 1
18283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP55:%.*]] = load %struct.S2*, %struct.S2** [[PS20]], align 8
18383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS21:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP55]], i32 0, i32 1
18483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP56:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
18583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS22:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP56]], i32 0, i32 1
18683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP57:%.*]] = load %struct.S2*, %struct.S2** [[PS22]], align 8
18783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS23:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP57]], i32 0, i32 1
18883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP58:%.*]] = load %struct.S2*, %struct.S2** [[PS23]], align 8
18983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS24:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP58]], i32 0, i32 1
19083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP59:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 8
19183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS25:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP59]], i32 0, i32 1
19283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP60:%.*]] = load %struct.S2*, %struct.S2** [[PS25]], align 8
19383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS26:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP60]], i32 0, i32 1
19483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP61:%.*]] = load %struct.S2*, %struct.S2** [[PS26]], align 8
19583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[PS27:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP61]], i32 0, i32 1
19683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP62:%.*]] = load %struct.S2*, %struct.S2** [[PS27]], align 8
19783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[S28:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP62]], i32 0, i32 0
19883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP63:%.*]] = getelementptr %struct.S2*, %struct.S2** [[PS19]], i32 1
19983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP64:%.*]] = bitcast %struct.S1* [[S18]] to i8*
20083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP65:%.*]] = bitcast %struct.S2** [[TMP63]] to i8*
20183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP66:%.*]] = ptrtoint i8* [[TMP65]] to i64
20283ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP67:%.*]] = ptrtoint i8* [[TMP64]] to i64
20383ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP68:%.*]] = sub i64 [[TMP66]], [[TMP67]]
20483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP69:%.*]] = sdiv exact i64 [[TMP68]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
20583ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 0
20683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP71:%.*]] = bitcast i8** [[TMP70]] to %struct.S2**
20783ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store %struct.S2* [[TMP30]], %struct.S2** [[TMP71]], align 8
20883ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 0
20983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to %struct.S1**
21083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store %struct.S1* [[S]], %struct.S1** [[TMP73]], align 8
211*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
212*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 [[TMP49]], i64* [[TMP74]], align 8
213*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 0
214*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP75]], align 8
215*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 1
216*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP77:%.*]] = bitcast i8** [[TMP76]] to %struct.S2**
217*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2* [[TMP30]], %struct.S2** [[TMP77]], align 8
218*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 1
219*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP79:%.*]] = bitcast i8** [[TMP78]] to %struct.S1**
220*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S1* [[S]], %struct.S1** [[TMP79]], align 8
221*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 1
222*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 4, i64* [[TMP80]], align 8
223*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 1
224*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP81]], align 8
225*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 2
22683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP83:%.*]] = bitcast i8** [[TMP82]] to %struct.S2***
227*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS]], %struct.S2*** [[TMP83]], align 8
228*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 2
229*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP85:%.*]] = bitcast i8** [[TMP84]] to %struct.S2***
230*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS10]], %struct.S2*** [[TMP85]], align 8
231*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
232*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 8, i64* [[TMP86]], align 8
233*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 2
234*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP87]], align 8
235*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 3
236*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to %struct.S2***
237*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS10]], %struct.S2*** [[TMP89]], align 8
238*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 3
23983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP91:%.*]] = bitcast i8** [[TMP90]] to %struct.S2***
24083ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS13]], %struct.S2*** [[TMP91]], align 8
241*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 3
242*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 8, i64* [[TMP92]], align 8
243*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 3
244*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP93]], align 8
245*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 4
246*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP95:%.*]] = bitcast i8** [[TMP94]] to %struct.S2***
247*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS13]], %struct.S2*** [[TMP95]], align 8
248*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 4
249*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP97:%.*]] = bitcast i8** [[TMP96]] to %struct.S1**
250*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S1* [[S17]], %struct.S1** [[TMP97]], align 8
251*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
252*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 4, i64* [[TMP98]], align 8
253*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 4
25483ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP99]], align 8
255*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 5
256*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP101:%.*]] = bitcast i8** [[TMP100]] to i32**
257*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP101]], align 8
258*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP102:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 5
259*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP103:%.*]] = bitcast i8** [[TMP102]] to i32**
260*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP103]], align 8
261*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP104:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 5
262*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 4, i64* [[TMP104]], align 8
263*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 5
264*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP105]], align 8
265*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 6
266*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP107:%.*]] = bitcast i8** [[TMP106]] to %struct.S2**
267*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2* [[TMP50]], %struct.S2** [[TMP107]], align 8
268*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 6
269*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP109:%.*]] = bitcast i8** [[TMP108]] to %struct.S1**
270*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S1* [[S18]], %struct.S1** [[TMP109]], align 8
271*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 6
272*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 [[TMP69]], i64* [[TMP110]], align 8
273*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP111:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 6
274*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP111]], align 8
275*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP112:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 7
276*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP113:%.*]] = bitcast i8** [[TMP112]] to %struct.S2**
277*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2* [[TMP50]], %struct.S2** [[TMP113]], align 8
278*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP114:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 7
279*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP115:%.*]] = bitcast i8** [[TMP114]] to %struct.S1**
280*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S1* [[S18]], %struct.S1** [[TMP115]], align 8
281*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 7
282*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 4, i64* [[TMP116]], align 8
283*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 7
284*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP117]], align 8
285*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP118:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 8
286*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP119:%.*]] = bitcast i8** [[TMP118]] to %struct.S2***
287*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS19]], %struct.S2*** [[TMP119]], align 8
288*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP120:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 8
28983ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    [[TMP121:%.*]] = bitcast i8** [[TMP120]] to %struct.S2***
290*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS21]], %struct.S2*** [[TMP121]], align 8
291*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 8
292*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 8, i64* [[TMP122]], align 8
293*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 8
294*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP123]], align 8
295*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP124:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 9
296*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP125:%.*]] = bitcast i8** [[TMP124]] to %struct.S2***
297*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS21]], %struct.S2*** [[TMP125]], align 8
298*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP126:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 9
299*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP127:%.*]] = bitcast i8** [[TMP126]] to %struct.S2***
300*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS24]], %struct.S2*** [[TMP127]], align 8
301*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 9
302*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 8, i64* [[TMP128]], align 8
303*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP129:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 9
304*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP129]], align 8
305*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 10
306*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP131:%.*]] = bitcast i8** [[TMP130]] to %struct.S2***
307*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S2** [[PS24]], %struct.S2*** [[TMP131]], align 8
308*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP132:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 10
309*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP133:%.*]] = bitcast i8** [[TMP132]] to %struct.S1**
310*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store %struct.S1* [[S28]], %struct.S1** [[TMP133]], align 8
311*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP134:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 10
312*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i64 4, i64* [[TMP134]], align 8
313*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP135:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i64 0, i64 10
314*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    store i8* null, i8** [[TMP135]], align 8
315*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP136:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 0
316*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP137:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 0
317*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
318*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 11, i8** [[TMP136]], i8** [[TMP137]], i64* [[TMP138]], i64* getelementptr inbounds ([11 x i64], [11 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null)
319*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP139:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
320*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[INC32:%.*]] = add nsw i32 [[TMP139]], 1
32183ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    store i32 [[INC32]], i32* [[ARG_ADDR]], align 4
322*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 0
323*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP141:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 0
324*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
325*ca6fa71bSAlexey Bataev // CHECK-PPC64LE-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 11, i8** [[TMP140]], i8** [[TMP141]], i64* [[TMP142]], i64* getelementptr inbounds ([11 x i64], [11 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null)
32683ddfa0dSJoel E. Denny // CHECK-PPC64LE-NEXT:    ret void
32783ddfa0dSJoel E. Denny //
32883ddfa0dSJoel E. Denny // CHECK-I386-LABEL: @_Z3fooi(
32983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:  entry:
33083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[ARG_ADDR:%.*]] = alloca i32, align 4
33183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[LB:%.*]] = alloca [5 x float], align 4
33283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS1:%.*]] = alloca %struct.S2*, align 4
33383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS2:%.*]] = alloca %struct.S2*, align 4
33483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 4
33583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 4
33683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 4
33783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 4
33883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 4
33983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 4
34083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS5:%.*]] = alloca [1 x i8*], align 4
34183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_PTRS6:%.*]] = alloca [1 x i8*], align 4
34283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_MAPPERS7:%.*]] = alloca [1 x i8*], align 4
34383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_BASEPTRS29:%.*]] = alloca [11 x i8*], align 4
34483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_PTRS30:%.*]] = alloca [11 x i8*], align 4
34583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[DOTOFFLOAD_MAPPERS31:%.*]] = alloca [11 x i8*], align 4
346*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[DOTOFFLOAD_SIZES:%.*]] = alloca [11 x i64], align 4
34783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32 [[ARG:%.*]], i32* [[ARG_ADDR]], align 4
34883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
34983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [5 x float]**
35083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP1]], align 4
35183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
35283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP3:%.*]] = bitcast i8** [[TMP2]] to [5 x float]**
35383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP3]], align 4
35483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0
35583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i8* null, i8** [[TMP4]], align 4
35683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
35783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
35883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1:[0-9]+]], i64 -1, i32 1, i8** [[TMP5]], i8** [[TMP6]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
35983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP7:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
36083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP7]], 1
36183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32 [[INC]], i32* [[ARG_ADDR]], align 4
36283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP8:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0
36383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0
36483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP8]], i8** [[TMP9]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i8** null, i8** null)
36583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP10:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
36683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP11:%.*]] = bitcast i8** [[TMP10]] to [5 x float]**
36783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP11]], align 4
36883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP12:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
36983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP13:%.*]] = bitcast i8** [[TMP12]] to [5 x float]**
37083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store [5 x float]* [[LB]], [5 x float]** [[TMP13]], align 4
37183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP14:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i32 0, i32 0
37283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i8* null, i8** [[TMP14]], align 4
37383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP15:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
37483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP16:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
37583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP15]], i8** [[TMP16]], 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)
37683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP17:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
37783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[INC4:%.*]] = add nsw i32 [[TMP17]], 1
37883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32 [[INC4]], i32* [[ARG_ADDR]], align 4
37983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0
38083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0
38183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP18]], i8** [[TMP19]], 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)
38283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
38383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP21:%.*]] = bitcast i8** [[TMP20]] to i32**
38483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP21]], align 4
38583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
38683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32**
38783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP23]], align 4
38883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS7]], i32 0, i32 0
38983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i8* null, i8** [[TMP24]], align 4
39083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP25:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
39183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
39283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP25]], i8** [[TMP26]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.3, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
39383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP27:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
39483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[INC8:%.*]] = add nsw i32 [[TMP27]], 1
39583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32 [[INC8]], i32* [[ARG_ADDR]], align 4
39683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP28:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS5]], i32 0, i32 0
39783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP29:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS6]], i32 0, i32 0
39883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 1, i8** [[TMP28]], i8** [[TMP29]], i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.3, i32 0, i32 0), i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.4, i32 0, i32 0), i8** null, i8** null)
39983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP30:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
40083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP31:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
40183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[S:%.*]] = getelementptr inbounds [[STRUCT_S2:%.*]], %struct.S2* [[TMP31]], i32 0, i32 0
40283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP32:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
40383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP33:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
40483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP33]], i32 0, i32 1
40583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP34:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
40683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS9:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP34]], i32 0, i32 1
40783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP35:%.*]] = load %struct.S2*, %struct.S2** [[PS9]], align 4
40883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS10:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP35]], i32 0, i32 1
40983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP36:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
41083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS11:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP36]], i32 0, i32 1
41183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP37:%.*]] = load %struct.S2*, %struct.S2** [[PS11]], align 4
41283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS12:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP37]], i32 0, i32 1
41383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP38:%.*]] = load %struct.S2*, %struct.S2** [[PS12]], align 4
41483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS13:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP38]], i32 0, i32 1
41583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP39:%.*]] = load %struct.S2*, %struct.S2** [[PS1]], align 4
41683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS14:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP39]], i32 0, i32 1
41783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP40:%.*]] = load %struct.S2*, %struct.S2** [[PS14]], align 4
41883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS15:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP40]], i32 0, i32 1
41983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP41:%.*]] = load %struct.S2*, %struct.S2** [[PS15]], align 4
42083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS16:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP41]], i32 0, i32 1
42183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP42:%.*]] = load %struct.S2*, %struct.S2** [[PS16]], align 4
42283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[S17:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP42]], i32 0, i32 0
42383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP43:%.*]] = getelementptr %struct.S2*, %struct.S2** [[PS]], i32 1
42483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP44:%.*]] = bitcast %struct.S1* [[S]] to i8*
42583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP45:%.*]] = bitcast %struct.S2** [[TMP43]] to i8*
42683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP46:%.*]] = ptrtoint i8* [[TMP45]] to i64
42783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP47:%.*]] = ptrtoint i8* [[TMP44]] to i64
42883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP48:%.*]] = sub i64 [[TMP46]], [[TMP47]]
42983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP49:%.*]] = sdiv exact i64 [[TMP48]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
43083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP50:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
43183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP51:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
43283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[S18:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP51]], i32 0, i32 0
43383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP52:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
43483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP53:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
43583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS19:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP53]], i32 0, i32 1
43683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP54:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
43783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS20:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP54]], i32 0, i32 1
43883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP55:%.*]] = load %struct.S2*, %struct.S2** [[PS20]], align 4
43983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS21:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP55]], i32 0, i32 1
44083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP56:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
44183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS22:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP56]], i32 0, i32 1
44283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP57:%.*]] = load %struct.S2*, %struct.S2** [[PS22]], align 4
44383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS23:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP57]], i32 0, i32 1
44483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP58:%.*]] = load %struct.S2*, %struct.S2** [[PS23]], align 4
44583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS24:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP58]], i32 0, i32 1
44683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP59:%.*]] = load %struct.S2*, %struct.S2** [[PS2]], align 4
44783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS25:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP59]], i32 0, i32 1
44883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP60:%.*]] = load %struct.S2*, %struct.S2** [[PS25]], align 4
44983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS26:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP60]], i32 0, i32 1
45083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP61:%.*]] = load %struct.S2*, %struct.S2** [[PS26]], align 4
45183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[PS27:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP61]], i32 0, i32 1
45283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP62:%.*]] = load %struct.S2*, %struct.S2** [[PS27]], align 4
45383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[S28:%.*]] = getelementptr inbounds [[STRUCT_S2]], %struct.S2* [[TMP62]], i32 0, i32 0
45483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP63:%.*]] = getelementptr %struct.S2*, %struct.S2** [[PS19]], i32 1
45583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP64:%.*]] = bitcast %struct.S1* [[S18]] to i8*
45683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP65:%.*]] = bitcast %struct.S2** [[TMP63]] to i8*
45783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP66:%.*]] = ptrtoint i8* [[TMP65]] to i64
45883ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP67:%.*]] = ptrtoint i8* [[TMP64]] to i64
45983ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP68:%.*]] = sub i64 [[TMP66]], [[TMP67]]
46083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP69:%.*]] = sdiv exact i64 [[TMP68]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
46183ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP70:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 0
46283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP71:%.*]] = bitcast i8** [[TMP70]] to %struct.S2**
46383ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store %struct.S2* [[TMP30]], %struct.S2** [[TMP71]], align 4
46483ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP72:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 0
46583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP73:%.*]] = bitcast i8** [[TMP72]] to %struct.S1**
46683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store %struct.S1* [[S]], %struct.S1** [[TMP73]], align 4
467*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP74:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
468*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 [[TMP49]], i64* [[TMP74]], align 4
469*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP75:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 0
470*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP75]], align 4
471*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP76:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 1
472*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP77:%.*]] = bitcast i8** [[TMP76]] to %struct.S2**
473*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2* [[TMP30]], %struct.S2** [[TMP77]], align 4
474*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP78:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 1
475*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP79:%.*]] = bitcast i8** [[TMP78]] to %struct.S1**
476*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S1* [[S]], %struct.S1** [[TMP79]], align 4
477*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP80:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 1
478*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP80]], align 4
479*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP81:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 1
480*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP81]], align 4
481*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP82:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 2
48283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP83:%.*]] = bitcast i8** [[TMP82]] to %struct.S2***
483*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS]], %struct.S2*** [[TMP83]], align 4
484*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP84:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 2
485*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP85:%.*]] = bitcast i8** [[TMP84]] to %struct.S2***
486*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS10]], %struct.S2*** [[TMP85]], align 4
487*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP86:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2
488*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP86]], align 4
489*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP87:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 2
490*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP87]], align 4
491*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP88:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 3
492*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP89:%.*]] = bitcast i8** [[TMP88]] to %struct.S2***
493*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS10]], %struct.S2*** [[TMP89]], align 4
494*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP90:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 3
49583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP91:%.*]] = bitcast i8** [[TMP90]] to %struct.S2***
49683ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store %struct.S2** [[PS13]], %struct.S2*** [[TMP91]], align 4
497*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP92:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 3
498*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP92]], align 4
499*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP93:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 3
500*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP93]], align 4
501*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP94:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 4
502*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP95:%.*]] = bitcast i8** [[TMP94]] to %struct.S2***
503*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS13]], %struct.S2*** [[TMP95]], align 4
504*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP96:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 4
505*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP97:%.*]] = bitcast i8** [[TMP96]] to %struct.S1**
506*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S1* [[S17]], %struct.S1** [[TMP97]], align 4
507*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP98:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 4
508*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP98]], align 4
509*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP99:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 4
51083ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i8* null, i8** [[TMP99]], align 4
511*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP100:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 5
512*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP101:%.*]] = bitcast i8** [[TMP100]] to i32**
513*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP101]], align 4
514*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP102:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 5
515*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP103:%.*]] = bitcast i8** [[TMP102]] to i32**
516*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i32* [[ARG_ADDR]], i32** [[TMP103]], align 4
517*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP104:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 5
518*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP104]], align 4
519*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP105:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 5
520*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP105]], align 4
521*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP106:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 6
522*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP107:%.*]] = bitcast i8** [[TMP106]] to %struct.S2**
523*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2* [[TMP50]], %struct.S2** [[TMP107]], align 4
524*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP108:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 6
525*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP109:%.*]] = bitcast i8** [[TMP108]] to %struct.S1**
526*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S1* [[S18]], %struct.S1** [[TMP109]], align 4
527*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP110:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 6
528*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 [[TMP69]], i64* [[TMP110]], align 4
529*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP111:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 6
530*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP111]], align 4
531*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP112:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 7
532*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP113:%.*]] = bitcast i8** [[TMP112]] to %struct.S2**
533*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2* [[TMP50]], %struct.S2** [[TMP113]], align 4
534*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP114:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 7
535*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP115:%.*]] = bitcast i8** [[TMP114]] to %struct.S1**
536*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S1* [[S18]], %struct.S1** [[TMP115]], align 4
537*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP116:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 7
538*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP116]], align 4
539*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP117:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 7
540*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP117]], align 4
541*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP118:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 8
542*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP119:%.*]] = bitcast i8** [[TMP118]] to %struct.S2***
543*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS19]], %struct.S2*** [[TMP119]], align 4
544*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP120:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 8
54583ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    [[TMP121:%.*]] = bitcast i8** [[TMP120]] to %struct.S2***
546*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS21]], %struct.S2*** [[TMP121]], align 4
547*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP122:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 8
548*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP122]], align 4
549*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP123:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 8
550*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP123]], align 4
551*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP124:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 9
552*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP125:%.*]] = bitcast i8** [[TMP124]] to %struct.S2***
553*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS21]], %struct.S2*** [[TMP125]], align 4
554*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP126:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 9
555*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP127:%.*]] = bitcast i8** [[TMP126]] to %struct.S2***
556*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS24]], %struct.S2*** [[TMP127]], align 4
557*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP128:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 9
558*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP128]], align 4
559*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP129:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 9
560*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP129]], align 4
561*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP130:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 10
562*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP131:%.*]] = bitcast i8** [[TMP130]] to %struct.S2***
563*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S2** [[PS24]], %struct.S2*** [[TMP131]], align 4
564*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP132:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 10
565*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP133:%.*]] = bitcast i8** [[TMP132]] to %struct.S1**
566*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store %struct.S1* [[S28]], %struct.S1** [[TMP133]], align 4
567*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP134:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 10
568*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i64 4, i64* [[TMP134]], align 4
569*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP135:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_MAPPERS31]], i32 0, i32 10
570*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    store i8* null, i8** [[TMP135]], align 4
571*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP136:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 0
572*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP137:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 0
573*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP138:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
574*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    call void @__tgt_target_data_begin_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 11, i8** [[TMP136]], i8** [[TMP137]], i64* [[TMP138]], i64* getelementptr inbounds ([11 x i64], [11 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null)
575*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP139:%.*]] = load i32, i32* [[ARG_ADDR]], align 4
576*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[INC32:%.*]] = add nsw i32 [[TMP139]], 1
57783ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    store i32 [[INC32]], i32* [[ARG_ADDR]], align 4
578*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP140:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_BASEPTRS29]], i32 0, i32 0
579*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP141:%.*]] = getelementptr inbounds [11 x i8*], [11 x i8*]* [[DOTOFFLOAD_PTRS30]], i32 0, i32 0
580*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    [[TMP142:%.*]] = getelementptr inbounds [11 x i64], [11 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0
581*ca6fa71bSAlexey Bataev // CHECK-I386-NEXT:    call void @__tgt_target_data_end_mapper(%struct.ident_t* @[[GLOB1]], i64 -1, i32 11, i8** [[TMP140]], i8** [[TMP141]], i64* [[TMP142]], i64* getelementptr inbounds ([11 x i64], [11 x i64]* @.offload_maptypes.5, i32 0, i32 0), i8** null, i8** null)
58283ddfa0dSJoel E. Denny // CHECK-I386-NEXT:    ret void
58383ddfa0dSJoel E. Denny //
58483ddfa0dSJoel E. Denny void foo(int arg) {
58583ddfa0dSJoel E. Denny   float lb[5];
58683ddfa0dSJoel E. Denny   S2 *ps1;
58783ddfa0dSJoel E. Denny   S2 *ps2;
58883ddfa0dSJoel E. Denny 
58983ddfa0dSJoel E. Denny   #pragma omp target data map(ompx_hold, to: lb)
59083ddfa0dSJoel E. Denny   {++arg;}
59183ddfa0dSJoel E. Denny 
59283ddfa0dSJoel E. Denny   #pragma omp target data map(always close ompx_hold, to: lb)
59383ddfa0dSJoel E. Denny   {++arg;}
59483ddfa0dSJoel E. Denny 
59583ddfa0dSJoel E. Denny   #pragma omp target data map(ompx_hold, tofrom : arg)
59683ddfa0dSJoel E. Denny   {++arg;}
59783ddfa0dSJoel E. Denny 
59883ddfa0dSJoel E. Denny   // Make sure the struct picks up ompx_hold even if another element of the
59983ddfa0dSJoel E. Denny   // struct doesn't have ompx_hold.
60083ddfa0dSJoel E. Denny   #pragma omp target data map(tofrom : ps1->s, arg)                           \
60183ddfa0dSJoel E. Denny                           map(ompx_hold, tofrom : ps1->ps->ps->ps->s, ps2->s) \
60283ddfa0dSJoel E. Denny                           map(tofrom : ps2->ps->ps->ps->s)
60383ddfa0dSJoel E. Denny   {
60483ddfa0dSJoel E. Denny     ++(arg);
60583ddfa0dSJoel E. Denny   }
60683ddfa0dSJoel E. Denny }
60783ddfa0dSJoel E. Denny 
60883ddfa0dSJoel E. Denny #endif
609