1*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp -fopenmp-version=50 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp -fopenmp-version=50 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
3*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp -fopenmp-version=50 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
490b54fa0SAlexey Bataev
5*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -verify -fopenmp-simd -fopenmp-version=50 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s
6*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -DCK1 -fopenmp-simd -fopenmp-version=50 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
7*532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -fopenmp-simd -fopenmp-version=50 -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s
890b54fa0SAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}}
990b54fa0SAlexey Bataev // expected-no-diagnostics
1090b54fa0SAlexey Bataev
1190b54fa0SAlexey Bataev #ifndef HEADER
1290b54fa0SAlexey Bataev #define HEADER
1390b54fa0SAlexey Bataev
1490b54fa0SAlexey Bataev // CHECK-DAG: [[SIZES1:@.+]] = private unnamed_addr constant [5 x i64] zeroinitializer
15b272698dSAlexey Bataev // 64 = 0x40 = OMP_MAP_RETURN_PARAM
16b272698dSAlexey Bataev // CHECK-DAG: [[MAPTYPES1:@.+]] = private unnamed_addr constant [5 x i64] [i64 64, i64 64, i64 64, i64 64, i64 64]
17d04d9220SAlexey Bataev // CHECK-DAG: [[SIZES2:@.+]] = private unnamed_addr constant [5 x i64] zeroinitializer
18b272698dSAlexey Bataev // 0 = OMP_MAP_NONE
1990b54fa0SAlexey Bataev // 281474976710720 = 0x1000000000040 = OMP_MAP_MEMBER_OF | OMP_MAP_RETURN_PARAM
20b272698dSAlexey Bataev // CHECK-DAG: [[MAPTYPES2:@.+]] = private unnamed_addr constant [5 x i64] [i64 0, i64 281474976710720, i64 281474976710720, i64 281474976710720, i64 281474976710720]
2190b54fa0SAlexey Bataev struct S {
2290b54fa0SAlexey Bataev int a = 0;
2390b54fa0SAlexey Bataev int *ptr = &a;
2490b54fa0SAlexey Bataev int &ref = a;
2590b54fa0SAlexey Bataev int arr[4];
SS2690b54fa0SAlexey Bataev S() {}
fooS2790b54fa0SAlexey Bataev void foo() {
2890b54fa0SAlexey Bataev #pragma omp target data use_device_addr(a, ptr [3:4], ref, ptr[0], arr[:a])
2990b54fa0SAlexey Bataev ++a, ++*ptr, ++ref, ++arr[0];
3090b54fa0SAlexey Bataev }
3190b54fa0SAlexey Bataev };
3290b54fa0SAlexey Bataev
main()3390b54fa0SAlexey Bataev int main() {
3490b54fa0SAlexey Bataev float a = 0;
3590b54fa0SAlexey Bataev float *ptr = &a;
3690b54fa0SAlexey Bataev float &ref = a;
3790b54fa0SAlexey Bataev float arr[4];
3890b54fa0SAlexey Bataev float vla[(int)a];
3990b54fa0SAlexey Bataev S s;
4090b54fa0SAlexey Bataev s.foo();
4190b54fa0SAlexey Bataev #pragma omp target data use_device_addr(a, ptr [3:4], ref, ptr[0], arr[:(int)a], vla[0])
4290b54fa0SAlexey Bataev ++a, ++*ptr, ++ref, ++arr[0], ++vla[0];
4390b54fa0SAlexey Bataev return a;
4490b54fa0SAlexey Bataev }
4590b54fa0SAlexey Bataev
4690b54fa0SAlexey Bataev // CHECK-LABEL: @main()
4790b54fa0SAlexey Bataev // CHECK: [[A_ADDR:%.+]] = alloca float,
4890b54fa0SAlexey Bataev // CHECK: [[PTR_ADDR:%.+]] = alloca float*,
4990b54fa0SAlexey Bataev // CHECK: [[REF_ADDR:%.+]] = alloca float*,
5090b54fa0SAlexey Bataev // CHECK: [[ARR_ADDR:%.+]] = alloca [4 x float],
5190b54fa0SAlexey Bataev // CHECK: [[BPTRS:%.+]] = alloca [5 x i8*],
5290b54fa0SAlexey Bataev // CHECK: [[PTRS:%.+]] = alloca [5 x i8*],
5390b54fa0SAlexey Bataev // CHECK: [[VLA_ADDR:%.+]] = alloca float, i64 %{{.+}},
5490b54fa0SAlexey Bataev // CHECK: [[PTR:%.+]] = load float*, float** [[PTR_ADDR]],
5590b54fa0SAlexey Bataev // CHECK: [[REF:%.+]] = load float*, float** [[REF_ADDR]],
5690b54fa0SAlexey Bataev // CHECK: [[ARR:%.+]] = getelementptr inbounds [4 x float], [4 x float]* [[ARR_ADDR]], i64 0, i64 0
5790b54fa0SAlexey Bataev // CHECK: [[BPTR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 0
5890b54fa0SAlexey Bataev // CHECK: [[BPTR0_A_ADDR:%.+]] = bitcast i8** [[BPTR0]] to float**
5990b54fa0SAlexey Bataev // CHECK: store float* [[A_ADDR]], float** [[BPTR0_A_ADDR]],
6090b54fa0SAlexey Bataev // CHECK: [[PTR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 0
6190b54fa0SAlexey Bataev // CHECK: [[PTR0_A_ADDR:%.+]] = bitcast i8** [[PTR0]] to float**
6290b54fa0SAlexey Bataev // CHECK: store float* [[A_ADDR]], float** [[PTR0_A_ADDR]],
6390b54fa0SAlexey Bataev // CHECK: [[BPTR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 1
6490b54fa0SAlexey Bataev // CHECK: [[BPTR1_PTR_ADDR:%.+]] = bitcast i8** [[BPTR1]] to float**
6590b54fa0SAlexey Bataev // CHECK: store float* [[PTR]], float** [[BPTR1_PTR_ADDR]],
6690b54fa0SAlexey Bataev // CHECK: [[PTR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 1
6790b54fa0SAlexey Bataev // CHECK: [[PTR1_PTR_ADDR:%.+]] = bitcast i8** [[PTR1]] to float**
6890b54fa0SAlexey Bataev // CHECK: store float* [[PTR]], float** [[PTR1_PTR_ADDR]],
6990b54fa0SAlexey Bataev // CHECK: [[BPTR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 2
7090b54fa0SAlexey Bataev // CHECK: [[BPTR2_REF_ADDR:%.+]] = bitcast i8** [[BPTR2]] to float**
7190b54fa0SAlexey Bataev // CHECK: store float* [[REF]], float** [[BPTR2_REF_ADDR]],
7290b54fa0SAlexey Bataev // CHECK: [[PTR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 2
7390b54fa0SAlexey Bataev // CHECK: [[PTR2_REF_ADDR:%.+]] = bitcast i8** [[PTR2]] to float**
7490b54fa0SAlexey Bataev // CHECK: store float* [[REF]], float** [[PTR2_REF_ADDR]],
7590b54fa0SAlexey Bataev // CHECK: [[BPTR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 3
7690b54fa0SAlexey Bataev // CHECK: [[BPTR3_ARR_ADDR:%.+]] = bitcast i8** [[BPTR3]] to float**
7790b54fa0SAlexey Bataev // CHECK: store float* [[ARR]], float** [[BPTR3_ARR_ADDR]],
7890b54fa0SAlexey Bataev // CHECK: [[PTR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 3
7990b54fa0SAlexey Bataev // CHECK: [[PTR3_ARR_ADDR:%.+]] = bitcast i8** [[PTR3]] to float**
8090b54fa0SAlexey Bataev // CHECK: store float* [[ARR]], float** [[PTR3_ARR_ADDR]],
8190b54fa0SAlexey Bataev // CHECK: [[BPTR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 4
8290b54fa0SAlexey Bataev // CHECK: [[BPTR4_VLA_ADDR:%.+]] = bitcast i8** [[BPTR4]] to float**
8390b54fa0SAlexey Bataev // CHECK: store float* [[VLA_ADDR]], float** [[BPTR4_VLA_ADDR]],
8490b54fa0SAlexey Bataev // CHECK: [[PTR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 4
8590b54fa0SAlexey Bataev // CHECK: [[PTR4_VLA_ADDR:%.+]] = bitcast i8** [[PTR4]] to float**
8690b54fa0SAlexey Bataev // CHECK: store float* [[VLA_ADDR]], float** [[PTR4_VLA_ADDR]],
8790b54fa0SAlexey Bataev // CHECK: [[BPTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 0
8890b54fa0SAlexey Bataev // CHECK: [[PTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 0
89da8bec47SJoseph Huber // CHECK: call void @__tgt_target_data_begin_mapper(%struct.ident_t* @{{.+}}, i64 -1, i32 5, i8** [[BPTR]], i8** [[PTR]], i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[SIZES1]], i32 0, i32 0), i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[MAPTYPES1]], i32 0, i32 0), i8** null, i8** null)
9090b54fa0SAlexey Bataev // CHECK: [[A_REF:%.+]] = load float*, float** [[BPTR0_A_ADDR]],
9190b54fa0SAlexey Bataev // CHECK: [[REF_REF:%.+]] = load float*, float** [[BPTR2_REF_ADDR]],
9290b54fa0SAlexey Bataev // CHECK: store float* [[REF_REF]], float** [[TMP_REF_ADDR:%.+]],
93a9656bd1SNikita Popov // CHECK: [[BPTR3_ARR_ADDR_CAST:%.+]] = bitcast float** [[BPTR3_ARR_ADDR]] to [4 x float]**
94a9656bd1SNikita Popov // CHECK: [[ARR_REF:%.+]] = load [4 x float]*, [4 x float]** [[BPTR3_ARR_ADDR_CAST]],
9590b54fa0SAlexey Bataev // CHECK: [[VLA_REF:%.+]] = load float*, float** [[BPTR4_VLA_ADDR]],
9690b54fa0SAlexey Bataev // CHECK: [[A:%.+]] = load float, float* [[A_REF]],
9790b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = fadd float [[A]], 1.000000e+00
9890b54fa0SAlexey Bataev // CHECK: store float [[INC]], float* [[A_REF]],
9990b54fa0SAlexey Bataev // CHECK: [[PTR_ADDR:%.+]] = load float*, float** [[BPTR1_PTR_ADDR]],
10090b54fa0SAlexey Bataev // CHECK: [[VAL:%.+]] = load float, float* [[PTR_ADDR]],
10190b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = fadd float [[VAL]], 1.000000e+00
10290b54fa0SAlexey Bataev // CHECK: store float [[INC]], float* [[PTR_ADDR]],
10390b54fa0SAlexey Bataev // CHECK: [[REF_ADDR:%.+]] = load float*, float** [[TMP_REF_ADDR]],
10490b54fa0SAlexey Bataev // CHECK: [[REF:%.+]] = load float, float* [[REF_ADDR]],
10590b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = fadd float [[REF]], 1.000000e+00
10690b54fa0SAlexey Bataev // CHECK: store float [[INC]], float* [[REF_ADDR]],
10790b54fa0SAlexey Bataev // CHECK: [[ARR0_ADDR:%.+]] = getelementptr inbounds [4 x float], [4 x float]* [[ARR_REF]], i64 0, i64 0
10890b54fa0SAlexey Bataev // CHECK: [[ARR0:%.+]] = load float, float* [[ARR0_ADDR]],
10990b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = fadd float [[ARR0]], 1.000000e+00
11090b54fa0SAlexey Bataev // CHECK: store float [[INC]], float* [[ARR0_ADDR]],
11190b54fa0SAlexey Bataev // CHECK: [[VLA0_ADDR:%.+]] = getelementptr inbounds float, float* [[VLA_REF]], i64 0
11290b54fa0SAlexey Bataev // CHECK: [[VLA0:%.+]] = load float, float* [[VLA0_ADDR]],
11390b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = fadd float [[VLA0]], 1.000000e+00
11490b54fa0SAlexey Bataev // CHECK: store float [[INC]], float* [[VLA0_ADDR]],
11590b54fa0SAlexey Bataev // CHECK: [[BPTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 0
11690b54fa0SAlexey Bataev // CHECK: [[PTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 0
117da8bec47SJoseph Huber // CHECK: call void @__tgt_target_data_end_mapper(%struct.ident_t* @{{.+}}, i64 -1, i32 5, i8** [[BPTR]], i8** [[PTR]], i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[SIZES1]], i32 0, i32 0), i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[MAPTYPES1]], i32 0, i32 0), i8** null, i8** null)
11890b54fa0SAlexey Bataev
11990b54fa0SAlexey Bataev // CHECK: foo
12090b54fa0SAlexey Bataev // %this.addr = alloca %struct.S*, align 8
12190b54fa0SAlexey Bataev // CHECK: [[BPTRS:%.+]] = alloca [5 x i8*],
12290b54fa0SAlexey Bataev // CHECK: [[PTRS:%.+]] = alloca [5 x i8*],
123ca6fa71bSAlexey Bataev // CHECK: [[SIZES:%.+]] = alloca [5 x i64],
12490b54fa0SAlexey Bataev // %tmp = alloca i32*, align 8
12590b54fa0SAlexey Bataev // %tmp6 = alloca i32**, align 8
12690b54fa0SAlexey Bataev // %tmp7 = alloca i32*, align 8
12790b54fa0SAlexey Bataev // %tmp8 = alloca i32**, align 8
12890b54fa0SAlexey Bataev // %tmp9 = alloca [4 x i32]*, align 8
12990b54fa0SAlexey Bataev // store %struct.S* %this, %struct.S** %this.addr, align 8
13090b54fa0SAlexey Bataev // %this1 = load %struct.S*, %struct.S** %this.addr, align 8
13190b54fa0SAlexey Bataev // CHECK: [[A_ADDR:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[THIS:%.+]], i32 0, i32 0
13290b54fa0SAlexey Bataev // %ptr = getelementptr inbounds %struct.S, %struct.S* %this1, i32 0, i32 1
13390b54fa0SAlexey Bataev // %ref = getelementptr inbounds %struct.S, %struct.S* %this1, i32 0, i32 2
13490b54fa0SAlexey Bataev // %0 = load i32*, i32** %ref, align 8
13590b54fa0SAlexey Bataev // CHECK: [[ARR_ADDR:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[THIS]], i32 0, i32 3
13690b54fa0SAlexey Bataev // CHECK: [[A_ADDR2:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[THIS]], i32 0, i32 0
13790b54fa0SAlexey Bataev // CHECK: [[PTR_ADDR:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[THIS]], i32 0, i32 1
13890b54fa0SAlexey Bataev // CHECK: [[REF_REF:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[THIS]], i32 0, i32 2
13990b54fa0SAlexey Bataev // CHECK: [[REF_PTR:%.+]] = load i32*, i32** [[REF_REF]],
14090b54fa0SAlexey Bataev // CHECK: [[ARR_ADDR2:%.+]] = getelementptr inbounds %struct.S, %struct.S* [[THIS]], i32 0, i32 3
14190b54fa0SAlexey Bataev // CHECK: [[ARR_END:%.+]] = getelementptr [4 x i32], [4 x i32]* [[ARR_ADDR]], i32 1
14290b54fa0SAlexey Bataev // CHECK: [[BEGIN:%.+]] = bitcast i32* [[A_ADDR]] to i8*
14390b54fa0SAlexey Bataev // CHECK: [[END:%.+]] = bitcast [4 x i32]* [[ARR_END]] to i8*
14490b54fa0SAlexey Bataev // CHECK: [[E:%.+]] = ptrtoint i8* [[END]] to i64
14590b54fa0SAlexey Bataev // CHECK: [[B:%.+]] = ptrtoint i8* [[BEGIN]] to i64
14690b54fa0SAlexey Bataev // CHECK: [[DIFF:%.+]] = sub i64 [[E]], [[B]]
14790b54fa0SAlexey Bataev // CHECK: [[SZ:%.+]] = sdiv exact i64 [[DIFF]], ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i64)
14890b54fa0SAlexey Bataev // CHECK: [[BPTR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 0
14990b54fa0SAlexey Bataev // CHECK: [[BPTR0_S:%.+]] = bitcast i8** [[BPTR0]] to %struct.S**
15090b54fa0SAlexey Bataev // CHECK: store %struct.S* [[THIS]], %struct.S** [[BPTR0_S]],
15190b54fa0SAlexey Bataev // CHECK: [[PTR0:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 0
15290b54fa0SAlexey Bataev // CHECK: [[PTR0_BEGIN:%.+]] = bitcast i8** [[PTR0]] to i32**
15390b54fa0SAlexey Bataev // CHECK: store i32* [[A_ADDR]], i32** [[PTR0_BEGIN]],
154ca6fa71bSAlexey Bataev // CHECK: [[SIZE0:%.+]] = getelementptr inbounds [5 x i64], [5 x i64]* [[SIZES]], i32 0, i32 0
155ca6fa71bSAlexey Bataev // CHECK: store i64 [[SZ]], i64* [[SIZE0]],
15690b54fa0SAlexey Bataev // CHECK: [[BPTR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 1
15790b54fa0SAlexey Bataev // CHECK: [[BPTR1_A_ADDR:%.+]] = bitcast i8** [[BPTR1]] to i32**
15890b54fa0SAlexey Bataev // CHECK: store i32* [[A_ADDR2]], i32** [[BPTR1_A_ADDR]],
15990b54fa0SAlexey Bataev // CHECK: [[PTR1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 1
16090b54fa0SAlexey Bataev // CHECK: [[PTR1_A_ADDR:%.+]] = bitcast i8** [[PTR1]] to i32**
16190b54fa0SAlexey Bataev // CHECK: store i32* [[A_ADDR2]], i32** [[PTR1_A_ADDR]],
16290b54fa0SAlexey Bataev // CHECK: [[BPTR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 2
16390b54fa0SAlexey Bataev // CHECK: [[BPTR2_PTR_ADDR:%.+]] = bitcast i8** [[BPTR2]] to i32***
16490b54fa0SAlexey Bataev // CHECK: store i32** [[PTR_ADDR]], i32*** [[BPTR2_PTR_ADDR]],
16590b54fa0SAlexey Bataev // CHECK: [[PTR2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 2
16690b54fa0SAlexey Bataev // CHECK: [[PTR2_PTR_ADDR:%.+]] = bitcast i8** [[PTR2]] to i32***
16790b54fa0SAlexey Bataev // CHECK: store i32** [[PTR_ADDR]], i32*** [[PTR2_PTR_ADDR]],
16890b54fa0SAlexey Bataev // CHECK: [[BPTR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 3
16990b54fa0SAlexey Bataev // CHECK: [[BPTR3_REF_PTR:%.+]] = bitcast i8** [[BPTR3]] to i32**
17090b54fa0SAlexey Bataev // CHECK: store i32* [[REF_PTR]], i32** [[BPTR3_REF_PTR]],
17190b54fa0SAlexey Bataev // CHECK: [[PTR3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 3
17290b54fa0SAlexey Bataev // CHECK: [[PTR3_REF_PTR:%.+]] = bitcast i8** [[PTR3]] to i32**
17390b54fa0SAlexey Bataev // CHECK: store i32* [[REF_PTR]], i32** [[PTR3_REF_PTR]],
17490b54fa0SAlexey Bataev // CHECK: [[BPTR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 4
17590b54fa0SAlexey Bataev // CHECK: [[BPTR4_ARR_ADDR:%.+]] = bitcast i8** [[BPTR4]] to [4 x i32]**
17690b54fa0SAlexey Bataev // CHECK: store [4 x i32]* [[ARR_ADDR2]], [4 x i32]** [[BPTR4_ARR_ADDR]],
17790b54fa0SAlexey Bataev // CHECK: [[PTR4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 4
17890b54fa0SAlexey Bataev // CHECK: [[PTR4_ARR_ADDR:%.+]] = bitcast i8** [[PTR4]] to [4 x i32]**
17990b54fa0SAlexey Bataev // CHECK: store [4 x i32]* [[ARR_ADDR2]], [4 x i32]** [[PTR4_ARR_ADDR]],
18090b54fa0SAlexey Bataev // CHECK: [[BPTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 0
18190b54fa0SAlexey Bataev // CHECK: [[PTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 0
182ca6fa71bSAlexey Bataev // CHECK: [[SIZE:%.+]] = getelementptr inbounds [5 x i64], [5 x i64]* [[SIZES]], i32 0, i32 0
183ca6fa71bSAlexey Bataev // CHECK: call void @__tgt_target_data_begin_mapper(%struct.ident_t* @{{.+}}, i64 -1, i32 5, i8** [[BPTR]], i8** [[PTR]], i64* [[SIZE]], i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[MAPTYPES2]], i32 0, i32 0), i8** null, i8** null)
18490b54fa0SAlexey Bataev // CHECK: [[A_ADDR:%.+]] = load i32*, i32** [[BPTR1_A_ADDR]],
18590b54fa0SAlexey Bataev // CHECK: store i32* [[A_ADDR]], i32** [[A_REF:%.+]],
18690b54fa0SAlexey Bataev // CHECK: [[PTR_ADDR:%.+]] = load i32**, i32*** [[BPTR2_PTR_ADDR]],
18790b54fa0SAlexey Bataev // CHECK: store i32** [[PTR_ADDR]], i32*** [[PTR_REF:%.+]],
18890b54fa0SAlexey Bataev // CHECK: [[REF_PTR:%.+]] = load i32*, i32** [[BPTR3_REF_PTR]],
18990b54fa0SAlexey Bataev // CHECK: store i32* [[REF_PTR]], i32** [[REF_REF:%.+]],
19090b54fa0SAlexey Bataev // CHECK: [[PTR_ADDR:%.+]] = load i32**, i32*** [[BPTR2_PTR_ADDR]],
19190b54fa0SAlexey Bataev // CHECK: store i32** [[PTR_ADDR]], i32*** [[PTR_REF2:%.+]],
19290b54fa0SAlexey Bataev // CHECK: [[ARR_ADDR:%.+]] = load [4 x i32]*, [4 x i32]** [[BPTR4_ARR_ADDR]],
19390b54fa0SAlexey Bataev // CHECK: store [4 x i32]* [[ARR_ADDR]], [4 x i32]** [[ARR_REF:%.+]],
19490b54fa0SAlexey Bataev // CHECK: [[A_ADDR:%.+]] = load i32*, i32** [[A_REF]],
19590b54fa0SAlexey Bataev // CHECK: [[A:%.+]] = load i32, i32* [[A_ADDR]],
19690b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = add nsw i32 [[A]], 1
19790b54fa0SAlexey Bataev // CHECK: store i32 [[INC]], i32* [[A_ADDR]],
19890b54fa0SAlexey Bataev // CHECK: [[PTR_PTR:%.+]] = load i32**, i32*** [[PTR_REF2]],
19990b54fa0SAlexey Bataev // CHECK: [[PTR:%.+]] = load i32*, i32** [[PTR_PTR]],
20090b54fa0SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[PTR]],
20190b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = add nsw i32 [[VAL]], 1
20290b54fa0SAlexey Bataev // CHECK: store i32 [[INC]], i32* [[PTR]],
20390b54fa0SAlexey Bataev // CHECK: [[REF_PTR:%.+]] = load i32*, i32** [[REF_REF]],
20490b54fa0SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[REF_PTR]],
20590b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = add nsw i32 [[VAL]], 1
20690b54fa0SAlexey Bataev // CHECK: store i32 [[INC]], i32* [[REF_PTR]],
20790b54fa0SAlexey Bataev // CHECK: [[ARR_ADDR:%.+]] = load [4 x i32]*, [4 x i32]** [[ARR_REF]],
20890b54fa0SAlexey Bataev // CHECK: [[ARR0_ADDR:%.+]] = getelementptr inbounds [4 x i32], [4 x i32]* [[ARR_ADDR]], i64 0, i64 0
20990b54fa0SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[ARR0_ADDR]],
21090b54fa0SAlexey Bataev // CHECK: [[INC:%.+]] = add nsw i32 [[VAL]], 1
21190b54fa0SAlexey Bataev // CHECK: store i32 [[INC]], i32* [[ARR0_ADDR]],
21290b54fa0SAlexey Bataev // CHECK: [[BPTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BPTRS]], i32 0, i32 0
21390b54fa0SAlexey Bataev // CHECK: [[PTR:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS]], i32 0, i32 0
214ca6fa71bSAlexey Bataev // CHECK: [[SIZE:%.+]] = getelementptr inbounds [5 x i64], [5 x i64]* [[SIZES]], i32 0, i32 0
215ca6fa71bSAlexey Bataev // CHECK: call void @__tgt_target_data_end_mapper(%struct.ident_t* @{{.+}}, i64 -1, i32 5, i8** [[BPTR]], i8** [[PTR]], i64* [[SIZE]], i64* getelementptr inbounds ([5 x i64], [5 x i64]* [[MAPTYPES2]], i32 0, i32 0), i8** null, i8** null)
21690b54fa0SAlexey Bataev
21790b54fa0SAlexey Bataev #endif
218