xref: /aosp_15_r20/external/clang/test/OpenMP/target_firstprivate_codegen.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Test host codegen.
2*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -o %t %s
4*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-64
5*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
6*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -o %t %s
7*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CHECK --check-prefix CHECK-32
8*67e74705SXin Li 
9*67e74705SXin Li // Test target codegen - host bc file has to be created first.
10*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
11*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix TCHECK --check-prefix TCHECK-64
12*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o %t %s
13*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix TCHECK --check-prefix TCHECK-64
14*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm-bc %s -o %t-x86-host.bc
15*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix TCHECK --check-prefix TCHECK-32
16*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -emit-pch -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -o %t %s
17*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=i386-pc-linux-gnu -std=c++11 -fopenmp-is-device -fopenmp-host-ir-file-path %t-x86-host.bc -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix TCHECK --check-prefix TCHECK-32
18*67e74705SXin Li 
19*67e74705SXin Li // expected-no-diagnostics
20*67e74705SXin Li #ifndef HEADER
21*67e74705SXin Li #define HEADER
22*67e74705SXin Li 
23*67e74705SXin Li template<typename tx, typename ty>
24*67e74705SXin Li struct TT{
25*67e74705SXin Li   tx X;
26*67e74705SXin Li   ty Y;
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK:  [[TT:%.+]] = type { i64, i8 }
30*67e74705SXin Li // CHECK:  [[S1:%.+]] = type { double }
31*67e74705SXin Li 
32*67e74705SXin Li // TCHECK:  [[TT:%.+]] = type { i64, i8 }
33*67e74705SXin Li // TCHECK:  [[S1:%.+]] = type { double }
34*67e74705SXin Li 
35*67e74705SXin Li // CHECK-DAG:  [[SIZET:@.+]] = private unnamed_addr constant [1 x i{{32|64}}] [i[[SZ:32|64]] 4]
36*67e74705SXin Li // CHECK:  [[MAPT:@.+]] = private unnamed_addr constant [1 x i32] [i32 288]
37*67e74705SXin Li // CHECK-DAG:  [[MAPT2:@.+]] = private unnamed_addr constant [9 x i32] [i32 288, i32 161, i32 288, i32 161, i32 161, i32 288, i32 288, i32 161, i32 161]
38*67e74705SXin Li // CHECK-DAG:  [[SIZET3:@.+]] = private unnamed_addr constant [1 x i{{32|64}}] zeroinitializer
39*67e74705SXin Li // CHECK-DAG:  [[MAPT3:@.+]] = private unnamed_addr constant [1 x i32] [i32 32]
40*67e74705SXin Li // CHECK-DAG:  [[MAPT4:@.+]] = private unnamed_addr constant [5 x i32] [i32 35, i32 288, i32 288, i32 288, i32 161]
41*67e74705SXin Li // CHECK-DAG:  [[SIZET5:@.+]] = private unnamed_addr constant [3 x i{{32|64}}] [i[[SZ]] 4, i[[SZ]] 1, i[[SZ]] 40]
42*67e74705SXin Li // CHECK-DAG:  [[MAPT5:@.+]] = private unnamed_addr constant [3 x i32] [i32 288, i32 288, i32 161]
43*67e74705SXin Li // CHECK-DAG:  [[SIZET6:@.+]] = private unnamed_addr constant [2 x i{{32|64}}] [i[[SZ]] 4, i[[SZ]] 40]
44*67e74705SXin Li // CHECK-DAG:  [[MAPT6:@.+]] = private unnamed_addr constant [2 x i32] [i32 288, i32 161]
45*67e74705SXin Li 
46*67e74705SXin Li 
47*67e74705SXin Li // CHECK: define {{.*}}[[FOO:@.+]](
foo(int n,double * ptr)48*67e74705SXin Li int foo(int n, double *ptr) {
49*67e74705SXin Li   int a = 0;
50*67e74705SXin Li   short aa = 0;
51*67e74705SXin Li   float b[10];
52*67e74705SXin Li   float bn[n];
53*67e74705SXin Li   double c[5][10];
54*67e74705SXin Li   double cn[5][n];
55*67e74705SXin Li   TT<long long, char> d;
56*67e74705SXin Li 
57*67e74705SXin Li   #pragma omp target firstprivate(a)
58*67e74705SXin Li   {
59*67e74705SXin Li   }
60*67e74705SXin Li 
61*67e74705SXin Li   // a is passed by value to tgt_target
62*67e74705SXin Li   // CHECK:  [[N_ADDR:%.+]] = alloca i{{[0-9]+}},
63*67e74705SXin Li   // CHECK:  [[PTR_ADDR:%.+]] = alloca double*,
64*67e74705SXin Li   // CHECK:  [[A:%.+]] = alloca i{{[0-9]+}},
65*67e74705SXin Li   // CHECK:  [[A2:%.+]] = alloca i{{[0-9]+}},
66*67e74705SXin Li   // CHECK:  [[B:%.+]] = alloca [10 x float],
67*67e74705SXin Li   // CHECK:  [[SSTACK:%.+]] = alloca i8*,
68*67e74705SXin Li   // CHECK:  [[C:%.+]] = alloca [5 x [10 x double]],
69*67e74705SXin Li   // CHECK:  [[D:%.+]] = alloca [[TT]],
70*67e74705SXin Li   // CHECK:  [[ACAST:%.+]] = alloca i{{[0-9]+}},
71*67e74705SXin Li   // CHECK:  {{.+}} = alloca i{{[0-9]+}},
72*67e74705SXin Li   // CHECK:  [[BASE_PTR_ARR:%.+]] = alloca [1 x i8*],
73*67e74705SXin Li   // CHECK:  [[PTR_ARR:%.+]] = alloca [1 x i8*],
74*67e74705SXin Li   // CHECK:  [[A2CAST:%.+]] = alloca i{{[0-9]+}},
75*67e74705SXin Li   // CHECK:  [[BASE_PTR_ARR2:%.+]] = alloca [9 x i8*],
76*67e74705SXin Li   // CHECK:  [[PTR_ARR2:%.+]] = alloca [9 x i8*],
77*67e74705SXin Li   // CHECK:  [[SIZET2:%.+]] = alloca [9 x i{{[0-9]+}}],
78*67e74705SXin Li   // CHECK:  [[BASE_PTR_ARR3:%.+]] = alloca [1 x i8*],
79*67e74705SXin Li   // CHECK:  [[PTR_ARR3:%.+]] = alloca [1 x i8*],
80*67e74705SXin Li   // CHECK:  [[N_ADDR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[N_ADDR]],
81*67e74705SXin Li   // CHECK-64:  [[N_EXT:%.+]] = zext i{{[0-9]+}} [[N_ADDR_VAL]] to i{{[0-9]+}}
82*67e74705SXin Li   // CHECK:  [[SSAVE_RET:%.+]] = call i8* @llvm.stacksave()
83*67e74705SXin Li   // CHECK:  store i8* [[SSAVE_RET]], i8** [[SSTACK]],
84*67e74705SXin Li   // CHECK-64:  [[BN_VLA:%.+]] = alloca float, i{{[0-9]+}} [[N_EXT]],
85*67e74705SXin Li   // CHECK-32:  [[BN_VLA:%.+]] = alloca float, i{{[0-9]+}} [[N_ADDR_VAL]],
86*67e74705SXin Li   // CHECK:  [[N_ADDR_VAL2:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[N_ADDR]],
87*67e74705SXin Li   // CHECK-64:  [[N_EXT2:%.+]] = zext i{{[0-9]+}} [[N_ADDR_VAL2]] to i{{[0-9]+}}
88*67e74705SXin Li   // CHECK-64:  [[CN_SIZE:%.+]] = mul{{.+}} i{{[0-9]+}} 5, [[N_EXT2]]
89*67e74705SXin Li   // CHECK-32:  [[CN_SIZE:%.+]] = mul{{.+}} i{{[0-9]+}} 5, [[N_ADDR_VAL2]]
90*67e74705SXin Li   // CHECK:  [[CN_VLA:%.+]] = alloca double, i{{[0-9]+}} [[CN_SIZE]],
91*67e74705SXin Li   // CHECK:  [[AVAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A]],
92*67e74705SXin Li   // CHECK-64:  [[CONV:%.+]] = bitcast i{{[0-9]+}}* [[ACAST]] to i{{[0-9]+}}*
93*67e74705SXin Li   // CHECK-64:  store i{{[0-9]+}} [[AVAL]], i{{[0-9]+}}* [[CONV]],
94*67e74705SXin Li   // CHECK-32:  store i{{[0-9]+}} [[AVAL]], i{{[0-9]+}}* [[ACAST]],
95*67e74705SXin Li   // CHECK:  [[ACAST_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[ACAST]],
96*67e74705SXin Li   // CHECK:  [[ACAST_TOPTR:%.+]] = inttoptr i{{[0-9]+}} [[ACAST_VAL]] to i8*
97*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BASE_PTR_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
98*67e74705SXin Li   // CHECK:  store i8* [[ACAST_TOPTR]], i8** [[BASE_PTR_GEP]],
99*67e74705SXin Li   // CHECK:  [[ACAST_TOPTR2:%.+]] = inttoptr i{{[0-9]+}} [[ACAST_VAL]] to i8*
100*67e74705SXin Li   // CHECK:  [[PTR_GEP:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PTR_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
101*67e74705SXin Li   // CHECK:  store i8* [[ACAST_TOPTR2]], i8** [[PTR_GEP]],
102*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP_ARG:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BASE_PTR_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
103*67e74705SXin Li   // CHECK:  [[PTR_GEP_ARG:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PTR_ARR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
104*67e74705SXin Li   // CHECK:  {{.+}} = call i32 @__tgt_target(i32 -1, {{.+}}, i32 1, i8** [[BASE_PTR_GEP_ARG]], i8** [[PTR_GEP_ARG]], i[[SZ]]* getelementptr inbounds ([1 x i[[SZ]]], [1 x i[[SZ]]]* [[SIZET]], i32 0, i32 0), i32* getelementptr inbounds ([1 x i32], [1 x i32]* [[MAPT]], i32 0, i32 0))
105*67e74705SXin Li 
106*67e74705SXin Li   // TCHECK:  define void @__omp_offloading_{{.+}}(i{{[0-9]+}} [[A_IN:%.+]])
107*67e74705SXin Li   // TCHECK:  [[A_ADDR:%.+]] = alloca i{{[0-9]+}},
108*67e74705SXin Li   // TCHECK-NOT: alloca i{{[0-9]+}},
109*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[A_IN]], i{{[0-9]+}}* [[A_ADDR]],
110*67e74705SXin Li   // TCHECK-NOT: store i{{[0-9]+}} %
111*67e74705SXin Li   // TCHECK:  ret void
112*67e74705SXin Li 
113*67e74705SXin Li #pragma omp target firstprivate(aa,b,bn,c,cn,d)
114*67e74705SXin Li   {
115*67e74705SXin Li     aa += 1;
116*67e74705SXin Li     b[2] = 1.0;
117*67e74705SXin Li     bn[3] = 1.0;
118*67e74705SXin Li     c[1][2] = 1.0;
119*67e74705SXin Li     cn[1][3] = 1.0;
120*67e74705SXin Li     d.X = 1;
121*67e74705SXin Li     d.Y = 1;
122*67e74705SXin Li   }
123*67e74705SXin Li 
124*67e74705SXin Li   // CHECK:  [[A2VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A2]],
125*67e74705SXin Li   // CHECK:  [[A2CASTCONV:%.+]] = bitcast i{{[0-9]+}}* [[A2CAST]] to i{{[0-9]+}}*
126*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} [[A2VAL]], i{{[0-9]+}}* [[A2CASTCONV]],
127*67e74705SXin Li   // CHECK:  [[A2CAST_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[A2CAST]],
128*67e74705SXin Li   // CHECK-64:  [[BN_SIZE:%.+]] = mul{{.+}} i{{[0-9]+}} [[N_EXT]], 4
129*67e74705SXin Li   // CHECK-32:  [[BN_SIZE:%.+]] = mul{{.+}} i{{[0-9]+}} [[N_ADDR_VAL]], 4
130*67e74705SXin Li   // CHECK-64:  [[CN_SIZE_1:%.+]] = mul{{.+}} i{{[0-9]+}} 5, [[N_EXT2]]
131*67e74705SXin Li   // CHECK-32:  [[CN_SIZE_1:%.+]] = mul{{.+}} i{{[0-9]+}} 5, [[N_ADDR_VAL2]]
132*67e74705SXin Li   // CHECK:  [[CN_SIZE_2:%.+]] = mul{{.+}} i{{[0-9]+}} [[CN_SIZE_1]], 8
133*67e74705SXin Li 
134*67e74705SXin Li   // firstprivate(aa) --> base_ptr = aa, ptr = aa, size = 2 (short)
135*67e74705SXin Li   // CHECK:  [[A2CAST_TO_INT:%.+]] = inttoptr i{{[0-9]+}} [[A2CAST_VAL]] to i8*
136*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_0:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
137*67e74705SXin Li   // CHECK:  store i8* [[A2CAST_TO_INT]], i8** [[BASE_PTR_GEP2_0]],
138*67e74705SXin Li   // CHECK:  [[A2CAST_TO_INT_2:%.+]] = inttoptr i{{[0-9]+}} [[A2CAST_VAL]] to i8*
139*67e74705SXin Li   // CHECK:  [[PTR_GEP2_0:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
140*67e74705SXin Li   // CHECK:  store i8* [[A2CAST_TO_INT_2]], i8** [[PTR_GEP2_0]],
141*67e74705SXin Li   // CHECK:  [[SIZE_GEPA2:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
142*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} 2, i{{[0-9]+}}* [[SIZE_GEPA2]],
143*67e74705SXin Li 
144*67e74705SXin Li   // firstprivate(b): base_ptr = &b[0], ptr = &b[0], size = 40 (sizeof(float)*10)
145*67e74705SXin Li   // CHECK:  [[BCAST:%.+]] = bitcast [10 x float]* [[B]] to i8*
146*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_1:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
147*67e74705SXin Li   // CHECK:  store i8* [[BCAST]], i8** [[BASE_PTR_GEP2_1]],
148*67e74705SXin Li   // CHECK:  [[BCAST2:%.+]] = bitcast [10 x float]* [[B]] to i8*
149*67e74705SXin Li   // CHECK:  [[PTR_GEP2_1:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
150*67e74705SXin Li   // CHECK:  store i8* [[BCAST2]], i8** [[PTR_GEP2_1]],
151*67e74705SXin Li   // CHECK:  [[SIZE_GEPB:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
152*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} 40, i{{[0-9]+}}* [[SIZE_GEPB]],
153*67e74705SXin Li 
154*67e74705SXin Li   // firstprivate(bn), 2 entries, n and bn: (1) base_ptr = n, ptr = n, size = 8 ; (2) base_ptr = &c[0], ptr = &c[0], size = n*sizeof(float)
155*67e74705SXin Li   // CHECK-64:  [[N_EXT3_1:%.+]] = inttoptr i{{[0-9]+}} [[N_EXT]] to i8*
156*67e74705SXin Li   // CHECK-32:  [[N_EXT3_1:%.+]] = inttoptr i{{[0-9]+}} [[N_ADDR_VAL]] to i8*
157*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_2:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
158*67e74705SXin Li   // CHECK:  store i8* [[N_EXT3_1]], i8** [[BASE_PTR_GEP2_2]],
159*67e74705SXin Li   // CHECK-64:  [[N_EXT3_2:%.+]] = inttoptr i{{[0-9]+}} [[N_EXT]] to i8*
160*67e74705SXin Li   // CHECK-32:  [[N_EXT3_2:%.+]] = inttoptr i{{[0-9]+}} [[N_ADDR_VAL]] to i8*
161*67e74705SXin Li   // CHECK:  [[PTR_GEP2_2:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
162*67e74705SXin Li   // CHECK:  store i8* [[N_EXT3_2]], i8** [[PTR_GEP2_2]],
163*67e74705SXin Li   // CHECK:  [[SIZE_GEPBN_1:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
164*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} {{[0-9]}}, i{{[0-9]+}}* [[SIZE_GEPBN_1]],
165*67e74705SXin Li   // CHECK:  [[VLABN_BCAST:%.+]] = bitcast float* [[BN_VLA]] to i8*
166*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_3:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
167*67e74705SXin Li   // CHECK:  store i8* [[VLABN_BCAST]], i8** [[BASE_PTR_GEP2_3]],
168*67e74705SXin Li   // CHECK: [[SIZE_GEPBN_3:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
169*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} [[BN_SIZE]], i{{[0-9]+}}* [[SIZE_GEPBN_3]]
170*67e74705SXin Li 
171*67e74705SXin Li   // firstprivate(c): base_ptr = &c[0], ptr = &c[0], size = 400 (5*10*sizeof(double))
172*67e74705SXin Li   // CHECK:  [[C_BCAST:%.+]] = bitcast [5 x [10 x double]]* [[C]] to i8*
173*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_4:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
174*67e74705SXin Li   // CHECK:  store i8* [[C_BCAST]], i8** [[BASE_PTR_GEP2_4]],
175*67e74705SXin Li   // CHECK:  [[C_BCAST2:%.+]] = bitcast [5 x [10 x double]]* [[C]] to i8*
176*67e74705SXin Li   // CHECK:  [[PTR_GEP2_4:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
177*67e74705SXin Li   // CHECK:  store i8* [[C_BCAST2]], i8** [[PTR_GEP2_4]],
178*67e74705SXin Li   // CHECK:  [[SIZE_GEPC_4:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
179*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} 400, i{{[0-9]+}}* [[SIZE_GEPC_4]],
180*67e74705SXin Li 
181*67e74705SXin Li   // firstprivate(cn), 3 entries, 5, n, cn: (1) base_ptr = 5, ptr = 5, size = 8; (2) (1) base_ptr = n, ptr = n, size = 8; (3) base_ptr = &cn[0], ptr = &cn[0], size = 5*n*sizeof(double)
182*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_5:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 5
183*67e74705SXin Li   // CHECK:  store i8* inttoptr (i{{[0-9]+}} 5 to i8*), i8** [[BASE_PTR_GEP2_5]],
184*67e74705SXin Li   // CHECK:  [[PTR_GEP2_5:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 5
185*67e74705SXin Li   // CHECK:  store i8* inttoptr (i{{[0-9]+}} 5 to i8*), i8** [[PTR_GEP2_5]],
186*67e74705SXin Li   // CHECK:  [[SIZE_GEPCN_5:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 5
187*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} {{[0-9]}}, i{{[0-9]+}}* [[SIZE_GEPCN_5]],
188*67e74705SXin Li   // CHECK-64:  [[CN_SZ_2_1:%.+]] = inttoptr i{{[0-9]+}} [[N_EXT2]] to i8*
189*67e74705SXin Li   // CHECK-32:  [[CN_SZ_2_1:%.+]] = inttoptr i{{[0-9]+}} [[N_ADDR_VAL2]] to i8*
190*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_6:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 6
191*67e74705SXin Li   // CHECK:  store i8* [[CN_SZ_2_1]], i8** [[BASE_PTR_GEP2_6]],
192*67e74705SXin Li   // CHECK-64:  [[CN_SZ_2_2:%.+]] = inttoptr i{{[0-9]+}} [[N_EXT2]] to i8*
193*67e74705SXin Li   // CHECK-32:  [[CN_SZ_2_2:%.+]] = inttoptr i{{[0-9]+}} [[N_ADDR_VAL2]] to i8*
194*67e74705SXin Li   // CHECK:  [[PTR_GEP2_6:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 6
195*67e74705SXin Li   // CHECK:  store i8* [[CN_SZ_2_2]], i8** [[PTR_GEP2_6]],
196*67e74705SXin Li   // CHECK:  [[SIZE_GEPCN_6:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 6
197*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} {{[0-9]}}, i{{[0-9]+}}* [[SIZE_GEPCN_6]],
198*67e74705SXin Li   // CHECK:  [[VLA_CN_BCAST:%.+]] = bitcast double* [[CN_VLA]] to i8*
199*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_7:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 7
200*67e74705SXin Li   // CHECK:  store i8* [[VLA_CN_BCAST]], i8** [[BASE_PTR_GEP2_7]],
201*67e74705SXin Li   // CHECK:  [[VLA_CN_BCAST2:%.+]] = bitcast double* [[CN_VLA]] to i8*
202*67e74705SXin Li   // CHECK:  [[PTR_GEP2_7:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 7
203*67e74705SXin Li   // CHECK:  store i8* [[VLA_CN_BCAST2]], i8** [[PTR_GEP2_7]],
204*67e74705SXin Li   // CHECK:  [[SIZE_GEPCN_7:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 7
205*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} [[CN_SIZE_2]], i{{[0-9]+}}* [[SIZE_GEPCN_7]],
206*67e74705SXin Li 
207*67e74705SXin Li   // firstprivate(d): base_ptr = &d, ptr = &d, size = 16
208*67e74705SXin Li   // CHECK:  [[D_REF:%.+]] = bitcast [[TT]]* [[D]] to i8*
209*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP2_8:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 8
210*67e74705SXin Li   // CHECK:  store i8* [[D_REF]], i8** [[BASE_PTR_GEP2_8]],
211*67e74705SXin Li   // CHECK:  [[D_REF2:%.+]] = bitcast [[TT]]* [[D]] to i8*
212*67e74705SXin Li   // CHECK:  [[PTR_GEP2_8:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 8
213*67e74705SXin Li   // CHECK:  store i8* [[D_REF2]], i8** [[PTR_GEP2_8]],
214*67e74705SXin Li   // CHECK:  [[SIZE_GEPCN_8:%.+]] = getelementptr inbounds [9 x i{{[0-9]+}}], [9 x i{{[0-9]+}}]* [[SIZET2]], i{{[0-9]+}} 0, i{{[0-9]+}} 8
215*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} {{[0-9]+}}, i{{[0-9]+}}* [[SIZE_GEPCN_8]],
216*67e74705SXin Li 
217*67e74705SXin Li 
218*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP_ARG2:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[BASE_PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
219*67e74705SXin Li   // CHECK:  [[PTR_GEP_ARG2:%.+]] = getelementptr inbounds [9 x i8*], [9 x i8*]* [[PTR_ARR2]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
220*67e74705SXin Li   // CHECK:  [[SIZES_ARG2:%.+]] = getelementptr inbounds [9 x i[[SZ]]], [9 x i[[SZ]]]* [[SIZET2]],  i{{[0-9]+}} 0, i{{[0-9]+}} 0
221*67e74705SXin Li   // CHECK: {{.+}} = call i32 @__tgt_target(i32 -1, {{.+}}, i32 9, i8** [[BASE_PTR_GEP_ARG2]], i8** [[PTR_GEP_ARG2]], i[[SZ]]* [[SIZES_ARG2]], i32* getelementptr inbounds ([9 x i32], [9 x i32]* [[MAPT2]], i32 0, i32 0))
222*67e74705SXin Li 
223*67e74705SXin Li   // make sure that firstprivate variables are generated in all cases and that we use those instances for operations inside the
224*67e74705SXin Li   // target region
225*67e74705SXin Li   // TCHECK:  define void @__omp_offloading_{{.+}}(i{{[0-9]+}} [[A2_IN:%.+]], [10 x float]* {{.+}} [[B_IN:%.+]], i{{[0-9]+}} [[BN_SZ:%.+]], float* {{.+}} [[BN_IN:%.+]], [5 x [10 x double]]* {{.+}} [[C_IN:%.+]], i{{[0-9]+}} [[CN_SZ1:%.+]], i{{[0-9]+}} [[CN_SZ2:%.+]], double* {{.+}} [[CN_IN:%.+]], [[TT]]* {{.+}} [[D_IN:%.+]])
226*67e74705SXin Li   // TCHECK:  [[A2_ADDR:%.+]] = alloca i{{[0-9]+}},
227*67e74705SXin Li   // TCHECK:  [[B_ADDR:%.+]] = alloca [10 x float]*,
228*67e74705SXin Li   // TCHECK:  [[VLA_ADDR:%.+]] = alloca i{{[0-9]+}},
229*67e74705SXin Li   // TCHECK:  [[BN_ADDR:%.+]] = alloca float*,
230*67e74705SXin Li   // TCHECK:  [[C_ADDR:%.+]] = alloca [5 x [10 x double]]*,
231*67e74705SXin Li   // TCHECK:  [[VLA_ADDR2:%.+]] = alloca i{{[0-9]+}},
232*67e74705SXin Li   // TCHECK:  [[VLA_ADDR4:%.+]] = alloca i{{[0-9]+}},
233*67e74705SXin Li   // TCHECK:  [[CN_ADDR:%.+]] = alloca double*,
234*67e74705SXin Li   // TCHECK:  [[D_ADDR:%.+]] = alloca [[TT]]*,
235*67e74705SXin Li   // TCHECK-NOT: alloca i{{[0-9]+}},
236*67e74705SXin Li   // TCHECK:  [[B_PRIV:%.+]] = alloca [10 x float],
237*67e74705SXin Li   // TCHECK:  [[SSTACK:%.+]] = alloca i8*,
238*67e74705SXin Li   // TCHECK:  [[C_PRIV:%.+]] = alloca [5 x [10 x double]],
239*67e74705SXin Li   // TCHECK:  [[D_PRIV:%.+]] = alloca [[TT]],
240*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[A2_IN]], i{{[0-9]+}}* [[A2_ADDR]],
241*67e74705SXin Li   // TCHECK:  store [10 x float]* [[B_IN]], [10 x float]** [[B_ADDR]],
242*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[BN_SZ]], i{{[0-9]+}}* [[VLA_ADDR]],
243*67e74705SXin Li   // TCHECK:  store float* [[BN_IN]], float** [[BN_ADDR]],
244*67e74705SXin Li   // TCHECK:  store [5 x [10 x double]]* [[C_IN]], [5 x [10 x double]]** [[C_ADDR]],
245*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[CN_SZ1]], i{{[0-9]+}}* [[VLA_ADDR2]],
246*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[CN_SZ2]], i{{[0-9]+}}* [[VLA_ADDR4]],
247*67e74705SXin Li   // TCHECK:  store double* [[CN_IN]], double** [[CN_ADDR]],
248*67e74705SXin Li   // TCHECK:  store [[TT]]* [[D_IN]], [[TT]]** [[D_ADDR]],
249*67e74705SXin Li   // TCHECK:  [[CONV_A2ADDR:%.+]] = bitcast i{{[0-9]+}}* [[A2_ADDR]] to i{{[0-9]+}}*
250*67e74705SXin Li   // TCHECK:  [[B_ADDR_REF:%.+]] = load [10 x float]*, [10 x float]** [[B_ADDR]],
251*67e74705SXin Li   // TCHECK:  [[BN_SZ_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[VLA_ADDR]],
252*67e74705SXin Li   // TCHECK:  [[BN_ADDR_REF:%.+]] = load float*, float** [[BN_ADDR]],
253*67e74705SXin Li   // TCHECK:  [[C_ADDR_REF:%.+]] = load [5 x [10 x double]]*, [5 x [10 x double]]** [[C_ADDR]],
254*67e74705SXin Li   // TCHECK:  [[CN_SZ1_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[VLA_ADDR2]],
255*67e74705SXin Li   // TCHECK:  [[CN_SZ2_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[VLA_ADDR4]],
256*67e74705SXin Li   // TCHECK:  [[CN_ADDR_REF:%.+]] = load double*, double** [[CN_ADDR]],
257*67e74705SXin Li   // TCHECK:  [[D_ADDR_REF:%.+]] = load [[TT]]*, [[TT]]** [[D_ADDR]],
258*67e74705SXin Li 
259*67e74705SXin Li   // firstprivate(aa): a_priv = a_in
260*67e74705SXin Li   // TCHECK-NOT:  store i{{[0-9]+}} %
261*67e74705SXin Li 
262*67e74705SXin Li   //  firstprivate(b): memcpy(b_priv,b_in)
263*67e74705SXin Li   // TCHECK:  [[B_PRIV_BCAST:%.+]] = bitcast [10 x float]* [[B_PRIV]] to i8*
264*67e74705SXin Li   // TCHECK:  [[B_ADDR_REF_BCAST:%.+]] = bitcast [10 x float]* [[B_ADDR_REF]] to i8*
265*67e74705SXin Li   // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[B_PRIV_BCAST]], i8* [[B_ADDR_REF_BCAST]], {{.+}})
266*67e74705SXin Li 
267*67e74705SXin Li   // TCHECK:  [[RET_STACK:%.+]] = call i8* @llvm.stacksave()
268*67e74705SXin Li   // TCHECK:  store i8* [[RET_STACK]], i8** [[SSTACK]],
269*67e74705SXin Li 
270*67e74705SXin Li   // firstprivate(bn)
271*67e74705SXin Li   // TCHECK:  [[BN_PRIV:%.+]] = alloca float, i{{[0-9]+}} [[BN_SZ_VAL]],
272*67e74705SXin Li   // TCHECK:  [[BN_COPY_SZ:%.+]] = mul{{.+}} i{{[0-9]+}} [[BN_SZ_VAL]], 4
273*67e74705SXin Li   // TCHECK:  [[BN_PRIV__BCAST:%.+]] = bitcast float* [[BN_PRIV]] to i8*
274*67e74705SXin Li   // TCHECK:  [[BN_REF_IN_BCAST:%.+]] = bitcast float* [[BN_ADDR_REF]] to i8*
275*67e74705SXin Li   // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[BN_PRIV__BCAST]], i8* [[BN_REF_IN_BCAST]], i{{[0-9]+}} [[BN_COPY_SZ]],{{.+}})
276*67e74705SXin Li 
277*67e74705SXin Li   // firstprivate(c)
278*67e74705SXin Li   // TCHECK:  [[C_PRIV_BCAST:%.+]] = bitcast [5 x [10 x double]]* [[C_PRIV]] to i8*
279*67e74705SXin Li   // TCHECK:  [[C_IN_BCAST:%.+]] = bitcast [5 x [10 x double]]* [[C_ADDR_REF]] to i8*
280*67e74705SXin Li   // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[C_PRIV_BCAST]], i8* [[C_IN_BCAST]],{{.+}})
281*67e74705SXin Li 
282*67e74705SXin Li   // firstprivate(cn)
283*67e74705SXin Li   // TCHECK:  [[CN_SZ:%.+]] = mul{{.+}} i{{[0-9]+}} [[CN_SZ1_VAL]], [[CN_SZ2_VAL]]
284*67e74705SXin Li   // TCHECK:  [[CN_PRIV:%.+]] = alloca double, i{{[0-9]+}} [[CN_SZ]],
285*67e74705SXin Li   // TCHECK:  [[CN_SZ2:%.+]] = mul{{.+}} i{{[0-9]+}} [[CN_SZ1_VAL]], [[CN_SZ2_VAL]]
286*67e74705SXin Li   // TCHECK:  [[CN_SZ2_CPY:%.+]] = mul{{.+}} i{{[0-9]+}} [[CN_SZ2]], 8
287*67e74705SXin Li   // TCHECK:  [[CN_PRIV_BCAST:%.+]] = bitcast double* [[CN_PRIV]] to i8*
288*67e74705SXin Li   // TCHECK:  [[CN_IN_BCAST:%.+]] = bitcast double* [[CN_ADDR_REF]] to i8*
289*67e74705SXin Li   // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[CN_PRIV_BCAST]], i8* [[CN_IN_BCAST]], i{{[0-9]+}} [[CN_SZ2_CPY]],{{.+}})
290*67e74705SXin Li 
291*67e74705SXin Li   // firstprivate(d)
292*67e74705SXin Li   // TCHECK:  [[D_PRIV_BCAST:%.+]] = bitcast [[TT]]* [[D_PRIV]] to i8*
293*67e74705SXin Li   // TCHECK:  [[D_IN_BCAST:%.+]] = bitcast [[TT]]* [[D_ADDR_REF]] to i8*
294*67e74705SXin Li   // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[D_PRIV_BCAST]], i8* [[D_IN_BCAST]],{{.+}})
295*67e74705SXin Li 
296*67e74705SXin Li 
297*67e74705SXin Li   #pragma omp target firstprivate(ptr)
298*67e74705SXin Li   {
299*67e74705SXin Li     ptr[0]++;
300*67e74705SXin Li   }
301*67e74705SXin Li   // CHECK:  [[PTR_ADDR_REF:%.+]] = load double*, double** [[PTR_ADDR]],
302*67e74705SXin Li   // CHECK:  [[PTR_ADDR_BCAST:%.+]] = bitcast double* [[PTR_ADDR_REF]] to i8*
303*67e74705SXin Li 
304*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP3_0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BASE_PTR_ARR3]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
305*67e74705SXin Li   // CHECK:  store i8* [[PTR_ADDR_BCAST]], i8** [[BASE_PTR_GEP3_0]],
306*67e74705SXin Li   // CHECK:  [[PTR_ADDR_BCAST2:%.+]] = bitcast double* [[PTR_ADDR_REF]] to i8*
307*67e74705SXin Li   // CHECK:  [[PTR_GEP3_0:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PTR_ARR3]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
308*67e74705SXin Li   // CHECK:  store i8* [[PTR_ADDR_BCAST2]], i8** [[PTR_GEP3_0]],
309*67e74705SXin Li 
310*67e74705SXin Li   // CHECK:  [[BASE_PTR_GEP_ARG3:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[BASE_PTR_ARR3]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
311*67e74705SXin Li   // CHECK:  [[PTR_GEP_ARG3:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[PTR_ARR3]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
312*67e74705SXin Li   // CHECK: {{.+}} = call i32 @__tgt_target(i32 -1, {{.+}}, i32 1, i8** [[BASE_PTR_GEP_ARG3]], i8** [[PTR_GEP_ARG3]], i[[SZ]]* getelementptr inbounds ([1 x i[[SZ]]], [1 x i[[SZ]]]* [[SIZET3]], i32 0, i32 0), i32* getelementptr inbounds ([1 x i32], [1 x i32]* [[MAPT3]], i32 0, i32 0))
313*67e74705SXin Li 
314*67e74705SXin Li   // TCHECK:  define void @__omp_offloading_{{.+}}(double* [[PTR_IN:%.+]])
315*67e74705SXin Li   // TCHECK:  [[PTR_ADDR:%.+]] = alloca double*,
316*67e74705SXin Li   // TCHECK-NOT: alloca double*,
317*67e74705SXin Li   // TCHECK:  store double* [[PTR_IN]], double** [[PTR_ADDR]],
318*67e74705SXin Li   // TCHECK-NOT: store double* %
319*67e74705SXin Li 
320*67e74705SXin Li   return a;
321*67e74705SXin Li }
322*67e74705SXin Li 
323*67e74705SXin Li 
324*67e74705SXin Li template<typename tx>
ftemplate(int n)325*67e74705SXin Li tx ftemplate(int n) {
326*67e74705SXin Li   tx a = 0;
327*67e74705SXin Li   tx b[10];
328*67e74705SXin Li 
329*67e74705SXin Li #pragma omp target firstprivate(a,b)
330*67e74705SXin Li   {
331*67e74705SXin Li     a += 1;
332*67e74705SXin Li     b[2] += 1;
333*67e74705SXin Li   }
334*67e74705SXin Li 
335*67e74705SXin Li   return a;
336*67e74705SXin Li }
337*67e74705SXin Li 
338*67e74705SXin Li static
fstatic(int n)339*67e74705SXin Li int fstatic(int n) {
340*67e74705SXin Li   int a = 0;
341*67e74705SXin Li   char aaa = 0;
342*67e74705SXin Li   int b[10];
343*67e74705SXin Li 
344*67e74705SXin Li #pragma omp target firstprivate(a,aaa,b)
345*67e74705SXin Li   {
346*67e74705SXin Li     a += 1;
347*67e74705SXin Li     aaa += 1;
348*67e74705SXin Li     b[2] += 1;
349*67e74705SXin Li   }
350*67e74705SXin Li 
351*67e74705SXin Li   return a;
352*67e74705SXin Li }
353*67e74705SXin Li 
354*67e74705SXin Li // TCHECK: define void @__omp_offloading_{{.+}}(i{{[0-9]+}} [[A_IN:%.+]], i{{[0-9]+}} [[A3_IN:%.+]], [10 x i{{[0-9]+}}]*{{.+}} [[B_IN:%.+]])
355*67e74705SXin Li // TCHECK:  [[A_ADDR:%.+]] = alloca i{{[0-9]+}},
356*67e74705SXin Li // TCHECK:  [[A3_ADDR:%.+]] = alloca i{{[0-9]+}},
357*67e74705SXin Li // TCHECK:  [[B_ADDR:%.+]] = alloca [10 x i{{[0-9]+}}]*,
358*67e74705SXin Li // TCHECK-NOT: alloca i{{[0-9]+}},
359*67e74705SXin Li // TCHECK:  [[B_PRIV:%.+]] = alloca [10 x i{{[0-9]+}}],
360*67e74705SXin Li // TCHECK:  store i{{[0-9]+}} [[A_IN]], i{{[0-9]+}}* [[A_ADDR]],
361*67e74705SXin Li // TCHECK:  store i{{[0-9]+}} [[A3_IN]], i{{[0-9]+}}* [[A3_ADDR]],
362*67e74705SXin Li // TCHECK:  store [10 x i{{[0-9]+}}]* [[B_IN]], [10 x i{{[0-9]+}}]** [[B_ADDR]],
363*67e74705SXin Li // TCHECK-64:  [[A_CONV:%.+]] = bitcast i{{[0-9]+}}* [[A_ADDR]] to i{{[0-9]+}}*
364*67e74705SXin Li // TCHECK:  [[A3_CONV:%.+]] = bitcast i{{[0-9]+}}* [[A3_ADDR]] to i8*
365*67e74705SXin Li // TCHECK:  [[B_ADDR_REF:%.+]] = load [10 x i{{[0-9]+}}]*, [10 x i{{[0-9]+}}]** [[B_ADDR]],
366*67e74705SXin Li 
367*67e74705SXin Li // firstprivate(a): a_priv = a_in
368*67e74705SXin Li 
369*67e74705SXin Li // firstprivate(aaa)
370*67e74705SXin Li // TCHECK-NOT:  store i{{[0-9]+}} %
371*67e74705SXin Li 
372*67e74705SXin Li // firstprivate(b)
373*67e74705SXin Li // TCHECK:  [[B_PRIV_BCAST:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B_PRIV]] to i8*
374*67e74705SXin Li // TCHECK:  [[B_IN_BCAST:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B_ADDR_REF]] to i8*
375*67e74705SXin Li // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[B_PRIV_BCAST]], i8* [[B_IN_BCAST]],{{.+}})
376*67e74705SXin Li 
377*67e74705SXin Li // TCHECK:  ret void
378*67e74705SXin Li 
379*67e74705SXin Li struct S1 {
380*67e74705SXin Li   double a;
381*67e74705SXin Li 
r1S1382*67e74705SXin Li   int r1(int n){
383*67e74705SXin Li     int b = n+1;
384*67e74705SXin Li     short int c[2][n];
385*67e74705SXin Li 
386*67e74705SXin Li #pragma omp target firstprivate(b,c)
387*67e74705SXin Li     {
388*67e74705SXin Li       this->a = (double)b + 1.5;
389*67e74705SXin Li       c[1][1] = ++a;
390*67e74705SXin Li     }
391*67e74705SXin Li 
392*67e74705SXin Li     return c[1][1] + (int)b;
393*67e74705SXin Li   }
394*67e74705SXin Li 
395*67e74705SXin Li   // on the host side, we first generate r1, then the static function and the template above
396*67e74705SXin Li   // CHECK:  define{{.+}} i32 {{.+}}([[S1]]* {{.+}}, i{{[0-9]+}} {{.+}})
397*67e74705SXin Li   // CHECK:  [[BASE_PTRS4:%.+]] = alloca [5 x i8*],
398*67e74705SXin Li   // CHECK:  [[PTRS4:%.+]] = alloca [5 x i8*],
399*67e74705SXin Li   // CHECK:  [[SIZET4:%.+]] = alloca [5 x i{{[0-9]+}}],
400*67e74705SXin Li 
401*67e74705SXin Li   // map(this: this ptr is implicitly captured (not firstprivate matter)
402*67e74705SXin Li   // CHECK:  {{.+}} = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BASE_PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
403*67e74705SXin Li   // CHECK:  store {{.+}}, {{.+}},
404*67e74705SXin Li   // CHECK:  {{.+}} = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
405*67e74705SXin Li   // CHECK:  store {{.+}}, {{.+}},
406*67e74705SXin Li   // CHECK:  {{.+}} getelementptr inbounds [5 x i{{[0-9]+}}], [5 x i{{[0-9]+}}]* [[SIZET4]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
407*67e74705SXin Li   // CHECK:  store {{.+}}, {{.+}}
408*67e74705SXin Li 
409*67e74705SXin Li   // firstprivate(b): base_ptr = b, ptr = b, size = 4 (pass by-value)
410*67e74705SXin Li   // CHECK:  [[B_CAST_PTR:%.+]] = inttoptr i{{[0-9]+}} [[B_CAST:%.+]] to i8*
411*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP4_1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BASE_PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
412*67e74705SXin Li   // CHECK:  store i8* [[B_CAST_PTR]], i8** [[BASE_PTRS_GEP4_1]],
413*67e74705SXin Li   // CHECK:  [[B_CAST_PTR2:%.+]] = inttoptr i{{[0-9]+}} [[B_CAST:%.+]] to i8*
414*67e74705SXin Li   // CHECK:  [[PTRS_GEP4_1:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
415*67e74705SXin Li   // CHECK:  store i8* [[B_CAST_PTR2]], i8** [[PTRS_GEP4_1]],
416*67e74705SXin Li   // CHECK:  [[SIZES_GEP4_1:%.+]] = getelementptr inbounds [5 x i{{[0-9]+}}], [5 x i{{[0-9]+}}]* [[SIZET4]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
417*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIZES_GEP4_1]],
418*67e74705SXin Li 
419*67e74705SXin Li   // firstprivate(c), 3 entries: 2, n, c
420*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP4_2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BASE_PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
421*67e74705SXin Li   // CHECK:  store i8* inttoptr (i{{[0-9]+}} 2 to i8*), i8** [[BASE_PTRS_GEP4_2]],
422*67e74705SXin Li   // CHECK:  [[PTRS_GEP4_2:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
423*67e74705SXin Li   // CHECK:  store i8* inttoptr (i{{[0-9]+}} 2 to i8*), i8** [[PTRS_GEP4_2]],
424*67e74705SXin Li   // CHECK:  [[SIZES_GEP4_2:%.+]] = getelementptr inbounds [5 x i{{[0-9]+}}], [5 x i{{[0-9]+}}]* [[SIZET4]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
425*67e74705SXin Li   // CHECK-64:  store i{{[0-9]+}} 8, i{{[0-9]+}}* [[SIZES_GEP4_2]],
426*67e74705SXin Li   // CHECK-32:  store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIZES_GEP4_2]],
427*67e74705SXin Li   // CHECK:  [[N_PTR:%.+]] = inttoptr i{{[0-9]+}} [[N:%.+]] to i8*
428*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP4_3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BASE_PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
429*67e74705SXin Li   // CHECK:  store i8* [[N_PTR]], i8** [[BASE_PTRS_GEP4_3]],
430*67e74705SXin Li   // CHECK:  [[N_PTR2:%.+]] = inttoptr i{{[0-9]+}} [[N:%.+]] to i8*
431*67e74705SXin Li   // CHECK:  [[PTRS_GEP4_3:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
432*67e74705SXin Li   // CHECK:  store i8* [[N_PTR2]], i8** [[PTRS_GEP4_3]],
433*67e74705SXin Li   // CHECK:  [[SIZES_GEP4_3:%.+]] = getelementptr inbounds [5 x i{{[0-9]+}}], [5 x i{{[0-9]+}}]* [[SIZET4]], i{{[0-9]+}} 0, i{{[0-9]+}} 3
434*67e74705SXin Li   // CHECK-64:  store i{{[0-9]+}} 8, i{{[0-9]+}}* [[SIZES_GEP4_3]],
435*67e74705SXin Li   // CHECK-32:  store i{{[0-9]+}} 4, i{{[0-9]+}}* [[SIZES_GEP4_3]],
436*67e74705SXin Li   // CHECK:  [[B_BCAST:%.+]] = bitcast i{{[0-9]+}}* [[B:%.+]] to i8*
437*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP4_4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[BASE_PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
438*67e74705SXin Li   // CHECK:  store i8* [[B_BCAST]], i8** [[BASE_PTRS_GEP4_4]],
439*67e74705SXin Li   // CHECK:  [[B_BCAST2:%.+]] = bitcast i{{[0-9]+}}* [[B:%.+]] to i8*
440*67e74705SXin Li   // CHECK:  [[PTRS_GEP4_4:%.+]] = getelementptr inbounds [5 x i8*], [5 x i8*]* [[PTRS4]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
441*67e74705SXin Li   // CHECK:  store i8* [[B_BCAST2]], i8** [[PTRS_GEP4_4]],
442*67e74705SXin Li   // CHECK:  [[SIZES_GEP4_4:%.+]] = getelementptr inbounds [5 x i{{[0-9]+}}], [5 x i{{[0-9]+}}]* [[SIZET4]], i{{[0-9]+}} 0, i{{[0-9]+}} 4
443*67e74705SXin Li   // CHECK:  store i{{[0-9]+}} [[B_SIZE:%.+]], i{{[0-9]+}}* [[SIZES_GEP4_4]],
444*67e74705SXin Li 
445*67e74705SXin Li   // only check that we use the map types stored in the global variable
446*67e74705SXin Li   // CHECK:  call i32 @__tgt_target(i32 -1, {{.+}}, i32 5, i8** {{.+}}, i8** {{.+}}, i{{[0-9]+}}* {{.+}}, i32* getelementptr inbounds ([5 x i32], [5 x i32]* [[MAPT4]], i32 0, i32 0))
447*67e74705SXin Li 
448*67e74705SXin Li   // TCHECK: define void @__omp_offloading_{{.+}}([[S1]]* [[TH:%.+]], i{{[0-9]+}} [[B_IN:%.+]], i{{[0-9]+}} [[VLA:%.+]], i{{[0-9]+}} [[VLA1:%.+]], i{{[0-9]+}}{{.+}} [[C_IN:%.+]])
449*67e74705SXin Li   // TCHECK:  [[TH_ADDR:%.+]] = alloca [[S1]]*,
450*67e74705SXin Li   // TCHECK:  [[B_ADDR:%.+]] = alloca i{{[0-9]+}},
451*67e74705SXin Li   // TCHECK:  [[VLA_ADDR:%.+]] = alloca i{{[0-9]+}},
452*67e74705SXin Li   // TCHECK:  [[VLA_ADDR2:%.+]] = alloca i{{[0-9]+}},
453*67e74705SXin Li   // TCHECK:  [[C_ADDR:%.+]] = alloca i{{[0-9]+}}*,
454*67e74705SXin Li   // TCHECK-NOT: alloca i{{[0-9]+}},
455*67e74705SXin Li   // TCHECK:  [[SSTACK:%.+]] = alloca i8*,
456*67e74705SXin Li 
457*67e74705SXin Li   // TCHECK:  store [[S1]]* [[TH]], [[S1]]** [[TH_ADDR]],
458*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[B_IN]], i{{[0-9]+}}* [[B_ADDR]],
459*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[VLA]], i{{[0-9]+}}* [[VLA_ADDR]],
460*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}} [[VLA1]], i{{[0-9]+}}* [[VLA_ADDR2]],
461*67e74705SXin Li   // TCHECK:  store i{{[0-9]+}}* [[C_IN]], i{{[0-9]+}}** [[C_ADDR]],
462*67e74705SXin Li   // TCHECK:  [[TH_ADDR_REF:%.+]] = load [[S1]]*, [[S1]]** [[TH_ADDR]],
463*67e74705SXin Li   // TCHECK-64:  [[B_ADDR_CONV:%.+]] = bitcast i{{[0-9]+}}* [[B_ADDR]] to i{{[0-9]+}}*
464*67e74705SXin Li   // TCHECK:  [[VLA_ADDR_REF:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[VLA_ADDR]],
465*67e74705SXin Li   // TCHECK:  [[VLA_ADDR_REF2:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[VLA_ADDR2]],
466*67e74705SXin Li   // TCHECK:  [[C_ADDR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[C_ADDR]],
467*67e74705SXin Li 
468*67e74705SXin Li   // firstprivate(b)
469*67e74705SXin Li   // TCHECK-NOT:  store i{{[0-9]+}} %
470*67e74705SXin Li 
471*67e74705SXin Li   // TCHECK:  [[RET_STACK:%.+]] = call i8* @llvm.stacksave()
472*67e74705SXin Li   // TCHECK:  store i8* [[RET_STACK:%.+]], i8** [[SSTACK]],
473*67e74705SXin Li 
474*67e74705SXin Li   // firstprivate(c)
475*67e74705SXin Li   // TCHECK:  [[C_SZ:%.+]] = mul{{.+}} i{{[0-9]+}} [[VLA_ADDR_REF]], [[VLA_ADDR_REF2]]
476*67e74705SXin Li   // TCHECK:  [[C_PRIV:%.+]] = alloca i{{[0-9]+}}, i{{[0-9]+}} [[C_SZ]],
477*67e74705SXin Li   // TCHECK:  [[C_SZ2:%.+]] = mul{{.+}} i{{[0-9]+}} [[VLA_ADDR_REF]], [[VLA_ADDR_REF2]]
478*67e74705SXin Li   // TCHECK:  [[C_SZ_CPY:%.+]] = mul{{.+}} i{{[0-9]+}} [[C_SZ2]],  2
479*67e74705SXin Li   // TCHECK:  [[C_PRIV_BCAST:%.+]] = bitcast i{{[0-9]+}}* [[C_PRIV]] to i8*
480*67e74705SXin Li   // TCHECK:  [[C_IN_BCAST:%.+]] = bitcast i{{[0-9]+}}* [[C_ADDR_REF]] to i8*
481*67e74705SXin Li   // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[C_PRIV_BCAST]], i8* [[C_IN_BCAST]],{{.+}})
482*67e74705SXin Li 
483*67e74705SXin Li   // finish
484*67e74705SXin Li   // TCHECK: [[RELOAD_SSTACK:%.+]] = load i8*, i8** [[SSTACK]],
485*67e74705SXin Li   // TCHECK: call void @llvm.stackrestore(i8* [[RELOAD_SSTACK]])
486*67e74705SXin Li   // TCHECK: ret void
487*67e74705SXin Li 
488*67e74705SXin Li 
489*67e74705SXin Li   // static host function
490*67e74705SXin Li   // CHECK:  define{{.+}} i32 {{.+}}(i{{[0-9]+}} {{.+}})
491*67e74705SXin Li   // CHECK:  [[BASE_PTRS5:%.+]] = alloca [3 x i8*],
492*67e74705SXin Li   // CHECK:  [[PTRS5:%.+]] = alloca [3 x i8*],
493*67e74705SXin Li 
494*67e74705SXin Li   // firstprivate(a): by value
495*67e74705SXin Li   // CHECK:  [[A_CAST_PTR:%.+]] = inttoptr i{{[0-9]+}} [[A_CAST:%.+]] to i8*
496*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP5_0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BASE_PTRS5]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
497*67e74705SXin Li   // CHECK:  store i8* [[A_CAST_PTR]], i8** [[BASE_PTRS_GEP5_0]],
498*67e74705SXin Li   // CHECK:  [[A_CAST_PTR2:%.+]] = inttoptr i{{[0-9]+}} [[A_CAST:%.+]] to i8*
499*67e74705SXin Li   // CHECK:  [[PTRS_GEP5_0:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PTRS5]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
500*67e74705SXin Li   // CHECK:  store i8* [[A_CAST_PTR2]], i8** [[PTRS_GEP5_0]],
501*67e74705SXin Li 
502*67e74705SXin Li   // firstprivate(aaa): by value
503*67e74705SXin Li   // CHECK:  [[A3_CAST_PTR:%.+]] = inttoptr i{{[0-9]+}} [[A3_CAST:%.+]] to i8*
504*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP5_1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BASE_PTRS5]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
505*67e74705SXin Li   // CHECK:  store i8* [[A3_CAST_PTR]], i8** [[BASE_PTRS_GEP5_1]],
506*67e74705SXin Li   // CHECK:  [[A3_CAST_PTR2:%.+]] = inttoptr i{{[0-9]+}} [[A3_CAST:%.+]] to i8*
507*67e74705SXin Li   // CHECK:  [[PTRS_GEP5_1:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PTRS5]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
508*67e74705SXin Li   // CHECK:  store i8* [[A3_CAST_PTR2]], i8** [[PTRS_GEP5_1]],
509*67e74705SXin Li 
510*67e74705SXin Li   // firstprivate(b): base_ptr = &b[0], ptr= &b[0]
511*67e74705SXin Li   // CHECK:  [[B_BCAST:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B:%.+]] to i8*
512*67e74705SXin Li   // CHECK:  [[BASE_PTRS_GEP5_2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[BASE_PTRS5]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
513*67e74705SXin Li   // CHECK:  store i8* [[B_BCAST]], i8** [[BASE_PTRS_GEP5_2]],
514*67e74705SXin Li   // CHECK:  [[B_BCAST2:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B:%.+]] to i8*
515*67e74705SXin Li   // CHECK:  [[PTRS_GEP5_2:%.+]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[PTRS5]], i{{[0-9]+}} 0, i{{[0-9]+}} 2
516*67e74705SXin Li   // CHECK:  store i8* [[B_BCAST2]], i8** [[PTRS_GEP5_2]],
517*67e74705SXin Li 
518*67e74705SXin Li   // only check that the right sizes and map types are used
519*67e74705SXin Li   // CHECK:  call i32 @__tgt_target(i32 -1, {{.+}}, i32 3, i8** {{.+}}, i8** {{.+}}, i[[SZ]]* getelementptr inbounds ([3 x i[[SZ]]], [3 x i[[SZ]]]* [[SIZET5]], i32 0, i32 0), i32* getelementptr inbounds ([3 x i32], [3 x i32]* [[MAPT5]], i32 0, i32 0))
520*67e74705SXin Li };
521*67e74705SXin Li 
522*67e74705SXin Li 
523*67e74705SXin Li 
bar(int n,double * ptr)524*67e74705SXin Li int bar(int n, double *ptr){
525*67e74705SXin Li   int a = 0;
526*67e74705SXin Li   a += foo(n, ptr);
527*67e74705SXin Li   S1 S;
528*67e74705SXin Li   a += S.r1(n);
529*67e74705SXin Li   a += fstatic(n);
530*67e74705SXin Li   a += ftemplate<int>(n);
531*67e74705SXin Li 
532*67e74705SXin Li   return a;
533*67e74705SXin Li }
534*67e74705SXin Li 
535*67e74705SXin Li // template host and device
536*67e74705SXin Li 
537*67e74705SXin Li // CHECK:  define{{.+}} i32 {{.+}}(i{{[0-9]+}} {{.+}})
538*67e74705SXin Li // CHECK:  [[BASE_PTRS6:%.+]] = alloca [2 x i8*],
539*67e74705SXin Li // CHECK:  [[PTRS6:%.+]] = alloca [2 x i8*],
540*67e74705SXin Li 
541*67e74705SXin Li // firstprivate(a): by value
542*67e74705SXin Li // CHECK:  [[AT_CAST_PTR:%.+]] = inttoptr i{{[0-9]+}} [[AT_CAST:%.+]] to i8*
543*67e74705SXin Li // CHECK:  [[BASE_PTRS_GEP6_0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BASE_PTRS6]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
544*67e74705SXin Li // CHECK:  store i8* [[AT_CAST_PTR]], i8** [[BASE_PTRS_GEP6_0]],
545*67e74705SXin Li // CHECK:  [[AT_CAST_PTR2:%.+]] = inttoptr i{{[0-9]+}} [[AT_CAST:%.+]] to i8*
546*67e74705SXin Li // CHECK:  [[PTRS_GEP6_0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[PTRS6]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
547*67e74705SXin Li // CHECK:  store i8* [[AT_CAST_PTR2]], i8** [[PTRS_GEP6_0]],
548*67e74705SXin Li 
549*67e74705SXin Li // firstprivate(b): pointer
550*67e74705SXin Li // CHECK:  [[B_BCAST:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B:%.+]] to i8*
551*67e74705SXin Li // CHECK:  [[BASE_PTRS_GEP6_1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BASE_PTRS6]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
552*67e74705SXin Li // CHECK:  store i8* [[B_BCAST]], i8** [[BASE_PTRS_GEP6_1]],
553*67e74705SXin Li // CHECK:  [[B_BCAST2:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B:%.+]] to i8*
554*67e74705SXin Li // CHECK:  [[PTRS_GEP6_1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[PTRS6]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
555*67e74705SXin Li // CHECK:  store i8* [[B_BCAST2]], i8** [[PTRS_GEP6_1]],
556*67e74705SXin Li 
557*67e74705SXin Li // CHECK:  call i32 @__tgt_target(i32 -1, {{.+}}, i32 2, i8** {{.+}}, i8** {{.+}}, i[[SZ]]* getelementptr inbounds ([2 x i[[SZ]]], [2 x i[[SZ]]]* [[SIZET6]], i32 0, i32 0), i32* getelementptr inbounds ([2 x i32], [2 x i32]* [[MAPT6]], i32 0, i32 0))
558*67e74705SXin Li 
559*67e74705SXin Li 
560*67e74705SXin Li // TCHECK: define void @__omp_offloading_{{.+}}(i{{[0-9]+}} [[A_IN:%.+]], [10 x i{{[0-9]+}}]*{{.+}} [[B_IN:%.+]])
561*67e74705SXin Li // TCHECK:  [[A_ADDR:%.+]] = alloca i{{[0-9]+}},
562*67e74705SXin Li // TCHECK:  [[B_ADDR:%.+]] = alloca [10 x i{{[0-9]+}}]*,
563*67e74705SXin Li // TCHECK-NOT: alloca i{{[0-9]+}},
564*67e74705SXin Li // TCHECK:  [[B_PRIV:%.+]] = alloca [10 x i{{[0-9]+}}],
565*67e74705SXin Li // TCHECK:  store i{{[0-9]+}} [[A_IN]], i{{[0-9]+}}* [[A_ADDR]],
566*67e74705SXin Li // TCHECK:  store [10 x i{{[0-9]+}}]* [[B_IN]], [10 x i{{[0-9]+}}]** [[B_ADDR]],
567*67e74705SXin Li // TCHECK-64:  [[A_ADDR_CONV:%.+]] = bitcast i{{[0-9]+}}* [[A_ADDR]] to i{{[0-9]+}}*
568*67e74705SXin Li // TCHECK:  [[B_ADDR_REF:%.+]] = load [10 x i{{[0-9]+}}]*, [10 x i{{[0-9]+}}]** [[B_ADDR]],
569*67e74705SXin Li 
570*67e74705SXin Li // firstprivate(a)
571*67e74705SXin Li // TCHECK-NOT:  store i{{[0-9]+}} %
572*67e74705SXin Li 
573*67e74705SXin Li // firstprivate(b)
574*67e74705SXin Li // TCHECK:  [[B_PRIV_BCAST:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B_PRIV]] to i8*
575*67e74705SXin Li // TCHECK:  [[B_IN_BCAST:%.+]] = bitcast [10 x i{{[0-9]+}}]* [[B_ADDR_REF]] to i8*
576*67e74705SXin Li // TCHECK:  call void @llvm.memcpy.{{.+}}(i8* [[B_PRIV_BCAST]], i8* [[B_IN_BCAST]],{{.+}})
577*67e74705SXin Li 
578*67e74705SXin Li // TCHECK: ret void
579*67e74705SXin Li 
580*67e74705SXin Li #endif
581