1 // expected-no-diagnostics 2 #ifndef HEADER 3 #define HEADER 4 5 /// 6 /// Implicit maps. 7 /// 8 9 ///==========================================================================/// 10 // RUN: %clang_cc1 -DCK1 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-64 11 // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 12 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK1 --check-prefix CK1-64 13 // RUN: %clang_cc1 -DCK1 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-32 14 // RUN: %clang_cc1 -DCK1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 15 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK1 --check-prefix CK1-32 16 #ifdef CK1 17 18 // CK1-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 19 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 20 // CK1-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 21 22 // CK1-LABEL: implicit_maps_integer 23 void implicit_maps_integer (int a){ 24 int i = a; 25 26 // CK1-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 27 // CK1-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 28 // CK1-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 29 // CK1-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 30 // CK1-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 31 // CK1-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 32 // CK1-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 33 // CK1-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 34 // CK1-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 35 // CK1-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 36 // CK1-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 37 // CK1-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 38 39 // CK1: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 40 #pragma omp target 41 { 42 ++i; 43 } 44 } 45 46 // CK1: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 47 // CK1: [[ADDR:%.+]] = alloca i[[sz]], 48 // CK1: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 49 // CK1-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 50 // CK1-64: {{.+}} = load i32, i32* [[CADDR]], 51 // CK1-32: {{.+}} = load i32, i32* [[ADDR]], 52 53 #endif 54 ///==========================================================================/// 55 // RUN: %clang_cc1 -DCK2 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-64 56 // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 57 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK2 --check-prefix CK2-64 58 // RUN: %clang_cc1 -DCK2 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-32 59 // RUN: %clang_cc1 -DCK2 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 60 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK2 --check-prefix CK2-32 61 #ifdef CK2 62 63 // CK2-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 64 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 65 // CK2-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 66 67 // CK2-LABEL: implicit_maps_integer_reference 68 void implicit_maps_integer_reference (int a){ 69 int &i = a; 70 // CK2-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 71 // CK2-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 72 // CK2-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 73 // CK2-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 74 // CK2-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 75 // CK2-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 76 // CK2-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 77 // CK2-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 78 // CK2-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 79 // CK2-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 80 // CK2-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 81 // CK2-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 82 83 // CK2: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 84 #pragma omp target 85 { 86 ++i; 87 } 88 } 89 90 // CK2: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 91 // CK2: [[ADDR:%.+]] = alloca i[[sz]], 92 // CK2: [[REF:%.+]] = alloca i32*, 93 // CK2: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 94 // CK2-64: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 95 // CK2-64: store i32* [[CADDR]], i32** [[REF]], 96 // CK2-64: [[RVAL:%.+]] = load i32*, i32** [[REF]], 97 // CK2-64: {{.+}} = load i32, i32* [[RVAL]], 98 // CK2-32: store i32* [[ADDR]], i32** [[REF]], 99 // CK2-32: [[RVAL:%.+]] = load i32*, i32** [[REF]], 100 // CK2-32: {{.+}} = load i32, i32* [[RVAL]], 101 102 #endif 103 ///==========================================================================/// 104 // RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-64 105 // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 106 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK3 --check-prefix CK3-64 107 // RUN: %clang_cc1 -DCK3 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32 108 // RUN: %clang_cc1 -DCK3 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 109 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK3 --check-prefix CK3-32 110 #ifdef CK3 111 112 // CK3-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 113 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 114 // CK3-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 115 116 // CK3-LABEL: implicit_maps_parameter 117 void implicit_maps_parameter (int a){ 118 119 // CK3-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 120 // CK3-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 121 // CK3-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 122 // CK3-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 123 // CK3-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 124 // CK3-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 125 // CK3-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 126 // CK3-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 127 // CK3-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 128 // CK3-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 129 // CK3-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 130 // CK3-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 131 132 // CK3: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 133 #pragma omp target 134 { 135 ++a; 136 } 137 } 138 139 // CK3: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 140 // CK3: [[ADDR:%.+]] = alloca i[[sz]], 141 // CK3: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 142 // CK3-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 143 // CK3-64: {{.+}} = load i32, i32* [[CADDR]], 144 // CK3-32: {{.+}} = load i32, i32* [[ADDR]], 145 146 #endif 147 ///==========================================================================/// 148 // RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-64 149 // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 150 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK4 --check-prefix CK4-64 151 // RUN: %clang_cc1 -DCK4 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32 152 // RUN: %clang_cc1 -DCK4 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 153 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK4 --check-prefix CK4-32 154 #ifdef CK4 155 156 // CK4-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 157 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 158 // CK4-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 159 160 // CK4-LABEL: implicit_maps_nested_integer 161 void implicit_maps_nested_integer (int a){ 162 int i = a; 163 164 // The captures in parallel are by reference. Only the capture in target is by 165 // copy. 166 167 // CK4: call void {{.+}}@__kmpc_fork_call({{.+}} [[KERNELP1:@.+]] to void (i32*, i32*, ...)*), i32* {{.+}}) 168 // CK4: define internal void [[KERNELP1]](i32* {{[^,]+}}, i32* {{[^,]+}}, i32* {{[^,]+}}) 169 #pragma omp parallel 170 { 171 // CK4-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 172 // CK4-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 173 // CK4-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 174 // CK4-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 175 // CK4-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 176 // CK4-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 177 // CK4-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 178 // CK4-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 179 // CK4-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 180 // CK4-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 181 // CK4-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 182 // CK4-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 183 184 // CK4: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 185 #pragma omp target 186 { 187 #pragma omp parallel 188 { 189 ++i; 190 } 191 } 192 } 193 } 194 195 // CK4: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 196 // CK4: [[ADDR:%.+]] = alloca i[[sz]], 197 // CK4: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 198 // CK4-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 199 // CK4-64: call void {{.+}}@__kmpc_fork_call({{.+}} [[KERNELP2:@.+]] to void (i32*, i32*, ...)*), i32* [[CADDR]]) 200 // CK4-32: call void {{.+}}@__kmpc_fork_call({{.+}} [[KERNELP2:@.+]] to void (i32*, i32*, ...)*), i32* [[ADDR]]) 201 // CK4: define internal void [[KERNELP2]](i32* {{[^,]+}}, i32* {{[^,]+}}, i32* {{[^,]+}}) 202 #endif 203 ///==========================================================================/// 204 // RUN: %clang_cc1 -DCK5 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK5 --check-prefix CK5-64 205 // RUN: %clang_cc1 -DCK5 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 206 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK5 --check-prefix CK5-64 207 // RUN: %clang_cc1 -DCK5 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK5 --check-prefix CK5-32 208 // RUN: %clang_cc1 -DCK5 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 209 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK5 --check-prefix CK5-32 210 #ifdef CK5 211 212 // CK5-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 213 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 214 // CK5-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 215 216 // CK5-LABEL: implicit_maps_nested_integer_and_enum 217 void implicit_maps_nested_integer_and_enum (int a){ 218 enum Bla { 219 SomeEnum = 0x09 220 }; 221 222 // Using an enum should not change the mapping information. 223 int i = a; 224 225 // CK5-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 226 // CK5-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 227 // CK5-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 228 // CK5-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 229 // CK5-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 230 // CK5-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 231 // CK5-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 232 // CK5-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 233 // CK5-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 234 // CK5-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 235 // CK5-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 236 // CK5-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 237 238 // CK5: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 239 #pragma omp target 240 { 241 ++i; 242 i += SomeEnum; 243 } 244 } 245 246 // CK5: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 247 // CK5: [[ADDR:%.+]] = alloca i[[sz]], 248 // CK5: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 249 // CK5-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 250 // CK5-64: {{.+}} = load i32, i32* [[CADDR]], 251 // CK5-32: {{.+}} = load i32, i32* [[ADDR]], 252 253 #endif 254 ///==========================================================================/// 255 // RUN: %clang_cc1 -DCK6 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK6 --check-prefix CK6-64 256 // RUN: %clang_cc1 -DCK6 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 257 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK6 --check-prefix CK6-64 258 // RUN: %clang_cc1 -DCK6 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK6 --check-prefix CK6-32 259 // RUN: %clang_cc1 -DCK6 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 260 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK6 --check-prefix CK6-32 261 #ifdef CK6 262 // CK6-DAG: [[GBL:@Gi]] = global i32 0 263 // CK6-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 264 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 265 // CK6-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 266 267 // CK6-LABEL: implicit_maps_host_global 268 int Gi; 269 void implicit_maps_host_global (int a){ 270 // CK6-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 271 // CK6-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 272 // CK6-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 273 // CK6-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 274 // CK6-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 275 // CK6-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 276 // CK6-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 277 // CK6-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 278 // CK6-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 279 // CK6-64-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 280 // CK6-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 281 // CK6-64-DAG: store i32 [[GBLVAL:%.+]], i32* [[CADDR]], 282 // CK6-64-DAG: [[GBLVAL]] = load i32, i32* [[GBL]], 283 // CK6-32-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[GBLVAL:%.+]], 284 285 // CK6: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 286 #pragma omp target 287 { 288 ++Gi; 289 } 290 } 291 292 // CK6: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 293 // CK6: [[ADDR:%.+]] = alloca i[[sz]], 294 // CK6: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 295 // CK6-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 296 // CK6-64: {{.+}} = load i32, i32* [[CADDR]], 297 // CK6-32: {{.+}} = load i32, i32* [[ADDR]], 298 299 #endif 300 ///==========================================================================/// 301 // RUN: %clang_cc1 -DCK7 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK7 --check-prefix CK7-64 302 // RUN: %clang_cc1 -DCK7 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 303 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK7 --check-prefix CK7-64 304 // RUN: %clang_cc1 -DCK7 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK7 --check-prefix CK7-32 305 // RUN: %clang_cc1 -DCK7 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 306 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK7 --check-prefix CK7-32 307 #ifdef CK7 308 309 // For a 32-bit targets, the value doesn't fit the size of the pointer, 310 // therefore it is passed by reference with a map 'to' specification. 311 312 // CK7-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 8] 313 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 314 // CK7-64-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 315 // Map types: OMP_MAP_TO | OMP_MAP_IS_FIRST = 33 316 // CK7-32-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 33] 317 318 // CK7-LABEL: implicit_maps_double 319 void implicit_maps_double (int a){ 320 double d = (double)a; 321 322 // CK7-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 323 // CK7-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 324 // CK7-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 325 // CK7-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 326 // CK7-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 327 328 // CK7-64-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 329 // CK7-64-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 330 // CK7-64-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 331 // CK7-64-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 332 // CK7-64-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 333 // CK7-64-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to double* 334 // CK7-64-64-DAG: store double {{.+}}, double* [[CADDR]], 335 336 // CK7-32-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 337 // CK7-32-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 338 // CK7-32-DAG: [[VALBP]] = bitcast double* [[DECL:%.+]] to i8* 339 // CK7-32-DAG: [[VALP]] = bitcast double* [[DECL]] to i8* 340 341 // CK7-64: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 342 // CK7-32: call void [[KERNEL:@.+]](double* [[DECL]]) 343 #pragma omp target 344 { 345 d += 1.0; 346 } 347 } 348 349 // CK7-64: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 350 // CK7-64: [[ADDR:%.+]] = alloca i[[sz]], 351 // CK7-64: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 352 // CK7-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to double* 353 // CK7-64: {{.+}} = load double, double* [[CADDR]], 354 355 // CK7-32: define internal void [[KERNEL]](double* {{.+}}[[ARG:%.+]]) 356 // CK7-32: [[ADDR:%.+]] = alloca double*, 357 // CK7-32: store double* [[ARG]], double** [[ADDR]], 358 // CK7-32: [[REF:%.+]] = load double*, double** [[ADDR]], 359 // CK7-32: {{.+}} = load double, double* [[REF]], 360 361 #endif 362 ///==========================================================================/// 363 // RUN: %clang_cc1 -DCK8 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK8 364 // RUN: %clang_cc1 -DCK8 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 365 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK8 366 // RUN: %clang_cc1 -DCK8 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK8 367 // RUN: %clang_cc1 -DCK8 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 368 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK8 369 #ifdef CK8 370 371 // CK8-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 372 // Map types: OMP_MAP_PRIVATE_VAL | OMP_MAP_IS_FIRST = 288 373 // CK8-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 374 375 // CK8-LABEL: implicit_maps_float 376 void implicit_maps_float (int a){ 377 float f = (float)a; 378 379 // CK8-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 380 // CK8-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 381 // CK8-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 382 // CK8-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 383 // CK8-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 384 // CK8-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 385 // CK8-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 386 // CK8-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 387 // CK8-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 388 // CK8-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 389 // CK8-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to float* 390 // CK8-DAG: store float {{.+}}, float* [[CADDR]], 391 392 // CK8: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 393 #pragma omp target 394 { 395 f += 1.0; 396 } 397 } 398 399 // CK8: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 400 // CK8: [[ADDR:%.+]] = alloca i[[sz]], 401 // CK8: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 402 // CK8: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to float* 403 // CK8: {{.+}} = load float, float* [[CADDR]], 404 405 #endif 406 ///==========================================================================/// 407 // RUN: %clang_cc1 -DCK9 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK9 408 // RUN: %clang_cc1 -DCK9 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 409 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK9 410 // RUN: %clang_cc1 -DCK9 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK9 411 // RUN: %clang_cc1 -DCK9 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 412 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK9 413 #ifdef CK9 414 415 // CK9-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 16] 416 // Map types: OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35 417 // CK9-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 35] 418 419 // CK9-LABEL: implicit_maps_array 420 void implicit_maps_array (int a){ 421 double darr[2] = {(double)a, (double)a}; 422 423 // CK9-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 424 // CK9-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 425 // CK9-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 426 // CK9-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 427 // CK9-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 428 // CK9-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 429 // CK9-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 430 // CK9-DAG: [[VALBP]] = bitcast [2 x double]* [[DECL:%.+]] to i8* 431 // CK9-DAG: [[VALP]] = bitcast [2 x double]* [[DECL]] to i8* 432 433 // CK9: call void [[KERNEL:@.+]]([2 x double]* [[DECL]]) 434 #pragma omp target 435 { 436 darr[0] += 1.0; 437 darr[1] += 1.0; 438 } 439 } 440 441 // CK9: define internal void [[KERNEL]]([2 x double]* {{.+}}[[ARG:%.+]]) 442 // CK9: [[ADDR:%.+]] = alloca [2 x double]*, 443 // CK9: store [2 x double]* [[ARG]], [2 x double]** [[ADDR]], 444 // CK9: [[REF:%.+]] = load [2 x double]*, [2 x double]** [[ADDR]], 445 // CK9: {{.+}} = getelementptr inbounds [2 x double], [2 x double]* [[REF]], i[[sz]] 0, i[[sz]] 0 446 #endif 447 ///==========================================================================/// 448 // RUN: %clang_cc1 -DCK10 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK10 449 // RUN: %clang_cc1 -DCK10 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 450 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK10 451 // RUN: %clang_cc1 -DCK10 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK10 452 // RUN: %clang_cc1 -DCK10 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 453 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK10 454 #ifdef CK10 455 456 // CK10-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] zeroinitializer 457 // Map types: OMP_MAP_IS_FIRST = 32 458 // CK10-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 32] 459 460 // CK10-LABEL: implicit_maps_pointer 461 void implicit_maps_pointer (){ 462 double *ddyn; 463 464 // CK10-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 465 // CK10-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 466 // CK10-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 467 // CK10-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 468 // CK10-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 469 // CK10-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 470 // CK10-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 471 // CK10-DAG: [[VALBP]] = bitcast double* [[PTR:%.+]] to i8* 472 // CK10-DAG: [[VALP]] = bitcast double* [[PTR]] to i8* 473 474 // CK10: call void [[KERNEL:@.+]](double* [[PTR]]) 475 #pragma omp target 476 { 477 ddyn[0] += 1.0; 478 ddyn[1] += 1.0; 479 } 480 } 481 482 // CK10: define internal void [[KERNEL]](double* {{.*}}[[ARG:%.+]]) 483 // CK10: [[ADDR:%.+]] = alloca double*, 484 // CK10: store double* [[ARG]], double** [[ADDR]], 485 // CK10: [[REF:%.+]] = load double*, double** [[ADDR]], 486 // CK10: {{.+}} = getelementptr inbounds double, double* [[REF]], i[[sz]] 0 487 488 #endif 489 ///==========================================================================/// 490 // RUN: %clang_cc1 -DCK11 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK11 491 // RUN: %clang_cc1 -DCK11 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 492 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK11 493 // RUN: %clang_cc1 -DCK11 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK11 494 // RUN: %clang_cc1 -DCK11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 495 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK11 496 #ifdef CK11 497 498 // CK11-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 16] 499 // Map types: OMP_MAP_TO + OMP_MAP_IS_FIRST = 33 500 // CK11-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 33] 501 502 // CK11-LABEL: implicit_maps_double_complex 503 void implicit_maps_double_complex (int a){ 504 double _Complex dc = (double)a; 505 506 // CK11-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 507 // CK11-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 508 // CK11-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 509 // CK11-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 510 // CK11-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 511 // CK11-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 512 // CK11-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 513 // CK11-DAG: [[VALBP]] = bitcast { double, double }* [[PTR:%.+]] to i8* 514 // CK11-DAG: [[VALP]] = bitcast { double, double }* [[PTR]] to i8* 515 516 // CK11: call void [[KERNEL:@.+]]({ double, double }* [[PTR]]) 517 #pragma omp target 518 { 519 dc *= dc; 520 } 521 } 522 523 // CK11: define internal void [[KERNEL]]({ double, double }* {{.*}}[[ARG:%.+]]) 524 // CK11: [[ADDR:%.+]] = alloca { double, double }*, 525 // CK11: store { double, double }* [[ARG]], { double, double }** [[ADDR]], 526 // CK11: [[REF:%.+]] = load { double, double }*, { double, double }** [[ADDR]], 527 // CK11: {{.+}} = getelementptr inbounds { double, double }, { double, double }* [[REF]], i32 0, i32 0 528 #endif 529 ///==========================================================================/// 530 // RUN: %clang_cc1 -DCK12 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK12 --check-prefix CK12-64 531 // RUN: %clang_cc1 -DCK12 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 532 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK12 --check-prefix CK12-64 533 // RUN: %clang_cc1 -DCK12 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK12 --check-prefix CK12-32 534 // RUN: %clang_cc1 -DCK12 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 535 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK12 --check-prefix CK12-32 536 #ifdef CK12 537 538 // For a 32-bit targets, the value doesn't fit the size of the pointer, 539 // therefore it is passed by reference with a map 'to' specification. 540 541 // CK12-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 8] 542 // Map types: OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 543 // CK12-64-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 544 // Map types: OMP_MAP_TO + OMP_MAP_IS_FIRST = 33 545 // CK12-32-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 33] 546 547 // CK12-LABEL: implicit_maps_float_complex 548 void implicit_maps_float_complex (int a){ 549 float _Complex fc = (float)a; 550 551 // CK12-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 552 // CK12-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 553 // CK12-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 554 // CK12-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 555 // CK12-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 556 557 // CK12-64-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 558 // CK12-64-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 559 // CK12-64-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 560 // CK12-64-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 561 // CK12-64-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 562 // CK12-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to { float, float }* 563 // CK12-64-DAG: store { float, float } {{.+}}, { float, float }* [[CADDR]], 564 565 // CK12-32-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 566 // CK12-32-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 567 // CK12-32-DAG: [[VALBP]] = bitcast { float, float }* [[DECL:%.+]] to i8* 568 // CK12-32-DAG: [[VALP]] = bitcast { float, float }* [[DECL]] to i8* 569 570 // CK12-64: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 571 // CK12-32: call void [[KERNEL:@.+]]({ float, float }* [[DECL]]) 572 #pragma omp target 573 { 574 fc *= fc; 575 } 576 } 577 578 // CK12-64: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 579 // CK12-64: [[ADDR:%.+]] = alloca i[[sz]], 580 // CK12-64: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 581 // CK12-64: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to { float, float }* 582 // CK12-64: {{.+}} = getelementptr inbounds { float, float }, { float, float }* [[CADDR]], i32 0, i32 0 583 584 // CK12-32: define internal void [[KERNEL]]({ float, float }* {{.+}}[[ARG:%.+]]) 585 // CK12-32: [[ADDR:%.+]] = alloca { float, float }*, 586 // CK12-32: store { float, float }* [[ARG]], { float, float }** [[ADDR]], 587 // CK12-32: [[REF:%.+]] = load { float, float }*, { float, float }** [[ADDR]], 588 // CK12-32: {{.+}} = getelementptr inbounds { float, float }, { float, float }* [[REF]], i32 0, i32 0 589 #endif 590 ///==========================================================================/// 591 // RUN: %clang_cc1 -DCK13 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK13 592 // RUN: %clang_cc1 -DCK13 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 593 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK13 594 // RUN: %clang_cc1 -DCK13 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK13 595 // RUN: %clang_cc1 -DCK13 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 596 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK13 597 #ifdef CK13 598 599 // We don't have a constant map size for VLAs. 600 // Map types: 601 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 (vla size) 602 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 (vla size) 603 // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35 604 // CK13-DAG: [[TYPES:@.+]] = {{.+}}constant [3 x i32] [i32 288, i32 288, i32 35] 605 606 // CK13-LABEL: implicit_maps_variable_length_array 607 void implicit_maps_variable_length_array (int a){ 608 double vla[2][a]; 609 610 // CK13-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 3, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], i[[sz:64|32]]* [[SGEP:%[^,]+]], {{.+}}[[TYPES]]{{.+}}) 611 // CK13-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 612 // CK13-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 613 // CK13-DAG: [[SGEP]] = getelementptr inbounds {{.+}}[[SS:%[^,]+]], i32 0, i32 0 614 615 // CK13-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 616 // CK13-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 617 // CK13-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[SS]], i32 0, i32 0 618 // CK13-DAG: store i8* inttoptr (i[[sz]] 2 to i8*), i8** [[BP0]], 619 // CK13-DAG: store i8* inttoptr (i[[sz]] 2 to i8*), i8** [[P0]], 620 // CK13-DAG: store i[[sz]] {{8|4}}, i[[sz]]* [[S0]], 621 622 // CK13-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1 623 // CK13-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1 624 // CK13-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[SS]], i32 0, i32 1 625 // CK13-DAG: store i8* [[VALBP1:%.+]], i8** [[BP1]], 626 // CK13-DAG: store i8* [[VALP1:%.+]], i8** [[P1]], 627 // CK13-DAG: [[VALBP1]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 628 // CK13-DAG: [[VALP1]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 629 // CK13-DAG: store i[[sz]] {{8|4}}, i[[sz]]* [[S1]], 630 631 // CK13-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 2 632 // CK13-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 2 633 // CK13-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[SS]], i32 0, i32 2 634 // CK13-DAG: store i8* [[VALBP2:%.+]], i8** [[BP2]], 635 // CK13-DAG: store i8* [[VALP2:%.+]], i8** [[P2]], 636 // CK13-DAG: store i[[sz]] [[VALS2:%.+]], i[[sz]]* [[S2]], 637 // CK13-DAG: [[VALBP2]] = bitcast double* [[DECL:%.+]] to i8* 638 // CK13-DAG: [[VALP2]] = bitcast double* [[DECL]] to i8* 639 // CK13-DAG: [[VALS2]] = mul nuw i[[sz]] %{{.+}}, 8 640 641 // CK13: call void [[KERNEL:@.+]](i[[sz]] {{.+}}, i[[sz]] {{.+}}, double* [[DECL]]) 642 #pragma omp target 643 { 644 vla[1][3] += 1.0; 645 } 646 } 647 648 // CK13: define internal void [[KERNEL]](i[[sz]] [[VLA0:%.+]], i[[sz]] [[VLA1:%.+]], double* {{.+}}[[ARG:%.+]]) 649 // CK13: [[ADDR0:%.+]] = alloca i[[sz]], 650 // CK13: [[ADDR1:%.+]] = alloca i[[sz]], 651 // CK13: [[ADDR2:%.+]] = alloca double*, 652 // CK13: store i[[sz]] [[VLA0]], i[[sz]]* [[ADDR0]], 653 // CK13: store i[[sz]] [[VLA1]], i[[sz]]* [[ADDR1]], 654 // CK13: store double* [[ARG]], double** [[ADDR2]], 655 // CK13: {{.+}} = load i[[sz]], i[[sz]]* [[ADDR0]], 656 // CK13: {{.+}} = load i[[sz]], i[[sz]]* [[ADDR1]], 657 // CK13: [[REF:%.+]] = load double*, double** [[ADDR2]], 658 // CK13: {{.+}} = getelementptr inbounds double, double* [[REF]], i[[sz]] %{{.+}} 659 #endif 660 ///==========================================================================/// 661 // RUN: %clang_cc1 -DCK14 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK14 --check-prefix CK14-64 662 // RUN: %clang_cc1 -DCK14 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 663 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK14 --check-prefix CK14-64 664 // RUN: %clang_cc1 -DCK14 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK14 --check-prefix CK14-32 665 // RUN: %clang_cc1 -DCK14 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 666 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK14 --check-prefix CK14-32 667 #ifdef CK14 668 669 // CK14-DAG: [[ST:%.+]] = type { i32, double } 670 // CK14-DAG: [[SIZES:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{16|12}}, i{{64|32}} 4] 671 // Map types: 672 // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35 673 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 674 // CK14-DAG: [[TYPES:@.+]] = {{.+}}constant [2 x i32] [i32 35, i32 288] 675 676 class SSS { 677 public: 678 int a; 679 double b; 680 681 void foo(int c) { 682 #pragma omp target 683 { 684 a += c; 685 b += (double)c; 686 } 687 } 688 689 SSS(int a, double b) : a(a), b(b) {} 690 }; 691 692 // CK14-LABEL: implicit_maps_class 693 void implicit_maps_class (int a){ 694 SSS sss(a, (double)a); 695 696 // CK14: define {{.*}}void @{{.+}}foo{{.+}}([[ST]]* {{[^,]+}}, i32 {{[^,]+}}) 697 // CK14-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 2, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 698 // CK14-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 699 // CK14-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 700 701 // CK14-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 702 // CK14-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 703 // CK14-DAG: store i8* [[VALBP0:%.+]], i8** [[BP0]], 704 // CK14-DAG: store i8* [[VALP0:%.+]], i8** [[P0]], 705 // CK14-DAG: [[VALBP0]] = bitcast [[ST]]* [[DECL:%.+]] to i8* 706 // CK14-DAG: [[VALP0]] = bitcast [[ST]]* [[DECL]] to i8* 707 708 // CK14-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1 709 // CK14-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1 710 // CK14-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 711 // CK14-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 712 // CK14-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 713 // CK14-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 714 // CK14-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 715 // CK14-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 716 // CK14-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 717 718 // CK14: call void [[KERNEL:@.+]]([[ST]]* [[DECL]], i[[sz]] {{.+}}) 719 sss.foo(123); 720 } 721 722 // CK14: define internal void [[KERNEL]]([[ST]]* [[THIS:%.+]], i[[sz]] [[ARG:%.+]]) 723 // CK14: [[ADDR0:%.+]] = alloca [[ST]]*, 724 // CK14: [[ADDR1:%.+]] = alloca i[[sz]], 725 // CK14: store [[ST]]* [[THIS]], [[ST]]** [[ADDR0]], 726 // CK14: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR1]], 727 // CK14: [[REF0:%.+]] = load [[ST]]*, [[ST]]** [[ADDR0]], 728 // CK14-64: [[CADDR1:%.+]] = bitcast i[[sz]]* [[ADDR1]] to i32* 729 // CK14-64: {{.+}} = load i32, i32* [[CADDR1]], 730 // CK14-32: {{.+}} = load i32, i32* [[ADDR1]], 731 // CK14: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF0]], i32 0, i32 0 732 733 #endif 734 ///==========================================================================/// 735 // RUN: %clang_cc1 -DCK15 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK15 --check-prefix CK15-64 736 // RUN: %clang_cc1 -DCK15 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 737 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK15 --check-prefix CK15-64 738 // RUN: %clang_cc1 -DCK15 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK15 --check-prefix CK15-32 739 // RUN: %clang_cc1 -DCK15 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 740 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK15 --check-prefix CK15-32 741 #ifdef CK15 742 743 // CK15: [[ST:%.+]] = type { i32, double, i32* } 744 // CK15: [[SIZES:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{24|16}}, i{{64|32}} 4] 745 // Map types: 746 // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35 747 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 748 // CK15: [[TYPES:@.+]] = {{.+}}constant [2 x i32] [i32 35, i32 288] 749 750 // CK15: [[SIZES2:@.+]] = {{.+}}constant [2 x i[[sz]]] [i{{64|32}} {{24|16}}, i{{64|32}} 4] 751 // Map types: 752 // - OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35 753 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 754 // CK15: [[TYPES2:@.+]] = {{.+}}constant [2 x i32] [i32 35, i32 288] 755 756 template<int x> 757 class SSST { 758 public: 759 int a; 760 double b; 761 int &r; 762 763 void foo(int c) { 764 #pragma omp target 765 { 766 a += c + x; 767 b += (double)(c + x); 768 r += x; 769 } 770 } 771 template<int y> 772 void bar(int c) { 773 #pragma omp target 774 { 775 a += c + x + y; 776 b += (double)(c + x + y); 777 r += x + y; 778 } 779 } 780 781 SSST(int a, double b, int &r) : a(a), b(b), r(r) {} 782 }; 783 784 // CK15-LABEL: implicit_maps_templated_class 785 void implicit_maps_templated_class (int a){ 786 SSST<123> ssst(a, (double)a, a); 787 788 // CK15: define {{.*}}void @{{.+}}foo{{.+}}([[ST]]* {{[^,]+}}, i32 {{[^,]+}}) 789 // CK15-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 2, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 790 // CK15-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 791 // CK15-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 792 793 // CK15-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 794 // CK15-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 795 // CK15-DAG: store i8* [[VALBP0:%.+]], i8** [[BP0]], 796 // CK15-DAG: store i8* [[VALP0:%.+]], i8** [[P0]], 797 // CK15-DAG: [[VALBP0]] = bitcast [[ST]]* [[DECL:%.+]] to i8* 798 // CK15-DAG: [[VALP0]] = bitcast [[ST]]* [[DECL]] to i8* 799 800 // CK15-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1 801 // CK15-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1 802 // CK15-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 803 // CK15-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 804 // CK15-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 805 // CK15-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 806 // CK15-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 807 // CK15-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 808 // CK15-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 809 810 // CK15: call void [[KERNEL:@.+]]([[ST]]* [[DECL]], i[[sz]] {{.+}}) 811 ssst.foo(456); 812 813 // CK15: define {{.*}}void @{{.+}}bar{{.+}}([[ST]]* {{[^,]+}}, i32 {{[^,]+}}) 814 // CK15-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 2, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES2]]{{.+}}, {{.+}}[[TYPES2]]{{.+}}) 815 // CK15-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 816 // CK15-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 817 818 // CK15-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 819 // CK15-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 820 // CK15-DAG: store i8* [[VALBP0:%.+]], i8** [[BP0]], 821 // CK15-DAG: store i8* [[VALP0:%.+]], i8** [[P0]], 822 // CK15-DAG: [[VALBP0]] = bitcast [[ST]]* [[DECL:%.+]] to i8* 823 // CK15-DAG: [[VALP0]] = bitcast [[ST]]* [[DECL]] to i8* 824 825 // CK15-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 1 826 // CK15-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 1 827 // CK15-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 828 // CK15-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 829 // CK15-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 830 // CK15-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 831 // CK15-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 832 // CK15-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 833 // CK15-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 834 835 // CK15: call void [[KERNEL2:@.+]]([[ST]]* [[DECL]], i[[sz]] {{.+}}) 836 ssst.bar<210>(789); 837 } 838 839 // CK15: define internal void [[KERNEL]]([[ST]]* [[THIS:%.+]], i[[sz]] [[ARG:%.+]]) 840 // CK15: [[ADDR0:%.+]] = alloca [[ST]]*, 841 // CK15: [[ADDR1:%.+]] = alloca i[[sz]], 842 // CK15: store [[ST]]* [[THIS]], [[ST]]** [[ADDR0]], 843 // CK15: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR1]], 844 // CK15: [[REF0:%.+]] = load [[ST]]*, [[ST]]** [[ADDR0]], 845 // CK15-64: [[CADDR1:%.+]] = bitcast i[[sz]]* [[ADDR1]] to i32* 846 // CK15-64: {{.+}} = load i32, i32* [[CADDR1]], 847 // CK15-32: {{.+}} = load i32, i32* [[ADDR1]], 848 // CK15: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF0]], i32 0, i32 0 849 850 // CK15: define internal void [[KERNEL2]]([[ST]]* [[THIS:%.+]], i[[sz]] [[ARG:%.+]]) 851 // CK15: [[ADDR0:%.+]] = alloca [[ST]]*, 852 // CK15: [[ADDR1:%.+]] = alloca i[[sz]], 853 // CK15: store [[ST]]* [[THIS]], [[ST]]** [[ADDR0]], 854 // CK15: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR1]], 855 // CK15: [[REF0:%.+]] = load [[ST]]*, [[ST]]** [[ADDR0]], 856 // CK15-64: [[CADDR1:%.+]] = bitcast i[[sz]]* [[ADDR1]] to i32* 857 // CK15-64: {{.+}} = load i32, i32* [[CADDR1]], 858 // CK15-32: {{.+}} = load i32, i32* [[ADDR1]], 859 // CK15: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF0]], i32 0, i32 0 860 861 #endif 862 ///==========================================================================/// 863 // RUN: %clang_cc1 -DCK16 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK16 --check-prefix CK16-64 864 // RUN: %clang_cc1 -DCK16 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 865 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK16 --check-prefix CK16-64 866 // RUN: %clang_cc1 -DCK16 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK16 --check-prefix CK16-32 867 // RUN: %clang_cc1 -DCK16 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 868 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK16 --check-prefix CK16-32 869 #ifdef CK16 870 871 // CK16-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 872 // Map types: 873 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 874 // CK16-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 875 876 template<int y> 877 int foo(int d) { 878 int res = d; 879 #pragma omp target 880 { 881 res += y; 882 } 883 return res; 884 } 885 // CK16-LABEL: implicit_maps_templated_function 886 void implicit_maps_templated_function (int a){ 887 int i = a; 888 889 // CK16: define {{.*}}i32 @{{.+}}foo{{.+}}(i32 {{[^,]+}}) 890 // CK16-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 891 // CK16-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 892 // CK16-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 893 894 // CK16-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 895 // CK16-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 896 // CK16-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 897 // CK16-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 898 // CK16-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 899 // CK16-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 900 // CK16-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 901 // CK16-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 902 // CK16-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 903 904 // CK16: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 905 i = foo<543>(i); 906 } 907 // CK16: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 908 // CK16: [[ADDR:%.+]] = alloca i[[sz]], 909 // CK16: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 910 // CK16-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 911 // CK16-64: {{.+}} = load i32, i32* [[CADDR]], 912 // CK16-32: {{.+}} = load i32, i32* [[ADDR]], 913 914 #endif 915 ///==========================================================================/// 916 // RUN: %clang_cc1 -DCK17 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK17 917 // RUN: %clang_cc1 -DCK17 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 918 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK17 919 // RUN: %clang_cc1 -DCK17 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK17 920 // RUN: %clang_cc1 -DCK17 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 921 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK17 922 #ifdef CK17 923 924 // CK17-DAG: [[ST:%.+]] = type { i32, double } 925 // CK17-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} {{16|12}}] 926 // Map types: OMP_MAP_TO + OMP_MAP_FROM + OMP_MAP_IS_FIRST = 35 927 // CK17-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 35] 928 929 class SSS { 930 public: 931 int a; 932 double b; 933 }; 934 935 // CK17-LABEL: implicit_maps_struct 936 void implicit_maps_struct (int a){ 937 SSS s = {a, (double)a}; 938 939 // CK17-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 940 // CK17-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 941 // CK17-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 942 // CK17-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 943 // CK17-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 944 // CK17-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 945 // CK17-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 946 // CK17-DAG: [[VALBP]] = bitcast [[ST]]* [[DECL:%.+]] to i8* 947 // CK17-DAG: [[VALP]] = bitcast [[ST]]* [[DECL]] to i8* 948 949 // CK17: call void [[KERNEL:@.+]]([[ST]]* [[DECL]]) 950 #pragma omp target 951 { 952 s.a += 1; 953 s.b += 1.0; 954 } 955 } 956 957 // CK17: define internal void [[KERNEL]]([[ST]]* {{.+}}[[ARG:%.+]]) 958 // CK17: [[ADDR:%.+]] = alloca [[ST]]*, 959 // CK17: store [[ST]]* [[ARG]], [[ST]]** [[ADDR]], 960 // CK17: [[REF:%.+]] = load [[ST]]*, [[ST]]** [[ADDR]], 961 // CK17: {{.+}} = getelementptr inbounds [[ST]], [[ST]]* [[REF]], i32 0, i32 0 962 #endif 963 ///==========================================================================/// 964 // RUN: %clang_cc1 -DCK18 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK18 --check-prefix CK18-64 965 // RUN: %clang_cc1 -DCK18 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 966 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK18 --check-prefix CK18-64 967 // RUN: %clang_cc1 -DCK18 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK18 --check-prefix CK18-32 968 // RUN: %clang_cc1 -DCK18 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 969 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK18 --check-prefix CK18-32 970 #ifdef CK18 971 972 // CK18-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 4] 973 // Map types: 974 // - OMP_MAP_PRIVATE_VAL + OMP_MAP_IS_FIRST = 288 975 // CK18-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 288] 976 977 template<typename T> 978 int foo(T d) { 979 #pragma omp target 980 { 981 d += (T)1; 982 } 983 return d; 984 } 985 // CK18-LABEL: implicit_maps_template_type_capture 986 void implicit_maps_template_type_capture (int a){ 987 int i = a; 988 989 // CK18: define {{.*}}i32 @{{.+}}foo{{.+}}(i32 {{[^,]+}}) 990 // CK18-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}) 991 // CK18-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 992 // CK18-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 993 994 // CK18-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 995 // CK18-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 996 // CK18-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 997 // CK18-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 998 // CK18-DAG: [[VALBP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 999 // CK18-DAG: [[VALP]] = inttoptr i[[sz]] [[VAL:%.+]] to i8* 1000 // CK18-DAG: [[VAL]] = load i[[sz]], i[[sz]]* [[ADDR:%.+]], 1001 // CK18-64-DAG: [[CADDR:%.+]] = bitcast i[[sz]]* [[ADDR]] to i32* 1002 // CK18-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 1003 1004 // CK18: call void [[KERNEL:@.+]](i[[sz]] [[VAL]]) 1005 i = foo(i); 1006 } 1007 // CK18: define internal void [[KERNEL]](i[[sz]] [[ARG:%.+]]) 1008 // CK18: [[ADDR:%.+]] = alloca i[[sz]], 1009 // CK18: store i[[sz]] [[ARG]], i[[sz]]* [[ADDR]], 1010 // CK18-64: [[CADDR:%.+]] = bitcast i64* [[ADDR]] to i32* 1011 // CK18-64: {{.+}} = load i32, i32* [[CADDR]], 1012 // CK18-32: {{.+}} = load i32, i32* [[ADDR]], 1013 1014 #endif 1015 ///==========================================================================/// 1016 // RUN: %clang_cc1 -DCK19 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK19 --check-prefix CK19-64 1017 // RUN: %clang_cc1 -DCK19 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 1018 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK19 --check-prefix CK19-64 1019 // RUN: %clang_cc1 -DCK19 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK19 --check-prefix CK19-32 1020 // RUN: %clang_cc1 -DCK19 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 1021 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK19 --check-prefix CK19-32 1022 #ifdef CK19 1023 1024 // CK19: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 1025 // CK19: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 1026 1027 // CK19: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400] 1028 // CK19: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 1029 1030 // CK19: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240] 1031 // CK19: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 1032 1033 // CK19: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240] 1034 // CK19: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1035 1036 // CK19: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400] 1037 // CK19: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 1038 1039 // CK19: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 1040 // CK19: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 1041 1042 // CK19: [[MTYPE06:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1043 1044 // CK19: [[MTYPE07:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 1045 1046 // CK19: [[SIZE08:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 1047 // CK19: [[MTYPE08:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1048 1049 // CK19: [[SIZE09:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}] 1050 // CK19: [[MTYPE09:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 1051 1052 // CK19: [[SIZE10:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240] 1053 // CK19: [[MTYPE10:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1054 1055 // CK19: [[SIZE11:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 240] 1056 // CK19: [[MTYPE11:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 1057 1058 // CK19: [[SIZE12:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 1059 // CK19: [[MTYPE12:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 1060 1061 // CK19: [[MTYPE13:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 1062 1063 // CK19: [[MTYPE14:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 1064 1065 // CK19: [[SIZE15:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 1066 // CK19: [[MTYPE15:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 1067 1068 // CK19: [[MTYPE16:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 33] 1069 1070 // CK19: [[SIZE17:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 240] 1071 // CK19: [[MTYPE17:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 34] 1072 1073 // CK19: [[SIZE18:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 240] 1074 // CK19: [[MTYPE18:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 35] 1075 1076 // CK19: [[MTYPE19:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 32] 1077 1078 // CK19: [[SIZE20:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 1079 // CK19: [[MTYPE20:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 33] 1080 1081 // CK19: [[MTYPE21:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 35] 1082 1083 // CK19: [[SIZE22:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 1084 // CK19: [[MTYPE22:@.+]] = private {{.*}}constant [2 x i32] [i32 288, i32 35] 1085 1086 // CK19: [[SIZE23:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 1087 // CK19: [[MTYPE23:@.+]] = private {{.*}}constant [1 x i32] [i32 39] 1088 1089 // CK19: [[SIZE24:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 480] 1090 // CK19: [[MTYPE24:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1091 1092 // CK19: [[SIZE25:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16] 1093 // CK19: [[MTYPE25:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1094 1095 // CK19: [[SIZE26:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 24] 1096 // CK19: [[MTYPE26:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1097 1098 // CK19: [[SIZE27:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 1099 // CK19: [[MTYPE27:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1100 1101 // CK19: [[SIZE28:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 16] 1102 // CK19: [[MTYPE28:@.+]] = private {{.*}}constant [3 x i32] [i32 35, i32 19, i32 19] 1103 1104 // CK19: [[SIZE29:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 4] 1105 // CK19: [[MTYPE29:@.+]] = private {{.*}}constant [3 x i32] [i32 35, i32 19, i32 19] 1106 1107 // CK19: [[MTYPE30:@.+]] = private {{.*}}constant [4 x i32] [i32 288, i32 288, i32 288, i32 35] 1108 1109 // CK19: [[SIZE31:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 40] 1110 // CK19: [[MTYPE31:@.+]] = private {{.*}}constant [4 x i32] [i32 288, i32 288, i32 288, i32 35] 1111 1112 // CK19: [[SIZE32:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 13728] 1113 // CK19: [[MTYPE32:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1114 1115 // CK19: [[SIZE33:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 13728] 1116 // CK19: [[MTYPE33:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1117 1118 // CK19: [[SIZE34:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 13728] 1119 // CK19: [[MTYPE34:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1120 1121 // CK19: [[MTYPE35:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1122 1123 // CK19: [[SIZE36:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 208] 1124 // CK19: [[MTYPE36:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1125 1126 // CK19: [[MTYPE37:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35] 1127 1128 // CK19: [[MTYPE38:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35] 1129 1130 // CK19: [[MTYPE39:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35] 1131 1132 // CK19: [[MTYPE40:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35] 1133 1134 // CK19: [[SIZE41:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 208] 1135 // CK19: [[MTYPE41:@.+]] = private {{.*}}constant [3 x i32] [i32 288, i32 288, i32 35] 1136 1137 // CK19: [[SIZE42:@.+]] = private {{.*}}constant [3 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 104] 1138 // CK19: [[MTYPE42:@.+]] = private {{.*}}constant [3 x i32] [i32 35, i32 19, i32 19] 1139 1140 // CK19: [[MTYPE43:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 1141 1142 // CK19-LABEL: explicit_maps_single 1143 void explicit_maps_single (int ii){ 1144 // Map of a scalar. 1145 int a = ii; 1146 1147 // Region 00 1148 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 1149 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1150 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1151 1152 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1153 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1154 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1155 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1156 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 1157 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8* 1158 1159 // CK19: call void [[CALL00:@.+]](i32* {{[^,]+}}) 1160 #pragma omp target map(alloc:a) 1161 { 1162 ++a; 1163 } 1164 1165 // Map of an array. 1166 int arra[100]; 1167 1168 // Region 01 1169 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 1170 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1171 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1172 1173 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1174 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1175 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1176 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1177 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1178 // CK19-DAG: [[CPVAL0]] = bitcast [100 x i32]* [[VAR0]] to i8* 1179 1180 // CK19: call void [[CALL01:@.+]]([100 x i32]* {{[^,]+}}) 1181 #pragma omp target map(to:arra) 1182 { 1183 arra[50]++; 1184 } 1185 1186 // Region 02 1187 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}}) 1188 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1189 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1190 1191 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1192 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1193 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1194 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1195 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1196 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1197 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 20 1198 1199 // CK19: call void [[CALL02:@.+]]([100 x i32]* {{[^,]+}}) 1200 #pragma omp target map(from:arra[20:60]) 1201 { 1202 arra[50]++; 1203 } 1204 1205 // Region 03 1206 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 1207 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1208 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1209 1210 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1211 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1212 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1213 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1214 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1215 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1216 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 0 1217 1218 // CK19: call void [[CALL03:@.+]]([100 x i32]* {{[^,]+}}) 1219 #pragma omp target map(tofrom:arra[:60]) 1220 { 1221 arra[50]++; 1222 } 1223 1224 // Region 04 1225 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}}) 1226 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1227 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1228 1229 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1230 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1231 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1232 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1233 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1234 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1235 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 0 1236 1237 // CK19: call void [[CALL04:@.+]]([100 x i32]* {{[^,]+}}) 1238 #pragma omp target map(alloc:arra[:]) 1239 { 1240 arra[50]++; 1241 } 1242 1243 // Region 05 1244 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}}) 1245 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1246 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1247 1248 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1249 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1250 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1251 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1252 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1253 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1254 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 15 1255 1256 // CK19: call void [[CALL05:@.+]]([100 x i32]* {{[^,]+}}) 1257 #pragma omp target map(to:arra[15]) 1258 { 1259 arra[15]++; 1260 } 1261 1262 // Region 06 1263 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE06]]{{.+}}) 1264 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1265 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1266 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1267 1268 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1269 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1270 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1271 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1272 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1273 // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]] 1274 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1275 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1276 // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4 1277 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} %{{.*}} 1278 1279 // CK19: call void [[CALL06:@.+]]([100 x i32]* {{[^,]+}}) 1280 #pragma omp target map(tofrom:arra[ii:ii+23]) 1281 { 1282 arra[50]++; 1283 } 1284 1285 // Region 07 1286 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE07]]{{.+}}) 1287 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1288 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1289 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1290 1291 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1292 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1293 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1294 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1295 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1296 // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]] 1297 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1298 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1299 // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4 1300 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} 0 1301 1302 // CK19: call void [[CALL07:@.+]]([100 x i32]* {{[^,]+}}) 1303 #pragma omp target map(alloc:arra[:ii]) 1304 { 1305 arra[50]++; 1306 } 1307 1308 // Region 08 1309 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE08]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE08]]{{.+}}) 1310 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1311 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1312 1313 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1314 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1315 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1316 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1317 // CK19-DAG: [[CBPVAL0]] = bitcast [100 x i32]* [[VAR0:%.+]] to i8* 1318 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1319 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[100 x i32]* [[VAR0]], i{{.+}} 0, i{{.+}} %{{.*}} 1320 1321 // CK19: call void [[CALL08:@.+]]([100 x i32]* {{[^,]+}}) 1322 #pragma omp target map(tofrom:arra[ii]) 1323 { 1324 arra[15]++; 1325 } 1326 1327 // Map of a pointer. 1328 int *pa; 1329 1330 // Region 09 1331 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE09]]{{.+}}) 1332 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1333 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1334 1335 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1336 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1337 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1338 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1339 // CK19-DAG: [[CBPVAL0]] = bitcast i32** [[VAR0:%.+]] to i8* 1340 // CK19-DAG: [[CPVAL0]] = bitcast i32** [[VAR0]] to i8* 1341 1342 // CK19: call void [[CALL09:@.+]](i32** {{[^,]+}}) 1343 #pragma omp target map(from:pa) 1344 { 1345 pa[50]++; 1346 } 1347 1348 // Region 10 1349 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE10]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE10]]{{.+}}) 1350 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1351 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1352 1353 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1354 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1355 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1356 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1357 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 1358 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1359 // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 1360 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 20 1361 // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 1362 1363 // CK19: call void [[CALL10:@.+]](i32* {{[^,]+}}) 1364 #pragma omp target map(tofrom:pa[20:60]) 1365 { 1366 pa[50]++; 1367 } 1368 1369 // Region 11 1370 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE11]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE11]]{{.+}}) 1371 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1372 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1373 1374 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1375 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1376 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1377 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1378 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 1379 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1380 // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 1381 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0 1382 // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 1383 1384 // CK19: call void [[CALL11:@.+]](i32* {{[^,]+}}) 1385 #pragma omp target map(alloc:pa[:60]) 1386 { 1387 pa[50]++; 1388 } 1389 1390 // Region 12 1391 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE12]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE12]]{{.+}}) 1392 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1393 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1394 1395 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1396 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1397 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1398 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1399 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 1400 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1401 // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 1402 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 15 1403 // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 1404 1405 // CK19: call void [[CALL12:@.+]](i32* {{[^,]+}}) 1406 #pragma omp target map(to:pa[15]) 1407 { 1408 pa[15]++; 1409 } 1410 1411 // Region 13 1412 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE13]]{{.+}}) 1413 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1414 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1415 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1416 1417 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1418 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1419 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1420 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1421 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1422 // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]] 1423 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 1424 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1425 // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4 1426 // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 1427 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} %{{.*}} 1428 // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 1429 1430 // CK19: call void [[CALL13:@.+]](i32* {{[^,]+}}) 1431 #pragma omp target map(alloc:pa[ii-23:ii]) 1432 { 1433 pa[50]++; 1434 } 1435 1436 // Region 14 1437 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE14]]{{.+}}) 1438 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1439 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1440 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1441 1442 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1443 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1444 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1445 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1446 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1447 // CK19-DAG: store i{{.+}} [[CSVAL0:%[^,]+]], i{{.+}}* [[S0]] 1448 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 1449 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1450 // CK19-DAG: [[CSVAL0]] = mul nuw i{{.+}} %{{.*}}, 4 1451 // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 1452 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0 1453 // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 1454 1455 // CK19: call void [[CALL14:@.+]](i32* {{[^,]+}}) 1456 #pragma omp target map(to:pa[:ii]) 1457 { 1458 pa[50]++; 1459 } 1460 1461 // Region 15 1462 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE15]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE15]]{{.+}}) 1463 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1464 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1465 1466 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1467 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1468 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1469 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1470 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 1471 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1472 // CK19-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 1473 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} %{{.*}} 1474 // CK19-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 1475 1476 // CK19: call void [[CALL15:@.+]](i32* {{[^,]+}}) 1477 #pragma omp target map(from:pa[ii+12]) 1478 { 1479 pa[15]++; 1480 } 1481 1482 // Map of a variable-size array. 1483 int va[ii]; 1484 1485 // Region 16 1486 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE16]]{{.+}}) 1487 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1488 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1489 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1490 1491 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1492 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1493 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1494 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1495 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1496 // CK19-DAG: store i{{.+}} {{8|4}}, i{{.+}}* [[S0]] 1497 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1498 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1499 1500 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1501 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1502 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 1503 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1504 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1505 // CK19-DAG: store i{{.+}} [[CSVAL1:%[^,]+]], i{{.+}}* [[S1]] 1506 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1507 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[VAR1]] to i8* 1508 // CK19-DAG: [[CSVAL1]] = mul nuw i{{.+}} %{{.*}}, 4 1509 1510 // CK19: call void [[CALL16:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1511 #pragma omp target map(to:va) 1512 { 1513 va[50]++; 1514 } 1515 1516 // Region 17 1517 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE17]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE17]]{{.+}}) 1518 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1519 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1520 1521 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1522 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1523 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1524 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1525 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1526 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1527 1528 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1529 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1530 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1531 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1532 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1533 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 1534 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 20 1535 1536 // CK19: call void [[CALL17:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1537 #pragma omp target map(from:va[20:60]) 1538 { 1539 va[50]++; 1540 } 1541 1542 // Region 18 1543 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE18]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE18]]{{.+}}) 1544 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1545 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1546 1547 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1548 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1549 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1550 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1551 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1552 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1553 1554 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1555 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1556 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1557 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1558 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1559 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 1560 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 0 1561 1562 // CK19: call void [[CALL18:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1563 #pragma omp target map(tofrom:va[:60]) 1564 { 1565 va[50]++; 1566 } 1567 1568 // Region 19 1569 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE19]]{{.+}}) 1570 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1571 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1572 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1573 1574 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1575 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1576 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1577 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1578 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1579 // CK19-DAG: store i{{.+}} {{8|4}}, i{{.+}}* [[S0]] 1580 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1581 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1582 1583 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1584 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1585 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 1586 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1587 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1588 // CK19-DAG: store i{{.+}} [[CSVAL1:%[^,]+]], i{{.+}}* [[S1]] 1589 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1590 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 1591 // CK19-DAG: [[CSVAL1]] = mul nuw i{{.+}} %{{.*}}, 4 1592 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 0 1593 1594 // CK19: call void [[CALL19:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1595 #pragma omp target map(alloc:va[:]) 1596 { 1597 va[50]++; 1598 } 1599 1600 // Region 20 1601 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE20]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE20]]{{.+}}) 1602 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1603 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1604 1605 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1606 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1607 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1608 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1609 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1610 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1611 1612 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1613 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1614 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1615 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1616 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1617 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 1618 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} 15 1619 1620 // CK19: call void [[CALL20:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1621 #pragma omp target map(to:va[15]) 1622 { 1623 va[15]++; 1624 } 1625 1626 // Region 21 1627 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE21]]{{.+}}) 1628 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1629 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1630 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1631 1632 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1633 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1634 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1635 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1636 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1637 // CK19-DAG: store i{{.+}} {{8|4}}, i{{.+}}* [[S0]] 1638 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1639 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1640 1641 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1642 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1643 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 1644 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1645 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1646 // CK19-DAG: store i{{.+}} [[CSVAL1:%[^,]+]], i{{.+}}* [[S1]] 1647 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1648 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 1649 // CK19-DAG: [[CSVAL1]] = mul nuw i{{.+}} %{{.*}}, 4 1650 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} %{{.+}} 1651 1652 // CK19: call void [[CALL21:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1653 #pragma omp target map(tofrom:va[ii:ii+23]) 1654 { 1655 va[50]++; 1656 } 1657 1658 // Region 22 1659 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE22]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE22]]{{.+}}) 1660 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1661 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1662 1663 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1664 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1665 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1666 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1667 // CK19-DAG: [[CBPVAL0]] = inttoptr i[[Z]] %{{.+}} to i8* 1668 // CK19-DAG: [[CPVAL0]] = inttoptr i[[Z]] %{{.+}}to i8* 1669 1670 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1671 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1672 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1673 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1674 // CK19-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 1675 // CK19-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 1676 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32* [[VAR1]], i{{.+}} %{{.+}} 1677 1678 // CK19: call void [[CALL22:@.+]](i{{.+}} {{[^,]+}}, i32* {{[^,]+}}) 1679 #pragma omp target map(tofrom:va[ii]) 1680 { 1681 va[15]++; 1682 } 1683 1684 // Always. 1685 // Region 23 1686 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE23]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE23]]{{.+}}) 1687 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1688 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1689 1690 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1691 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1692 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1693 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1694 // CK19-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 1695 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8* 1696 1697 // CK19: call void [[CALL23:@.+]](i32* {{[^,]+}}) 1698 #pragma omp target map(always, tofrom: a) 1699 { 1700 a++; 1701 } 1702 1703 // Multidimensional arrays. 1704 int marr[4][5][6]; 1705 int ***mptr; 1706 1707 // Region 24 1708 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE24]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE24]]{{.+}}) 1709 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1710 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1711 1712 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1713 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1714 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1715 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1716 // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8* 1717 // CK19-DAG: [[CPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0]] to i8* 1718 1719 // CK19: call void [[CALL24:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}}) 1720 #pragma omp target map(tofrom: marr) 1721 { 1722 marr[1][2][3]++; 1723 } 1724 1725 // Region 25 1726 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE25]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE25]]{{.+}}) 1727 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1728 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1729 1730 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1731 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1732 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1733 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1734 // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8* 1735 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1736 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[6 x i32]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 2 1737 // CK19-DAG: [[SEC00]] = getelementptr {{.*}}[5 x [6 x i32]]* [[SEC000:[^,]+]], i{{.+}} 0, i{{.+}} 2 1738 // CK19-DAG: [[SEC000]] = getelementptr {{.*}}[4 x [5 x [6 x i32]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 1739 1740 // CK19: call void [[CALL25:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}}) 1741 #pragma omp target map(tofrom: marr[1][2][2:4]) 1742 { 1743 marr[1][2][3]++; 1744 } 1745 1746 // Region 26 1747 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE26]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE26]]{{.+}}) 1748 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1749 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1750 1751 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1752 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1753 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1754 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1755 // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8* 1756 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1757 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[6 x i32]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 0 1758 // CK19-DAG: [[SEC00]] = getelementptr {{.*}}[5 x [6 x i32]]* [[SEC000:[^,]+]], i{{.+}} 0, i{{.+}} 2 1759 // CK19-DAG: [[SEC000]] = getelementptr {{.*}}[4 x [5 x [6 x i32]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 1760 1761 // CK19: call void [[CALL26:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}}) 1762 #pragma omp target map(tofrom: marr[1][2][:]) 1763 { 1764 marr[1][2][3]++; 1765 } 1766 1767 // Region 27 1768 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE27]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE27]]{{.+}}) 1769 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1770 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1771 1772 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1773 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1774 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1775 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1776 // CK19-DAG: [[CBPVAL0]] = bitcast [4 x [5 x [6 x i32]]]* [[VAR0:%.+]] to i8* 1777 // CK19-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 1778 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}[6 x i32]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 3 1779 // CK19-DAG: [[SEC00]] = getelementptr {{.*}}[5 x [6 x i32]]* [[SEC000:[^,]+]], i{{.+}} 0, i{{.+}} 2 1780 // CK19-DAG: [[SEC000]] = getelementptr {{.*}}[4 x [5 x [6 x i32]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 1781 1782 // CK19: call void [[CALL27:@.+]]([4 x [5 x [6 x i32]]]* {{[^,]+}}) 1783 #pragma omp target map(tofrom: marr[1][2][3]) 1784 { 1785 marr[1][2][3]++; 1786 } 1787 1788 // Region 28 1789 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE28]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE28]]{{.+}}) 1790 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1791 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1792 1793 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1794 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1795 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1796 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1797 // CK19-DAG: [[CBPVAL0]] = bitcast i32*** [[VAR0:%.+]] to i8* 1798 // CK19-DAG: [[CPVAL0]] = bitcast i32*** [[SEC0:%.+]] to i8* 1799 // CK19-DAG: [[VAR0]] = load i32***, i32**** [[PTR:%[^,]+]], 1800 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32*** [[SEC00:[^,]+]], i{{.+}} 1 1801 // CK19-DAG: [[SEC00]] = load i32***, i32**** [[PTR]], 1802 1803 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1804 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1805 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1806 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1807 // CK19-DAG: [[CBPVAL1]] = bitcast i32*** [[SEC0]] to i8* 1808 // CK19-DAG: [[CPVAL1]] = bitcast i32** [[SEC1:%.+]] to i8* 1809 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32** [[SEC11:[^,]+]], i{{.+}} 2 1810 // CK19-DAG: [[SEC11]] = load i32**, i32*** [[SEC111:%[^,]+]], 1811 // CK19-DAG: [[SEC111]] = getelementptr {{.*}}i32*** [[SEC1111:[^,]+]], i{{.+}} 1 1812 // CK19-DAG: [[SEC1111]] = load i32***, i32**** [[PTR]], 1813 1814 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 1815 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 1816 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 1817 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 1818 // CK19-DAG: [[CBPVAL2]] = bitcast i32** [[SEC1]] to i8* 1819 // CK19-DAG: [[CPVAL2]] = bitcast i32* [[SEC2:%.+]] to i8* 1820 // CK19-DAG: [[SEC2]] = getelementptr {{.*}}i32* [[SEC22:[^,]+]], i{{.+}} 2 1821 // CK19-DAG: [[SEC22]] = load i32*, i32** [[SEC222:%[^,]+]], 1822 // CK19-DAG: [[SEC222]] = getelementptr {{.*}}i32** [[SEC2222:[^,]+]], i{{.+}} 2 1823 // CK19-DAG: [[SEC2222]] = load i32**, i32*** [[SEC22222:%[^,]+]], 1824 // CK19-DAG: [[SEC22222]] = getelementptr {{.*}}i32*** [[SEC222222:[^,]+]], i{{.+}} 1 1825 // CK19-DAG: [[SEC222222]] = load i32***, i32**** [[PTR]], 1826 1827 // CK19: call void [[CALL28:@.+]](i32*** {{[^,]+}}) 1828 #pragma omp target map(tofrom: mptr[1][2][2:4]) 1829 { 1830 mptr[1][2][3]++; 1831 } 1832 1833 // Region 29 1834 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE29]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE29]]{{.+}}) 1835 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1836 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1837 1838 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1839 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1840 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1841 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1842 // CK19-DAG: [[CBPVAL0]] = bitcast i32*** [[VAR0:%.+]] to i8* 1843 // CK19-DAG: [[CPVAL0]] = bitcast i32*** [[SEC0:%.+]] to i8* 1844 // CK19-DAG: [[VAR0]] = load i32***, i32**** [[PTR:%[^,]+]], 1845 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}i32*** [[SEC00:[^,]+]], i{{.+}} 1 1846 // CK19-DAG: [[SEC00]] = load i32***, i32**** [[PTR]], 1847 1848 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1849 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1850 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1851 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1852 // CK19-DAG: [[CBPVAL1]] = bitcast i32*** [[SEC0]] to i8* 1853 // CK19-DAG: [[CPVAL1]] = bitcast i32** [[SEC1:%.+]] to i8* 1854 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}i32** [[SEC11:[^,]+]], i{{.+}} 2 1855 // CK19-DAG: [[SEC11]] = load i32**, i32*** [[SEC111:%[^,]+]], 1856 // CK19-DAG: [[SEC111]] = getelementptr {{.*}}i32*** [[SEC1111:[^,]+]], i{{.+}} 1 1857 // CK19-DAG: [[SEC1111]] = load i32***, i32**** [[PTR]], 1858 1859 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 1860 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 1861 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 1862 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 1863 // CK19-DAG: [[CBPVAL2]] = bitcast i32** [[SEC1]] to i8* 1864 // CK19-DAG: [[CPVAL2]] = bitcast i32* [[SEC2:%.+]] to i8* 1865 // CK19-DAG: [[SEC2]] = getelementptr {{.*}}i32* [[SEC22:[^,]+]], i{{.+}} 3 1866 // CK19-DAG: [[SEC22]] = load i32*, i32** [[SEC222:%[^,]+]], 1867 // CK19-DAG: [[SEC222]] = getelementptr {{.*}}i32** [[SEC2222:[^,]+]], i{{.+}} 2 1868 // CK19-DAG: [[SEC2222]] = load i32**, i32*** [[SEC22222:%[^,]+]], 1869 // CK19-DAG: [[SEC22222]] = getelementptr {{.*}}i32*** [[SEC222222:[^,]+]], i{{.+}} 1 1870 // CK19-DAG: [[SEC222222]] = load i32***, i32**** [[PTR]], 1871 1872 // CK19: call void [[CALL29:@.+]](i32*** {{[^,]+}}) 1873 #pragma omp target map(tofrom: mptr[1][2][3]) 1874 { 1875 mptr[1][2][3]++; 1876 } 1877 1878 // Multidimensional VLA. 1879 double mva[23][ii][ii+5]; 1880 1881 // Region 30 1882 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE30]]{{.+}}) 1883 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1884 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1885 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 1886 // 1887 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1888 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1889 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 1890 // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[BP0]] 1891 // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[P0]] 1892 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]] 1893 // 1894 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1895 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1896 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 1897 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1898 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1899 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]] 1900 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 1901 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 1902 // CK19-64-DAG: [[VAR1]] = zext i32 %{{[^,]+}} to i64 1903 // CK19-64-DAG: [[VAR11]] = zext i32 %{{[^,]+}} to i64 1904 // 1905 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 1906 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 1907 // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2 1908 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 1909 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 1910 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S2]] 1911 // CK19-DAG: [[CBPVAL2]] = inttoptr i[[Z]] [[VAR2:%.+]] to i8* 1912 // CK19-DAG: [[CPVAL2]] = inttoptr i[[Z]] [[VAR22:%.+]] to i8* 1913 // CK19-64-DAG: [[VAR2]] = zext i32 %{{[^,]+}} to i64 1914 // CK19-64-DAG: [[VAR22]] = zext i32 %{{[^,]+}} to i64 1915 // 1916 // CK19-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3 1917 // CK19-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3 1918 // CK19-DAG: [[S3:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 3 1919 // CK19-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]] 1920 // CK19-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]] 1921 // CK19-DAG: store i[[Z]] [[CSVAL3:%[^,]+]], i[[Z]]* [[S3]] 1922 // CK19-DAG: [[CBPVAL3]] = bitcast double* [[VAR3:%.+]] to i8* 1923 // CK19-DAG: [[CPVAL3]] = bitcast double* [[VAR3]] to i8* 1924 // CK19-DAG: [[CSVAL3]] = mul nuw i[[Z]] %{{[^,]+}}, {{8|4}} 1925 1926 // CK19: call void [[CALL30:@.+]](i[[Z]] 23, i[[Z]] %{{[^,]+}}, i[[Z]] %{{[^,]+}}, double* %{{[^,]+}}) 1927 #pragma omp target map(tofrom: mva) 1928 { 1929 mva[1][2][3]++; 1930 } 1931 1932 // Region 31 1933 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE31]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE31]]{{.+}}) 1934 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1935 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1936 // 1937 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1938 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1939 // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[BP0]] 1940 // CK19-DAG: store i8* inttoptr (i[[Z]] 23 to i8*), i8** [[P0]] 1941 // 1942 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 1943 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 1944 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 1945 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 1946 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 1947 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 1948 // 1949 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 1950 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 1951 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 1952 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 1953 // CK19-DAG: [[CBPVAL2]] = inttoptr i[[Z]] [[VAR2:%.+]] to i8* 1954 // CK19-DAG: [[CPVAL2]] = inttoptr i[[Z]] [[VAR22:%.+]] to i8* 1955 // 1956 // CK19-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3 1957 // CK19-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3 1958 // CK19-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]] 1959 // CK19-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]] 1960 // CK19-DAG: [[CBPVAL3]] = bitcast double* [[VAR3:%.+]] to i8* 1961 // CK19-DAG: [[CPVAL3]] = bitcast double* [[SEC3:%.+]] to i8* 1962 // CK19-DAG: [[SEC3]] = getelementptr {{.*}}double* [[SEC33:%.+]], i[[Z]] 0 1963 // CK19-DAG: [[SEC33]] = getelementptr {{.*}}double* [[SEC333:%.+]], i[[Z]] [[IDX3:%.+]] 1964 // CK19-DAG: [[IDX3]] = mul nsw i[[Z]] %{{[^,]+}}, %{{[^,]+}} 1965 // CK19-DAG: [[SEC333]] = getelementptr {{.*}}double* [[VAR3]], i[[Z]] [[IDX33:%.+]] 1966 // CK19-DAG: [[IDX33]] = mul nsw i[[Z]] 1, %{{[^,]+}} 1967 1968 // CK19: call void [[CALL31:@.+]](i[[Z]] 23, i[[Z]] %{{[^,]+}}, i[[Z]] %{{[^,]+}}, double* %{{[^,]+}}) 1969 #pragma omp target map(tofrom: mva[1][ii-2][:5]) 1970 { 1971 mva[1][2][3]++; 1972 } 1973 1974 // Multidimensional array sections. 1975 double marras[11][12][13]; 1976 double mvlaas[11][ii][13]; 1977 double ***mptras; 1978 1979 // Region 32 1980 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE32]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE32]]{{.+}}) 1981 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 1982 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 1983 1984 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 1985 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 1986 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 1987 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 1988 // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8* 1989 // CK19-DAG: [[CPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0]] to i8* 1990 1991 // CK19: call void [[CALL32:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}}) 1992 #pragma omp target map(marras) 1993 { 1994 marras[1][2][3]++; 1995 } 1996 1997 // Region 33 1998 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE33]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE33]]{{.+}}) 1999 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2000 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2001 2002 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2003 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2004 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2005 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2006 // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8* 2007 // CK19-DAG: [[CPVAL0]] = bitcast [12 x [13 x double]]* [[SEC0:%.+]] to i8* 2008 // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 0 2009 2010 // CK19: call void [[CALL33:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}}) 2011 #pragma omp target map(marras[:]) 2012 { 2013 marras[1][2][3]++; 2014 } 2015 2016 // Region 34 2017 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE34]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE34]]{{.+}}) 2018 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2019 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2020 2021 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2022 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2023 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2024 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2025 // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8* 2026 // CK19-DAG: [[CPVAL0]] = bitcast [12 x [13 x double]]* [[SEC0:%.+]] to i8* 2027 // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 0 2028 2029 // CK19: call void [[CALL34:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}}) 2030 #pragma omp target map(marras[:][:][:]) 2031 { 2032 marras[1][2][3]++; 2033 } 2034 2035 // Region 35 2036 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE35]]{{.+}}) 2037 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2038 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2039 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 2040 // 2041 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2042 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2043 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 2044 2045 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2046 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2047 // CK19-DAG: store i[[Z]] [[CSVAL0:%[^,]+]], i[[Z]]* [[S0]] 2048 // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8* 2049 // CK19-DAG: [[CPVAL0]] = bitcast [13 x double]* [[SEC0:%.+]] to i8* 2050 // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[12 x [13 x double]]* [[SEC00:%[^,]+]], i[[Z]] 0, i[[Z]] 0 2051 // CK19-DAG: [[SEC00]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 1 2052 // CK19-DAG: [[CSVAL0]] = mul nuw i[[Z]] %{{[^,]+}}, 104 2053 2054 // CK19: call void [[CALL35:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}}) 2055 #pragma omp target map(marras[1][:ii][:]) 2056 { 2057 marras[1][2][3]++; 2058 } 2059 2060 // Region 36 2061 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE36]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE36]]{{.+}}) 2062 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2063 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2064 2065 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2066 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2067 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2068 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2069 // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8* 2070 // CK19-DAG: [[CPVAL0]] = bitcast [13 x double]* [[SEC0:%.+]] to i8* 2071 // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[13 x double]* [[SEC00:%[^,]+]], i{{.+}} 0 2072 // CK19-DAG: [[SEC00]] = getelementptr {{.+}}[12 x [13 x double]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 0 2073 // CK19-DAG: [[SEC000]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i{{.+}} 0, i{{.+}} 0 2074 2075 // CK19: call void [[CALL36:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}}) 2076 #pragma omp target map(marras[:1][:2][:13]) 2077 { 2078 marras[1][2][3]++; 2079 } 2080 2081 // Region 37 2082 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE37]]{{.+}}) 2083 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2084 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2085 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 2086 // 2087 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2088 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2089 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 2090 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]] 2091 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]] 2092 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]] 2093 // 2094 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2095 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2096 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 2097 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2098 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2099 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]] 2100 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 2101 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 2102 // 2103 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 2104 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 2105 // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2 2106 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 2107 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 2108 // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]] 2109 // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8* 2110 // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[VAR2]] to i8* 2111 // CK19-DAG: [[CSVAL2]] = mul nuw i[[Z]] %{{[^,]+}}, 104 2112 2113 // CK19: call void [[CALL37:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}}) 2114 #pragma omp target map(mvlaas) 2115 { 2116 mvlaas[1][2][3]++; 2117 } 2118 2119 // Region 38 2120 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE38]]{{.+}}) 2121 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2122 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2123 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 2124 // 2125 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2126 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2127 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 2128 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]] 2129 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]] 2130 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]] 2131 // 2132 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2133 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2134 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 2135 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2136 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2137 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]] 2138 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 2139 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 2140 // 2141 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 2142 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 2143 // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2 2144 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 2145 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 2146 // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]] 2147 // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8* 2148 // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8* 2149 // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC22:%[^,]+]] 2150 // CK19-DAG: [[SEC22]] = mul nsw i[[Z]] 0, %{{[^,]+}} 2151 // CK19-DAG: [[CSVAL2]] = mul nuw i[[Z]] %{{[^,]+}}, 104 2152 2153 // CK19: call void [[CALL38:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}}) 2154 #pragma omp target map(mvlaas[:]) 2155 { 2156 mvlaas[1][2][3]++; 2157 } 2158 2159 // Region 39 2160 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE39]]{{.+}}) 2161 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2162 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2163 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 2164 // 2165 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2166 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2167 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 2168 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]] 2169 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]] 2170 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]] 2171 // 2172 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2173 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2174 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 2175 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2176 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2177 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]] 2178 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 2179 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 2180 // 2181 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 2182 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 2183 // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2 2184 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 2185 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 2186 // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]] 2187 // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8* 2188 // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8* 2189 // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC22:%[^,]+]] 2190 // CK19-DAG: [[SEC22]] = mul nsw i[[Z]] 0, %{{[^,]+}} 2191 // CK19-DAG: [[CSVAL2]] = mul nuw i[[Z]] %{{[^,]+}}, 104 2192 2193 // CK19: call void [[CALL39:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}}) 2194 #pragma omp target map(mvlaas[:][:][:]) 2195 { 2196 mvlaas[1][2][3]++; 2197 } 2198 2199 // Region 40 2200 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE40]]{{.+}}) 2201 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2202 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2203 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 2204 // 2205 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2206 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2207 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 2208 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]] 2209 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]] 2210 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S0]] 2211 // 2212 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2213 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2214 // CK19-DAG: [[S1:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 1 2215 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2216 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2217 // CK19-DAG: store i[[Z]] {{8|4}}, i[[Z]]* [[S1]] 2218 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 2219 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 2220 // 2221 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 2222 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 2223 // CK19-DAG: [[S2:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 2 2224 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 2225 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 2226 // CK19-DAG: store i[[Z]] [[CSVAL2:%[^,]+]], i[[Z]]* [[S2]] 2227 // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8* 2228 // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8* 2229 // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[SEC22:%[^,]+]], i[[Z]] 0 2230 // CK19-DAG: [[SEC22]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC222:%[^,]+]] 2231 // CK19-DAG: [[SEC222]] = mul nsw i[[Z]] 1, %{{[^,]+}} 2232 2233 // CK19: call void [[CALL40:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}}) 2234 #pragma omp target map(mvlaas[1][:ii][:]) 2235 { 2236 mvlaas[1][2][3]++; 2237 } 2238 2239 // Region 41 2240 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE41]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE41]]{{.+}}) 2241 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2242 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2243 // 2244 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2245 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2246 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[BP0]] 2247 // CK19-DAG: store i8* inttoptr (i[[Z]] 11 to i8*), i8** [[P0]] 2248 // 2249 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2250 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2251 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2252 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2253 // CK19-DAG: [[CBPVAL1]] = inttoptr i[[Z]] [[VAR1:%.+]] to i8* 2254 // CK19-DAG: [[CPVAL1]] = inttoptr i[[Z]] [[VAR11:%.+]] to i8* 2255 // 2256 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 2257 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 2258 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 2259 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 2260 // CK19-DAG: [[CBPVAL2]] = bitcast [13 x double]* [[VAR2:%.+]] to i8* 2261 // CK19-DAG: [[CPVAL2]] = bitcast [13 x double]* [[SEC2:%.+]] to i8* 2262 // CK19-DAG: [[SEC2]] = getelementptr {{.+}}[13 x double]* [[SEC22:%[^,]+]], i[[Z]] 0 2263 // CK19-DAG: [[SEC22]] = getelementptr {{.+}}[13 x double]* [[VAR2]], i[[Z]] [[SEC222:%[^,]+]] 2264 // CK19-DAG: [[SEC222]] = mul nsw i[[Z]] 0, %{{[^,]+}} 2265 2266 // CK19: call void [[CALL41:@.+]](i[[Z]] 11, i[[Z]] %{{[^,]+}}, [13 x double]* %{{[^,]+}}) 2267 #pragma omp target map(mvlaas[:1][:2][:13]) 2268 { 2269 mvlaas[1][2][3]++; 2270 } 2271 2272 // Region 42 2273 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 3, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[SIZE42]], {{.+}}getelementptr {{.+}}[3 x i{{.+}}]* [[MTYPE42]]{{.+}}) 2274 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2275 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2276 2277 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2278 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2279 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2280 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2281 // CK19-DAG: [[CBPVAL0]] = bitcast double*** [[VAR0:%.+]] to i8* 2282 // CK19-DAG: [[CPVAL0]] = bitcast double*** [[SEC0:%.+]] to i8* 2283 // CK19-DAG: [[VAR0]] = load double***, double**** [[PTR:%[^,]+]], 2284 // CK19-DAG: [[SEC0]] = getelementptr {{.*}}double*** [[SEC00:[^,]+]], i{{.+}} 0 2285 // CK19-DAG: [[SEC00]] = load double***, double**** [[PTR]], 2286 2287 // CK19-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2288 // CK19-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2289 // CK19-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2290 // CK19-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2291 // CK19-DAG: [[CBPVAL1]] = bitcast double*** [[SEC0]] to i8* 2292 // CK19-DAG: [[CPVAL1]] = bitcast double** [[SEC1:%.+]] to i8* 2293 // CK19-DAG: [[SEC1]] = getelementptr {{.*}}double** [[SEC11:[^,]+]], i{{.+}} 2 2294 // CK19-DAG: [[SEC11]] = load double**, double*** [[SEC111:%[^,]+]], 2295 // CK19-DAG: [[SEC111]] = getelementptr {{.*}}double*** [[SEC1111:[^,]+]], i{{.+}} 0 2296 // CK19-DAG: [[SEC1111]] = load double***, double**** [[PTR]], 2297 2298 // CK19-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 2299 // CK19-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 2300 // CK19-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 2301 // CK19-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 2302 // CK19-DAG: [[CBPVAL2]] = bitcast double** [[SEC1]] to i8* 2303 // CK19-DAG: [[CPVAL2]] = bitcast double* [[SEC2:%.+]] to i8* 2304 // CK19-DAG: [[SEC2]] = getelementptr {{.*}}double* [[SEC22:[^,]+]], i{{.+}} 0 2305 // CK19-DAG: [[SEC22]] = load double*, double** [[SEC222:%[^,]+]], 2306 // CK19-DAG: [[SEC222]] = getelementptr {{.*}}double** [[SEC2222:[^,]+]], i{{.+}} 2 2307 // CK19-DAG: [[SEC2222]] = load double**, double*** [[SEC22222:%[^,]+]], 2308 // CK19-DAG: [[SEC22222]] = getelementptr {{.*}}double*** [[SEC222222:[^,]+]], i{{.+}} 0 2309 // CK19-DAG: [[SEC222222]] = load double***, double**** [[PTR]], 2310 2311 // CK19: call void [[CALL42:@.+]](double*** {{[^,]+}}) 2312 #pragma omp target map(mptras[:1][2][:13]) 2313 { 2314 mptras[1][2][3]++; 2315 } 2316 2317 // Region 43 - the memory is not contiguous for this map - will map the whole last dimension. 2318 // CK19-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[Z]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE43]]{{.+}}) 2319 // CK19-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2320 // CK19-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2321 // CK19-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]] 2322 // 2323 // CK19-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2324 // CK19-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2325 // CK19-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0 2326 2327 // CK19-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2328 // CK19-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2329 // CK19-DAG: store i[[Z]] [[CSVAL0:%[^,]+]], i[[Z]]* [[S0]] 2330 // CK19-DAG: [[CBPVAL0]] = bitcast [11 x [12 x [13 x double]]]* [[VAR0:%.+]] to i8* 2331 // CK19-DAG: [[CPVAL0]] = bitcast [13 x double]* [[SEC0:%.+]] to i8* 2332 // CK19-DAG: [[SEC0]] = getelementptr {{.+}}[12 x [13 x double]]* [[SEC00:%[^,]+]], i[[Z]] 0, i[[Z]] 0 2333 // CK19-DAG: [[SEC00]] = getelementptr {{.+}}[11 x [12 x [13 x double]]]* [[VAR0]], i[[Z]] 0, i[[Z]] 1 2334 // CK19-DAG: [[CSVAL0]] = mul nuw i[[Z]] %{{[^,]+}}, 104 2335 2336 // CK19: call void [[CALL43:@.+]]([11 x [12 x [13 x double]]]* {{[^,]+}}) 2337 #pragma omp target map(marras[1][:ii][1:]) 2338 { 2339 marras[1][2][3]++; 2340 } 2341 2342 } 2343 2344 // CK19: define {{.+}}[[CALL00]] 2345 // CK19: define {{.+}}[[CALL01]] 2346 // CK19: define {{.+}}[[CALL02]] 2347 // CK19: define {{.+}}[[CALL03]] 2348 // CK19: define {{.+}}[[CALL04]] 2349 // CK19: define {{.+}}[[CALL05]] 2350 // CK19: define {{.+}}[[CALL06]] 2351 // CK19: define {{.+}}[[CALL07]] 2352 // CK19: define {{.+}}[[CALL08]] 2353 // CK19: define {{.+}}[[CALL09]] 2354 // CK19: define {{.+}}[[CALL10]] 2355 // CK19: define {{.+}}[[CALL11]] 2356 // CK19: define {{.+}}[[CALL12]] 2357 // CK19: define {{.+}}[[CALL13]] 2358 // CK19: define {{.+}}[[CALL14]] 2359 // CK19: define {{.+}}[[CALL15]] 2360 // CK19: define {{.+}}[[CALL16]] 2361 // CK19: define {{.+}}[[CALL17]] 2362 // CK19: define {{.+}}[[CALL18]] 2363 // CK19: define {{.+}}[[CALL19]] 2364 // CK19: define {{.+}}[[CALL20]] 2365 // CK19: define {{.+}}[[CALL21]] 2366 // CK19: define {{.+}}[[CALL22]] 2367 // CK19: define {{.+}}[[CALL23]] 2368 // CK19: define {{.+}}[[CALL24]] 2369 // CK19: define {{.+}}[[CALL25]] 2370 // CK19: define {{.+}}[[CALL26]] 2371 // CK19: define {{.+}}[[CALL27]] 2372 // CK19: define {{.+}}[[CALL28]] 2373 // CK19: define {{.+}}[[CALL29]] 2374 // CK19: define {{.+}}[[CALL30]] 2375 // CK19: define {{.+}}[[CALL31]] 2376 // CK19: define {{.+}}[[CALL32]] 2377 // CK19: define {{.+}}[[CALL33]] 2378 // CK19: define {{.+}}[[CALL34]] 2379 // CK19: define {{.+}}[[CALL35]] 2380 // CK19: define {{.+}}[[CALL36]] 2381 // CK19: define {{.+}}[[CALL37]] 2382 // CK19: define {{.+}}[[CALL38]] 2383 // CK19: define {{.+}}[[CALL39]] 2384 // CK19: define {{.+}}[[CALL40]] 2385 // CK19: define {{.+}}[[CALL41]] 2386 // CK19: define {{.+}}[[CALL42]] 2387 // CK19: define {{.+}}[[CALL43]] 2388 2389 #endif 2390 ///==========================================================================/// 2391 // RUN: %clang_cc1 -DCK20 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK20 --check-prefix CK20-64 2392 // RUN: %clang_cc1 -DCK20 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 2393 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK20 --check-prefix CK20-64 2394 // RUN: %clang_cc1 -DCK20 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK20 --check-prefix CK20-32 2395 // RUN: %clang_cc1 -DCK20 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 2396 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK20 --check-prefix CK20-32 2397 #ifdef CK20 2398 2399 // CK20: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 2400 // CK20: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 2401 2402 // CK20: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20] 2403 // CK20: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 2404 2405 // CK20: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 2406 // CK20: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 2407 2408 // CK20: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 12] 2409 // CK20: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 2410 2411 // CK20-LABEL: explicit_maps_references_and_function_args 2412 void explicit_maps_references_and_function_args (int a, float b, int (&c)[10], float *d){ 2413 2414 int &aa = a; 2415 float &bb = b; 2416 int (&cc)[10] = c; 2417 float *&dd = d; 2418 2419 // Region 00 2420 // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 2421 // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2422 // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2423 2424 // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2425 // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2426 // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2427 // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2428 // CK20-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 2429 // CK20-DAG: [[CPVAL0]] = bitcast i32* [[RVAR00:%.+]] to i8* 2430 // CK20-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 2431 // CK20-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 2432 2433 // CK20: call void [[CALL00:@.+]](i32* {{[^,]+}}) 2434 #pragma omp target map(to:aa) 2435 { 2436 aa += 1; 2437 } 2438 2439 // Region 01 2440 // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 2441 // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2442 // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2443 2444 // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2445 // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2446 // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2447 // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2448 // CK20-DAG: [[CBPVAL0]] = bitcast [10 x i32]* [[RVAR0:%.+]] to i8* 2449 // CK20-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 2450 // CK20-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[RVAR00:%.+]], i{{.+}} 0, i{{.+}} 0 2451 // CK20-DAG: [[RVAR0]] = load [10 x i32]*, [10 x i32]** [[VAR0:%[^,]+]] 2452 // CK20-DAG: [[RVAR00]] = load [10 x i32]*, [10 x i32]** [[VAR0]] 2453 2454 // CK20: call void [[CALL01:@.+]]([10 x i32]* {{[^,]+}}) 2455 #pragma omp target map(to:cc[:5]) 2456 { 2457 cc[3] += 1; 2458 } 2459 2460 // Region 02 2461 // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}}) 2462 // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2463 // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2464 2465 // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2466 // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2467 // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2468 // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2469 // CK20-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8* 2470 // CK20-DAG: [[CPVAL0]] = bitcast float* [[VAR0]] to i8* 2471 2472 // CK20: call void [[CALL02:@.+]](float* {{[^,]+}}) 2473 #pragma omp target map(from:b) 2474 { 2475 b += 1.0f; 2476 } 2477 2478 // Region 03 2479 // CK20-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 2480 // CK20-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2481 // CK20-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2482 2483 // CK20-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2484 // CK20-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2485 // CK20-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2486 // CK20-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2487 // CK20-DAG: [[CBPVAL0]] = bitcast float* [[RVAR0:%.+]] to i8* 2488 // CK20-DAG: [[CPVAL0]] = bitcast float* [[SEC0:%.+]] to i8* 2489 // CK20-DAG: [[RVAR0]] = load float*, float** [[VAR0:%[^,]+]] 2490 // CK20-DAG: [[SEC0]] = getelementptr {{.*}}float* [[RVAR00:%.+]], i{{.+}} 2 2491 // CK20-DAG: [[RVAR00]] = load float*, float** [[VAR0]] 2492 2493 // CK20: call void [[CALL03:@.+]](float* {{[^,]+}}) 2494 #pragma omp target map(from:d[2:3]) 2495 { 2496 d[2] += 1.0f; 2497 } 2498 } 2499 2500 // CK20: define {{.+}}[[CALL00]] 2501 // CK20: define {{.+}}[[CALL01]] 2502 // CK20: define {{.+}}[[CALL02]] 2503 // CK20: define {{.+}}[[CALL03]] 2504 2505 #endif 2506 ///==========================================================================/// 2507 // RUN: %clang_cc1 -DCK21 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK21 --check-prefix CK21-64 2508 // RUN: %clang_cc1 -DCK21 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 2509 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK21 --check-prefix CK21-64 2510 // RUN: %clang_cc1 -DCK21 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK21 --check-prefix CK21-32 2511 // RUN: %clang_cc1 -DCK21 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 2512 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK21 --check-prefix CK21-32 2513 #ifdef CK21 2514 // CK21: [[ST:%.+]] = type { i32, i32, float* } 2515 2516 // CK21: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 2517 // CK21: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2518 2519 // CK21: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 492] 2520 // CK21: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2521 2522 // CK21: [[SIZE02:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 500] 2523 // CK21: [[MTYPE02:@.+]] = private {{.*}}constant [2 x i32] [i32 34, i32 18] 2524 2525 // CK21: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 492] 2526 // CK21: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 2527 2528 // CK21: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 2529 // CK21: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 34] 2530 2531 // CK21: [[SIZE05:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] 4, i[[Z]] 4] 2532 // CK21: [[MTYPE05:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 3] 2533 2534 // CK21-LABEL: explicit_maps_template_args_and_members 2535 2536 template <int X, typename T> 2537 struct CC { 2538 T A; 2539 int A2; 2540 float *B; 2541 2542 int foo(T arg) { 2543 float la[X]; 2544 T *lb; 2545 2546 // Region 00 2547 // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 2548 // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2549 // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2550 2551 // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2552 // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2553 // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2554 // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2555 // CK21-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 2556 // CK21-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 2557 // CK21-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0:%.+]], i{{.+}} 0, i{{.+}} 0 2558 2559 // CK21: call void [[CALL00:@.+]]([[ST]]* {{[^,]+}}) 2560 #pragma omp target map(A) 2561 { 2562 A += 1; 2563 } 2564 2565 // Region 01 2566 // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 2567 // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2568 // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2569 2570 // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2571 // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2572 // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2573 // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2574 // CK21-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 2575 // CK21-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 2576 // CK21-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 2577 // CK21-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0 2578 // CK21-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 2579 2580 // CK21: call void [[CALL01:@.+]](i32* {{[^,]+}}) 2581 #pragma omp target map(lb[:X]) 2582 { 2583 lb[4] += 1; 2584 } 2585 2586 // Region 02 2587 // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE02]]{{.+}}) 2588 // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2589 // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2590 2591 // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2592 // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2593 // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2594 // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2595 // CK21-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 2596 // CK21-DAG: [[CPVAL0]] = bitcast float** [[SEC0:%.+]] to i8* 2597 // CK21-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 2598 2599 // CK21-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2600 // CK21-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2601 // CK21-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2602 // CK21-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2603 // CK21-DAG: [[CBPVAL1]] = bitcast float** [[SEC0]] to i8* 2604 // CK21-DAG: [[CPVAL1]] = bitcast float* [[SEC1:%.+]] to i8* 2605 // CK21-DAG: [[SEC1]] = getelementptr {{.*}}float* [[RVAR1:%[^,]+]], i{{.+}} 123 2606 // CK21-DAG: [[RVAR1]] = load float*, float** [[SEC1_:%[^,]+]] 2607 // CK21-DAG: [[SEC1_]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 2608 2609 // CK21: call void [[CALL02:@.+]]([[ST]]* {{[^,]+}}) 2610 #pragma omp target map(from:B[X:X+2]) 2611 { 2612 B[2] += 1.0f; 2613 } 2614 2615 // Region 03 2616 // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 2617 // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2618 // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2619 2620 // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2621 // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2622 // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2623 // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2624 // CK21-DAG: [[CBPVAL0]] = bitcast [123 x float]* [[VAR0:%.+]] to i8* 2625 // CK21-DAG: [[CPVAL0]] = bitcast [123 x float]* [[VAR0]] to i8* 2626 2627 // CK21: call void [[CALL03:@.+]]([123 x float]* {{[^,]+}}) 2628 #pragma omp target map(from:la) 2629 { 2630 la[3] += 1.0f; 2631 } 2632 2633 // Region 04 2634 // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}}) 2635 // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2636 // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2637 2638 // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2639 // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2640 // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2641 // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2642 // CK21-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 2643 // CK21-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8* 2644 2645 // CK21: call void [[CALL04:@.+]](i32* {{[^,]+}}) 2646 #pragma omp target map(from:arg) 2647 { 2648 arg +=1; 2649 } 2650 2651 // Make sure the extra flag is passed to the second map. 2652 // Region 05 2653 // CK21-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE05]]{{.+}}) 2654 // CK21-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2655 // CK21-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2656 2657 // CK21-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2658 // CK21-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2659 // CK21-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2660 // CK21-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2661 // CK21-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 2662 // CK21-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 2663 // CK21-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 0 2664 2665 // CK21-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 2666 // CK21-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 2667 // CK21-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 2668 // CK21-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 2669 // CK21-DAG: [[CBPVAL1]] = bitcast [[ST]]* [[VAR1:%.+]] to i8* 2670 // CK21-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 2671 // CK21-DAG: [[SEC1]] = getelementptr {{.*}}[[ST]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 2672 2673 // CK21: call void [[CALL05:@.+]]([[ST]]* {{[^,]+}}) 2674 #pragma omp target map(A, A2) 2675 { 2676 A += 1; 2677 A2 += 1; 2678 } 2679 return A; 2680 } 2681 }; 2682 2683 int explicit_maps_template_args_and_members(int a){ 2684 CC<123,int> c; 2685 return c.foo(a); 2686 } 2687 2688 // CK21: define {{.+}}[[CALL00]] 2689 // CK21: define {{.+}}[[CALL01]] 2690 // CK21: define {{.+}}[[CALL02]] 2691 // CK21: define {{.+}}[[CALL03]] 2692 // CK21: define {{.+}}[[CALL04]] 2693 // CK21: define {{.+}}[[CALL05]] 2694 #endif 2695 ///==========================================================================/// 2696 // RUN: %clang_cc1 -DCK22 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK22 --check-prefix CK22-64 2697 // RUN: %clang_cc1 -DCK22 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 2698 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK22 --check-prefix CK22-64 2699 // RUN: %clang_cc1 -DCK22 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK22 --check-prefix CK22-32 2700 // RUN: %clang_cc1 -DCK22 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 2701 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK22 --check-prefix CK22-32 2702 #ifdef CK22 2703 2704 // CK22-DAG: [[ST:%.+]] = type { float } 2705 // CK22-DAG: [[STT:%.+]] = type { i32 } 2706 2707 // CK22: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 2708 // CK22: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2709 2710 // CK22: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400] 2711 // CK22: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2712 2713 // CK22: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}] 2714 // CK22: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2715 2716 // CK22: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16] 2717 // CK22: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2718 2719 // CK22: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20] 2720 // CK22: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2721 2722 // CK22: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 2723 // CK22: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2724 2725 // CK22: [[SIZE06:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400] 2726 // CK22: [[MTYPE06:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2727 2728 // CK22: [[SIZE07:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}] 2729 // CK22: [[MTYPE07:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2730 2731 // CK22: [[SIZE08:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16] 2732 // CK22: [[MTYPE08:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2733 2734 // CK22: [[SIZE09:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20] 2735 // CK22: [[MTYPE09:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2736 2737 // CK22: [[SIZE10:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 2738 // CK22: [[MTYPE10:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2739 2740 // CK22: [[SIZE11:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400] 2741 // CK22: [[MTYPE11:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2742 2743 // CK22: [[SIZE12:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}] 2744 // CK22: [[MTYPE12:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2745 2746 // CK22: [[SIZE13:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16] 2747 // CK22: [[MTYPE13:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2748 2749 // CK22: [[SIZE14:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20] 2750 // CK22: [[MTYPE14:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 2751 2752 int a; 2753 int c[100]; 2754 int *d; 2755 2756 struct ST { 2757 float fa; 2758 }; 2759 2760 ST sa ; 2761 ST sc[100]; 2762 ST *sd; 2763 2764 template<typename T> 2765 struct STT { 2766 T fa; 2767 }; 2768 2769 STT<int> sta ; 2770 STT<int> stc[100]; 2771 STT<int> *std; 2772 2773 // CK22-LABEL: explicit_maps_globals 2774 int explicit_maps_globals(void){ 2775 // Region 00 2776 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 2777 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2778 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2779 2780 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2781 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2782 // CK22-DAG: store i8* bitcast (i32* @a to i8*), i8** [[BP0]] 2783 // CK22-DAG: store i8* bitcast (i32* @a to i8*), i8** [[P0]] 2784 2785 // CK22: call void [[CALL00:@.+]](i32* {{[^,]+}}) 2786 #pragma omp target map(a) 2787 { a+=1; } 2788 2789 // Region 01 2790 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 2791 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2792 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2793 2794 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2795 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2796 // CK22-DAG: store i8* bitcast ([100 x i32]* @c to i8*), i8** [[BP0]] 2797 // CK22-DAG: store i8* bitcast ([100 x i32]* @c to i8*), i8** [[P0]] 2798 2799 // CK22: call void [[CALL01:@.+]]([100 x i32]* {{[^,]+}}) 2800 #pragma omp target map(c) 2801 { c[3]+=1; } 2802 2803 // Region 02 2804 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}}) 2805 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2806 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2807 2808 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2809 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2810 // CK22-DAG: store i8* bitcast (i32** @d to i8*), i8** [[BP0]] 2811 // CK22-DAG: store i8* bitcast (i32** @d to i8*), i8** [[P0]] 2812 2813 // CK22: call void [[CALL02:@.+]](i32** {{[^,]+}}) 2814 #pragma omp target map(d) 2815 { d[3]+=1; } 2816 2817 // Region 03 2818 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 2819 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2820 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2821 2822 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2823 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2824 // CK22-DAG: store i8* bitcast ([100 x i32]* @c to i8*), i8** [[BP0]] 2825 // CK22-DAG: store i8* bitcast (i32* getelementptr inbounds ([100 x i32], [100 x i32]* @c, i{{.+}} 0, i{{.+}} 1) to i8*), i8** [[P0]] 2826 2827 // CK22: call void [[CALL03:@.+]]([100 x i32]* {{[^,]+}}) 2828 #pragma omp target map(c[1:4]) 2829 { c[3]+=1; } 2830 2831 // Region 04 2832 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}}) 2833 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2834 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2835 2836 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2837 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2838 // CK22-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2839 // CK22-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2840 // CK22-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 2841 // CK22-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 2842 // CK22-DAG: [[RVAR0]] = load i32*, i32** @d 2843 // CK22-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 2 2844 // CK22-DAG: [[RVAR00]] = load i32*, i32** @d 2845 2846 // CK22: call void [[CALL04:@.+]](i32* {{[^,]+}}) 2847 #pragma omp target map(d[2:5]) 2848 { d[3]+=1; } 2849 2850 // Region 05 2851 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}}) 2852 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2853 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2854 2855 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2856 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2857 // CK22-DAG: store i8* bitcast ([[ST]]* @sa to i8*), i8** [[BP0]] 2858 // CK22-DAG: store i8* bitcast ([[ST]]* @sa to i8*), i8** [[P0]] 2859 2860 // CK22: call void [[CALL05:@.+]]([[ST]]* {{[^,]+}}) 2861 #pragma omp target map(sa) 2862 { sa.fa+=1; } 2863 2864 // Region 06 2865 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE06]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE06]]{{.+}}) 2866 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2867 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2868 2869 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2870 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2871 // CK22-DAG: store i8* bitcast ([100 x [[ST]]]* @sc to i8*), i8** [[BP0]] 2872 // CK22-DAG: store i8* bitcast ([100 x [[ST]]]* @sc to i8*), i8** [[P0]] 2873 2874 // CK22: call void [[CALL06:@.+]]([100 x [[ST]]]* {{[^,]+}}) 2875 #pragma omp target map(sc) 2876 { sc[3].fa+=1; } 2877 2878 // Region 07 2879 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE07]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE07]]{{.+}}) 2880 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2881 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2882 2883 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2884 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2885 // CK22-DAG: store i8* bitcast ([[ST]]** @sd to i8*), i8** [[BP0]] 2886 // CK22-DAG: store i8* bitcast ([[ST]]** @sd to i8*), i8** [[P0]] 2887 2888 // CK22: call void [[CALL07:@.+]]([[ST]]** {{[^,]+}}) 2889 #pragma omp target map(sd) 2890 { sd[3].fa+=1; } 2891 2892 // Region 08 2893 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE08]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE08]]{{.+}}) 2894 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2895 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2896 2897 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2898 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2899 // CK22-DAG: store i8* bitcast ([100 x [[ST]]]* @sc to i8*), i8** [[BP0]] 2900 // CK22-DAG: store i8* bitcast ([[ST]]* getelementptr inbounds ([100 x [[ST]]], [100 x [[ST]]]* @sc, i{{.+}} 0, i{{.+}} 1) to i8*), i8** [[P0]] 2901 2902 // CK22: call void [[CALL08:@.+]]([100 x [[ST]]]* {{[^,]+}}) 2903 #pragma omp target map(sc[1:4]) 2904 { sc[3].fa+=1; } 2905 2906 // Region 09 2907 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE09]]{{.+}}) 2908 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2909 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2910 2911 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2912 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2913 // CK22-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2914 // CK22-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2915 // CK22-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[RVAR0:%.+]] to i8* 2916 // CK22-DAG: [[CPVAL0]] = bitcast [[ST]]* [[SEC0:%.+]] to i8* 2917 // CK22-DAG: [[RVAR0]] = load [[ST]]*, [[ST]]** @sd 2918 // CK22-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[RVAR00:%.+]], i{{.+}} 2 2919 // CK22-DAG: [[RVAR00]] = load [[ST]]*, [[ST]]** @sd 2920 2921 // CK22: call void [[CALL09:@.+]]([[ST]]* {{[^,]+}}) 2922 #pragma omp target map(sd[2:5]) 2923 { sd[3].fa+=1; } 2924 2925 // Region 10 2926 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE10]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE10]]{{.+}}) 2927 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2928 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2929 2930 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2931 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2932 // CK22-DAG: store i8* bitcast ([[STT]]* @sta to i8*), i8** [[BP0]] 2933 // CK22-DAG: store i8* bitcast ([[STT]]* @sta to i8*), i8** [[P0]] 2934 2935 // CK22: call void [[CALL10:@.+]]([[STT]]* {{[^,]+}}) 2936 #pragma omp target map(sta) 2937 { sta.fa+=1; } 2938 2939 // Region 11 2940 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE11]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE11]]{{.+}}) 2941 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2942 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2943 2944 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2945 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2946 // CK22-DAG: store i8* bitcast ([100 x [[STT]]]* @stc to i8*), i8** [[BP0]] 2947 // CK22-DAG: store i8* bitcast ([100 x [[STT]]]* @stc to i8*), i8** [[P0]] 2948 2949 // CK22: call void [[CALL11:@.+]]([100 x [[STT]]]* {{[^,]+}}) 2950 #pragma omp target map(stc) 2951 { stc[3].fa+=1; } 2952 2953 // Region 12 2954 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE12]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE12]]{{.+}}) 2955 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2956 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2957 2958 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2959 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2960 // CK22-DAG: store i8* bitcast ([[STT]]** @std to i8*), i8** [[BP0]] 2961 // CK22-DAG: store i8* bitcast ([[STT]]** @std to i8*), i8** [[P0]] 2962 2963 // CK22: call void [[CALL12:@.+]]([[STT]]** {{[^,]+}}) 2964 #pragma omp target map(std) 2965 { std[3].fa+=1; } 2966 2967 // Region 13 2968 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE13]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE13]]{{.+}}) 2969 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2970 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2971 2972 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2973 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2974 // CK22-DAG: store i8* bitcast ([100 x [[STT]]]* @stc to i8*), i8** [[BP0]] 2975 // CK22-DAG: store i8* bitcast ([[STT]]* getelementptr inbounds ([100 x [[STT]]], [100 x [[STT]]]* @stc, i{{.+}} 0, i{{.+}} 1) to i8*), i8** [[P0]] 2976 2977 // CK22: call void [[CALL13:@.+]]([100 x [[STT]]]* {{[^,]+}}) 2978 #pragma omp target map(stc[1:4]) 2979 { stc[3].fa+=1; } 2980 2981 // Region 14 2982 // CK22-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE14]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE14]]{{.+}}) 2983 // CK22-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 2984 // CK22-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 2985 2986 // CK22-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 2987 // CK22-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 2988 // CK22-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 2989 // CK22-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 2990 // CK22-DAG: [[CBPVAL0]] = bitcast [[STT]]* [[RVAR0:%.+]] to i8* 2991 // CK22-DAG: [[CPVAL0]] = bitcast [[STT]]* [[SEC0:%.+]] to i8* 2992 // CK22-DAG: [[RVAR0]] = load [[STT]]*, [[STT]]** @std 2993 // CK22-DAG: [[SEC0]] = getelementptr {{.*}}[[STT]]* [[RVAR00:%.+]], i{{.+}} 2 2994 // CK22-DAG: [[RVAR00]] = load [[STT]]*, [[STT]]** @std 2995 2996 // CK22: call void [[CALL14:@.+]]([[STT]]* {{[^,]+}}) 2997 #pragma omp target map(std[2:5]) 2998 { std[3].fa+=1; } 2999 3000 return 0; 3001 } 3002 // CK22: define {{.+}}[[CALL00]] 3003 // CK22: define {{.+}}[[CALL01]] 3004 // CK22: define {{.+}}[[CALL02]] 3005 // CK22: define {{.+}}[[CALL03]] 3006 // CK22: define {{.+}}[[CALL04]] 3007 // CK22: define {{.+}}[[CALL05]] 3008 // CK22: define {{.+}}[[CALL06]] 3009 // CK22: define {{.+}}[[CALL07]] 3010 // CK22: define {{.+}}[[CALL08]] 3011 // CK22: define {{.+}}[[CALL09]] 3012 // CK22: define {{.+}}[[CALL10]] 3013 // CK22: define {{.+}}[[CALL11]] 3014 // CK22: define {{.+}}[[CALL12]] 3015 // CK22: define {{.+}}[[CALL13]] 3016 // CK22: define {{.+}}[[CALL14]] 3017 #endif 3018 ///==========================================================================/// 3019 // RUN: %clang_cc1 -std=c++11 -DCK23 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK23 --check-prefix CK23-64 3020 // RUN: %clang_cc1 -std=c++11 -DCK23 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 3021 // RUN: %clang_cc1 -std=c++11 -fopenmp -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 --check-prefix CK23 --check-prefix CK23-64 3022 // RUN: %clang_cc1 -std=c++11 -DCK23 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK23 --check-prefix CK23-32 3023 // RUN: %clang_cc1 -std=c++11 -DCK23 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 3024 // RUN: %clang_cc1 -std=c++11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK23 --check-prefix CK23-32 3025 #ifdef CK23 3026 3027 // CK23: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 3028 // CK23: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3029 3030 // CK23: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 3031 // CK23: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3032 3033 // CK23: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 400] 3034 // CK23: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3035 3036 // CK23: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}] 3037 // CK23: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3038 3039 // CK23: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16] 3040 // CK23: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3041 3042 // CK23: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 16] 3043 // CK23: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3044 3045 // CK23-LABEL: explicit_maps_inside_captured 3046 int explicit_maps_inside_captured(int a){ 3047 float b; 3048 float c[100]; 3049 float *d; 3050 3051 // CK23: call void @{{.*}}explicit_maps_inside_captured{{.*}}([[SA:%.+]]* {{.*}}) 3052 // CK23: define {{.*}}explicit_maps_inside_captured{{.*}} 3053 [&](void){ 3054 // Region 00 3055 // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 3056 // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3057 // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3058 3059 // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3060 // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3061 // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3062 // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3063 // CK23-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 3064 // CK23-DAG: [[CPVAL0]] = bitcast i32* [[VAR00:%.+]] to i8* 3065 // CK23-DAG: [[VAR0]] = load i32*, i32** [[CAP0:%[^,]+]] 3066 // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]] 3067 // CK23-DAG: [[VAR00]] = load i32*, i32** [[CAP00:%[^,]+]] 3068 // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]] 3069 3070 // CK23: call void [[CALL00:@.+]](i32* {{[^,]+}}) 3071 #pragma omp target map(a) 3072 { a+=1; } 3073 // Region 01 3074 // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 3075 // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3076 // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3077 3078 // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3079 // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3080 // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3081 // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3082 // CK23-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8* 3083 // CK23-DAG: [[CPVAL0]] = bitcast float* [[VAR00:%.+]] to i8* 3084 // CK23-DAG: [[VAR0]] = load float*, float** [[CAP0:%[^,]+]] 3085 // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]] 3086 // CK23-DAG: [[VAR00]] = load float*, float** [[CAP00:%[^,]+]] 3087 // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]] 3088 3089 // CK23: call void [[CALL01:@.+]](float* {{[^,]+}}) 3090 #pragma omp target map(b) 3091 { b+=1; } 3092 // Region 02 3093 // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}}) 3094 // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3095 // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3096 3097 // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3098 // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3099 // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3100 // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3101 // CK23-DAG: [[CBPVAL0]] = bitcast [100 x float]* [[VAR0:%.+]] to i8* 3102 // CK23-DAG: [[CPVAL0]] = bitcast [100 x float]* [[VAR00:%.+]] to i8* 3103 // CK23-DAG: [[VAR0]] = load [100 x float]*, [100 x float]** [[CAP0:%[^,]+]] 3104 // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]] 3105 // CK23-DAG: [[VAR00]] = load [100 x float]*, [100 x float]** [[CAP00:%[^,]+]] 3106 // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]] 3107 3108 // CK23: call void [[CALL02:@.+]]([100 x float]* {{[^,]+}}) 3109 #pragma omp target map(c) 3110 { c[3]+=1; } 3111 3112 // Region 03 3113 // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 3114 // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3115 // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3116 3117 // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3118 // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3119 // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3120 // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3121 // CK23-DAG: [[CBPVAL0]] = bitcast float** [[VAR0:%.+]] to i8* 3122 // CK23-DAG: [[CPVAL0]] = bitcast float** [[VAR00:%.+]] to i8* 3123 // CK23-DAG: [[VAR0]] = load float**, float*** [[CAP0:%[^,]+]] 3124 // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]] 3125 // CK23-DAG: [[VAR00]] = load float**, float*** [[CAP00:%[^,]+]] 3126 // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]] 3127 3128 // CK23: call void [[CALL03:@.+]](float** {{[^,]+}}) 3129 #pragma omp target map(d) 3130 { d[3]+=1; } 3131 // Region 04 3132 // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}}) 3133 // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3134 // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3135 3136 // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3137 // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3138 // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3139 // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3140 // CK23-DAG: [[CBPVAL0]] = bitcast [100 x float]* [[VAR0:%.+]] to i8* 3141 // CK23-DAG: [[CPVAL0]] = bitcast float* [[SEC0:%.+]] to i8* 3142 // CK23-DAG: [[SEC0]] = getelementptr {{.*}}[100 x float]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2 3143 // CK23-DAG: [[VAR0]] = load [100 x float]*, [100 x float]** [[CAP0:%[^,]+]] 3144 // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]] 3145 // CK23-DAG: [[VAR00]] = load [100 x float]*, [100 x float]** [[CAP00:%[^,]+]] 3146 // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]] 3147 3148 // CK23: call void [[CALL04:@.+]]([100 x float]* {{[^,]+}}) 3149 #pragma omp target map(c[2:4]) 3150 { c[3]+=1; } 3151 3152 // Region 05 3153 // CK23-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}}) 3154 // CK23-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3155 // CK23-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3156 3157 // CK23-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3158 // CK23-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3159 // CK23-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3160 // CK23-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3161 // CK23-DAG: [[CBPVAL0]] = bitcast float* [[RVAR0:%.+]] to i8* 3162 // CK23-DAG: [[CPVAL0]] = bitcast float* [[SEC0:%.+]] to i8* 3163 // CK23-DAG: [[RVAR0]] = load float*, float** [[VAR0:%[^,]+]] 3164 // CK23-DAG: [[SEC0]] = getelementptr {{.*}}float* [[RVAR00:%.+]], i{{.+}} 2 3165 // CK23-DAG: [[RVAR00]] = load float*, float** [[VAR00:%[^,]+]] 3166 // CK23-DAG: [[VAR0]] = load float**, float*** [[CAP0:%[^,]+]] 3167 // CK23-DAG: [[CAP0]] = getelementptr inbounds [[SA]], [[SA]] 3168 // CK23-DAG: [[VAR00]] = load float**, float*** [[CAP00:%[^,]+]] 3169 // CK23-DAG: [[CAP00]] = getelementptr inbounds [[SA]], [[SA]] 3170 3171 // CK23: call void [[CALL05:@.+]](float* {{[^,]+}}) 3172 #pragma omp target map(d[2:4]) 3173 { d[3]+=1; } 3174 }(); 3175 return b; 3176 } 3177 3178 // CK23: define {{.+}}[[CALL00]] 3179 // CK23: define {{.+}}[[CALL01]] 3180 // CK23: define {{.+}}[[CALL02]] 3181 // CK23: define {{.+}}[[CALL03]] 3182 // CK23: define {{.+}}[[CALL04]] 3183 // CK23: define {{.+}}[[CALL05]] 3184 #endif 3185 ///==========================================================================/// 3186 // RUN: %clang_cc1 -DCK24 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK24 --check-prefix CK24-64 3187 // RUN: %clang_cc1 -DCK24 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 3188 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK24 --check-prefix CK24-64 3189 // RUN: %clang_cc1 -DCK24 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK24 --check-prefix CK24-32 3190 // RUN: %clang_cc1 -DCK24 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 3191 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK24 --check-prefix CK24-32 3192 #ifdef CK24 3193 3194 // CK24-DAG: [[SC:%.+]] = type { i32, [[SB:%.+]], [[SB:%.+]]*, [10 x i32] } 3195 // CK24-DAG: [[SB]] = type { i32, [[SA:%.+]], [10 x [[SA:%.+]]], [10 x [[SA:%.+]]*], [[SA:%.+]]* } 3196 // CK24-DAG: [[SA]] = type { i32, [[SA]]*, [10 x i32] } 3197 3198 struct SA{ 3199 int a; 3200 struct SA *p; 3201 int b[10]; 3202 }; 3203 struct SB{ 3204 int a; 3205 struct SA s; 3206 struct SA sa[10]; 3207 struct SA *sp[10]; 3208 struct SA *p; 3209 }; 3210 struct SC{ 3211 int a; 3212 struct SB s; 3213 struct SB *p; 3214 int b[10]; 3215 }; 3216 3217 // CK24: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 3218 // CK24: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3219 3220 // CK24: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{56|48}}] 3221 // CK24: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3222 3223 // CK24: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 3224 // CK24: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3225 3226 // CK24: [[SIZE04:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20] 3227 // CK24: [[MTYPE04:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3228 3229 // CK24: [[SIZE05:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{3560|2880}}] 3230 // CK24: [[MTYPE05:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3231 3232 // CK24: [[SIZE06:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 3233 // CK24: [[MTYPE06:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3234 3235 // CK24: [[SIZE07:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 3236 // CK24: [[MTYPE07:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3237 3238 // CK24: [[SIZE08:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 3239 // CK24: [[MTYPE08:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3240 3241 // CK24: [[SIZE09:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 3242 // CK24: [[MTYPE09:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3243 3244 // CK24: [[SIZE10:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 8] 3245 // CK24: [[MTYPE10:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3246 3247 // CK24: [[SIZE11:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}] 3248 // CK24: [[MTYPE11:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3249 3250 // CK24: [[SIZE12:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 4] 3251 // CK24: [[MTYPE12:@.+]] = private {{.*}}constant [4 x i32] [i32 35, i32 19, i32 19, i32 19] 3252 3253 // CK24: [[SIZE13:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 3254 // CK24: [[MTYPE13:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3255 3256 // CK24: [[SIZE14:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{56|48}}] 3257 // CK24: [[MTYPE14:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3258 3259 // CK24: [[SIZE15:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 3260 // CK24: [[MTYPE15:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3261 3262 // CK24: [[SIZE16:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 20] 3263 // CK24: [[MTYPE16:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3264 3265 // CK24: [[SIZE17:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{3560|2880}}] 3266 // CK24: [[MTYPE17:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3267 3268 // CK24: [[SIZE18:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 3269 // CK24: [[MTYPE18:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3270 3271 // CK24: [[SIZE19:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 3272 // CK24: [[MTYPE19:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3273 3274 // CK24: [[SIZE20:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 3275 // CK24: [[MTYPE20:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3276 3277 // CK24: [[SIZE21:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] 4] 3278 // CK24: [[MTYPE21:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3279 3280 // CK24: [[SIZE22:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] {{8|4}}] 3281 // CK24: [[MTYPE22:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 3282 3283 // CK24: [[SIZE23:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}] 3284 // CK24: [[MTYPE23:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 19] 3285 3286 // CK24: [[SIZE24:@.+]] = private {{.*}}constant [4 x i[[Z]]] [i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] {{8|4}}, i[[Z]] 4] 3287 // CK24: [[MTYPE24:@.+]] = private {{.*}}constant [4 x i32] [i32 35, i32 19, i32 19, i32 19] 3288 3289 // CK24-LABEL: explicit_maps_struct_fields 3290 int explicit_maps_struct_fields(int a){ 3291 SC s; 3292 SC *p; 3293 3294 // Region 01 3295 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 3296 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3297 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3298 3299 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3300 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3301 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3302 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3303 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3304 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3305 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 0 3306 3307 // CK24: call void [[CALL01:@.+]]([[SC]]* {{[^,]+}}) 3308 #pragma omp target map(s.a) 3309 { s.a++; } 3310 3311 // Region 02 3312 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}}) 3313 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3314 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3315 3316 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3317 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3318 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3319 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3320 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3321 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]* [[SEC0:%.+]] to i8* 3322 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3323 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3324 3325 // CK24: call void [[CALL02:@.+]]([[SC]]* {{[^,]+}}) 3326 #pragma omp target map(s.s.s) 3327 { s.a++; } 3328 3329 // Region 03 3330 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 3331 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3332 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3333 3334 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3335 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3336 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3337 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3338 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3339 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3340 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3341 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3342 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3343 3344 // CK24: call void [[CALL03:@.+]]([[SC]]* {{[^,]+}}) 3345 #pragma omp target map(s.s.s.a) 3346 { s.a++; } 3347 3348 // Region 04 3349 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE04]]{{.+}}) 3350 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3351 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3352 3353 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3354 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3355 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3356 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3357 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3358 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3359 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3360 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 3 3361 3362 // CK24: call void [[CALL04:@.+]]([[SC]]* {{[^,]+}}) 3363 #pragma omp target map(s.b[:5]) 3364 { s.a++; } 3365 3366 // Region 05 3367 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE05]]{{.+}}) 3368 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3369 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3370 3371 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3372 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3373 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3374 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3375 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3376 // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8* 3377 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3378 3379 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3380 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3381 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3382 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3383 // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8* 3384 // CK24-DAG: [[CPVAL1]] = bitcast [[SB]]* [[SEC1:%.+]] to i8* 3385 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0 3386 // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]], 3387 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3388 3389 // CK24: call void [[CALL05:@.+]]([[SC]]* {{[^,]+}}) 3390 #pragma omp target map(s.p[:5]) 3391 { s.a++; } 3392 3393 // Region 06 3394 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE06]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE06]]{{.+}}) 3395 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3396 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3397 3398 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3399 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3400 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3401 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3402 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3403 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3404 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3405 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[10 x [[SA]]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3406 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 2 3407 // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3408 3409 // CK24: call void [[CALL06:@.+]]([[SC]]* {{[^,]+}}) 3410 #pragma omp target map(s.s.sa[3].a) 3411 { s.a++; } 3412 3413 // Region 07 3414 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE07]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE07]]{{.+}}) 3415 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3416 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3417 3418 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3419 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3420 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3421 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3422 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3423 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8* 3424 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3425 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3426 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3427 3428 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3429 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3430 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3431 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3432 // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8* 3433 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3434 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3435 // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]], 3436 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC1111:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3437 // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3438 // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3439 3440 // CK24: call void [[CALL07:@.+]]([[SC]]* {{[^,]+}}) 3441 #pragma omp target map(s.s.sp[3]->a) 3442 { s.a++; } 3443 3444 // Region 08 3445 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE08]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE08]]{{.+}}) 3446 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3447 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3448 3449 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3450 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3451 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3452 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3453 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3454 // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8* 3455 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3456 3457 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3458 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3459 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3460 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3461 // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8* 3462 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3463 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0 3464 // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]], 3465 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3466 3467 // CK24: call void [[CALL08:@.+]]([[SC]]* {{[^,]+}}) 3468 #pragma omp target map(s.p->a) 3469 { s.a++; } 3470 3471 // Region 09 3472 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE09]]{{.+}}) 3473 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3474 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3475 3476 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3477 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3478 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3479 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3480 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3481 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8* 3482 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 4 3483 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3484 3485 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3486 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3487 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3488 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3489 // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8* 3490 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3491 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0 3492 // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]], 3493 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SB]]* [[SEC1111:[^,]+]], i{{.+}} 0, i{{.+}} 4 3494 // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3495 3496 // CK24: call void [[CALL09:@.+]]([[SC]]* {{[^,]+}}) 3497 #pragma omp target map(s.s.p->a) 3498 { s.a++; } 3499 3500 // Region 10 3501 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE10]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE10]]{{.+}}) 3502 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3503 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3504 3505 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3506 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3507 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3508 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3509 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3510 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3511 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3512 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SA]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 2 3513 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3514 // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3515 3516 // CK24: call void [[CALL10:@.+]]([[SC]]* {{[^,]+}}) 3517 #pragma omp target map(s.s.s.b[:2]) 3518 { s.a++; } 3519 3520 // Region 11 3521 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE11]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE11]]{{.+}}) 3522 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3523 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3524 3525 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3526 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3527 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3528 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3529 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3530 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8* 3531 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3532 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3533 3534 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3535 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3536 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3537 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3538 // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8* 3539 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3540 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[10 x i32]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3541 // CK24-DAG: [[SEC11]] = getelementptr {{.*}}[[SA]]* [[SEC111:%[^,]+]], i{{.+}} 0, i{{.+}} 2 3542 // CK24-DAG: [[SEC111]] = load [[SA]]*, [[SA]]** [[SEC1111:%[^,]+]], 3543 // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3544 // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 1 3545 3546 // CK24: call void [[CALL11:@.+]]([[SC]]* {{[^,]+}}) 3547 #pragma omp target map(s.s.p->b[:2]) 3548 { s.a++; } 3549 3550 // Region 12 3551 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE12]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE12]]{{.+}}) 3552 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3553 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3554 3555 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3556 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3557 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3558 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3559 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3560 // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8* 3561 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3562 3563 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3564 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3565 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3566 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3567 // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8* 3568 // CK24-DAG: [[CPVAL1]] = bitcast [[SA]]** [[SEC1:%.+]] to i8* 3569 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3570 // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]], 3571 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3572 3573 // CK24-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 3574 // CK24-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 3575 // CK24-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 3576 // CK24-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 3577 // CK24-DAG: [[CBPVAL2]] = bitcast [[SA]]** [[SEC1]] to i8* 3578 // CK24-DAG: [[CPVAL2]] = bitcast [[SA]]** [[SEC2:%.+]] to i8* 3579 // CK24-DAG: [[SEC2]] = getelementptr {{.*}}[[SA]]* [[SEC22:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3580 // CK24-DAG: [[SEC22]] = load [[SA]]*, [[SA]]** [[SEC222:%[^,]+]], 3581 // CK24-DAG: [[SEC222]] = getelementptr {{.*}}[[SB]]* [[SEC2222:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3582 // CK24-DAG: [[SEC2222]] = load [[SB]]*, [[SB]]** [[SEC22222:%[^,]+]], 3583 // CK24-DAG: [[SEC22222]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3584 3585 // CK24-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3 3586 // CK24-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3 3587 // CK24-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]] 3588 // CK24-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]] 3589 // CK24-DAG: [[CBPVAL3]] = bitcast [[SA]]** [[SEC2]] to i8* 3590 // CK24-DAG: [[CPVAL3]] = bitcast i32* [[SEC3:%.+]] to i8* 3591 // CK24-DAG: [[SEC3]] = getelementptr {{.*}}[[SA]]* [[SEC33:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3592 // CK24-DAG: [[SEC33]] = load [[SA]]*, [[SA]]** [[SEC333:%[^,]+]], 3593 // CK24-DAG: [[SEC333]] = getelementptr {{.*}}[[SA]]* [[SEC3333:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3594 // CK24-DAG: [[SEC3333]] = load [[SA]]*, [[SA]]** [[SEC33333:%[^,]+]], 3595 // CK24-DAG: [[SEC33333]] = getelementptr {{.*}}[[SB]]* [[SEC333333:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3596 // CK24-DAG: [[SEC333333]] = load [[SB]]*, [[SB]]** [[SEC3333333:%[^,]+]], 3597 // CK24-DAG: [[SEC3333333]] = getelementptr {{.*}}[[SC]]* [[VAR0]], i{{.+}} 0, i{{.+}} 2 3598 3599 // CK24: call void [[CALL12:@.+]]([[SC]]* {{[^,]+}}) 3600 #pragma omp target map(s.p->p->p->a) 3601 { s.a++; } 3602 3603 // 3604 // Same thing but starting from a pointer. 3605 // 3606 // Region 13 3607 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE13]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE13]]{{.+}}) 3608 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3609 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3610 3611 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3612 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3613 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3614 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3615 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3616 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3617 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 0 3618 3619 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3620 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3621 3622 // CK24: call void [[CALL13:@.+]]([[SC]]* {{[^,]+}}) 3623 #pragma omp target map(p->a) 3624 { p->a++; } 3625 3626 // Region 14 3627 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE14]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE14]]{{.+}}) 3628 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3629 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3630 3631 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3632 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3633 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3634 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3635 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3636 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]* [[SEC0:%.+]] to i8* 3637 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3638 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3639 3640 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3641 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3642 3643 // CK24: call void [[CALL14:@.+]]([[SC]]* {{[^,]+}}) 3644 #pragma omp target map(p->s.s) 3645 { p->a++; } 3646 3647 // Region 15 3648 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE15]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE15]]{{.+}}) 3649 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3650 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3651 3652 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3653 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3654 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3655 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3656 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3657 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3658 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3659 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3660 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3661 3662 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3663 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3664 3665 // CK24: call void [[CALL15:@.+]]([[SC]]* {{[^,]+}}) 3666 #pragma omp target map(p->s.s.a) 3667 { p->a++; } 3668 3669 // Region 16 3670 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE16]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE16]]{{.+}}) 3671 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3672 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3673 3674 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3675 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3676 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3677 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3678 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3679 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3680 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3681 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 3 3682 3683 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3684 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3685 3686 // CK24: call void [[CALL16:@.+]]([[SC]]* {{[^,]+}}) 3687 #pragma omp target map(p->b[:5]) 3688 { p->a++; } 3689 3690 // Region 17 3691 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE17]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE17]]{{.+}}) 3692 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3693 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3694 3695 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3696 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3697 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3698 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3699 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3700 // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8* 3701 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2 3702 3703 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3704 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3705 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3706 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3707 // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8* 3708 // CK24-DAG: [[CPVAL1]] = bitcast [[SB]]* [[SEC1:%.+]] to i8* 3709 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0 3710 // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]], 3711 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 2 3712 3713 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3714 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3715 // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}} 3716 3717 // CK24: call void [[CALL17:@.+]]([[SC]]* {{[^,]+}}) 3718 #pragma omp target map(p->p[:5]) 3719 { p->a++; } 3720 3721 // Region 18 3722 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE18]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE18]]{{.+}}) 3723 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3724 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3725 3726 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3727 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3728 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3729 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3730 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3731 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3732 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SA]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3733 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[10 x [[SA]]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3734 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 2 3735 // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3736 3737 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3738 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3739 3740 // CK24: call void [[CALL18:@.+]]([[SC]]* {{[^,]+}}) 3741 #pragma omp target map(p->s.sa[3].a) 3742 { p->a++; } 3743 3744 // Region 19 3745 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE19]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE19]]{{.+}}) 3746 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3747 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3748 3749 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3750 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3751 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3752 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3753 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3754 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8* 3755 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3756 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SB]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3757 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3758 3759 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3760 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3761 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3762 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3763 // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8* 3764 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3765 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3766 // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]], 3767 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[10 x [[SA]]*]* [[SEC1111:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3768 // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 3 3769 // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 1 3770 3771 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3772 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3773 // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}} 3774 3775 // CK24: call void [[CALL19:@.+]]([[SC]]* {{[^,]+}}) 3776 #pragma omp target map(p->s.sp[3]->a) 3777 { p->a++; } 3778 3779 // Region 20 3780 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE20]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE20]]{{.+}}) 3781 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3782 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3783 3784 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3785 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3786 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3787 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3788 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3789 // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8* 3790 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2 3791 3792 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3793 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3794 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3795 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3796 // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8* 3797 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3798 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0 3799 // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]], 3800 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 2 3801 3802 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3803 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3804 // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}} 3805 3806 // CK24: call void [[CALL20:@.+]]([[SC]]* {{[^,]+}}) 3807 #pragma omp target map(p->p->a) 3808 { p->a++; } 3809 3810 // Region 21 3811 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE21]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE21]]{{.+}}) 3812 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3813 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3814 3815 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3816 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3817 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3818 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3819 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3820 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8* 3821 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:[^,]+]], i{{.+}} 0, i{{.+}} 4 3822 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3823 3824 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3825 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3826 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3827 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3828 // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8* 3829 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3830 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SA]]* [[SEC11:%[^,]+]], i{{.+}} 0 3831 // CK24-DAG: [[SEC11]] = load [[SA]]*, [[SA]]** [[SEC111:%[^,]+]], 3832 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SB]]* [[SEC1111:[^,]+]], i{{.+}} 0, i{{.+}} 4 3833 // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 1 3834 3835 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3836 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3837 // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}} 3838 3839 // CK24: call void [[CALL21:@.+]]([[SC]]* {{[^,]+}}) 3840 #pragma omp target map(p->s.p->a) 3841 { p->a++; } 3842 3843 // Region 22 3844 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE22]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE22]]{{.+}}) 3845 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3846 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3847 3848 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3849 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3850 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3851 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3852 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3853 // CK24-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 3854 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[10 x i32]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3855 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SA]]* [[SEC000:%[^,]+]], i{{.+}} 0, i{{.+}} 2 3856 // CK24-DAG: [[SEC000]] = getelementptr {{.*}}[[SB]]* [[SEC0000:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3857 // CK24-DAG: [[SEC0000]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3858 3859 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3860 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3861 3862 // CK24: call void [[CALL22:@.+]]([[SC]]* {{[^,]+}}) 3863 #pragma omp target map(p->s.s.b[:2]) 3864 { p->a++; } 3865 3866 // Region 23 3867 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE23]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE23]]{{.+}}) 3868 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3869 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3870 3871 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3872 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3873 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3874 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3875 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3876 // CK24-DAG: [[CPVAL0]] = bitcast [[SA]]** [[SEC0:%.+]] to i8* 3877 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SB]]* [[SEC00:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3878 // CK24-DAG: [[SEC00]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 1 3879 3880 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3881 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3882 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3883 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3884 // CK24-DAG: [[CBPVAL1]] = bitcast [[SA]]** [[SEC0]] to i8* 3885 // CK24-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 3886 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[10 x i32]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3887 // CK24-DAG: [[SEC11]] = getelementptr {{.*}}[[SA]]* [[SEC111:%[^,]+]], i{{.+}} 0, i{{.+}} 2 3888 // CK24-DAG: [[SEC111]] = load [[SA]]*, [[SA]]** [[SEC1111:%[^,]+]], 3889 // CK24-DAG: [[SEC1111]] = getelementptr {{.*}}[[SB]]* [[SEC11111:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3890 // CK24-DAG: [[SEC11111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 1 3891 3892 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3893 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3894 // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}} 3895 3896 // CK24: call void [[CALL23:@.+]]([[SC]]* {{[^,]+}}) 3897 #pragma omp target map(p->s.p->b[:2]) 3898 { p->a++; } 3899 3900 // Region 24 3901 // CK24-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 4, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[SIZE24]], {{.+}}getelementptr {{.+}}[4 x i{{.+}}]* [[MTYPE24]]{{.+}}) 3902 // CK24-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 3903 // CK24-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 3904 3905 // CK24-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 3906 // CK24-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 3907 // CK24-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 3908 // CK24-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 3909 // CK24-DAG: [[CBPVAL0]] = bitcast [[SC]]* [[VAR0:%.+]] to i8* 3910 // CK24-DAG: [[CPVAL0]] = bitcast [[SB]]** [[SEC0:%.+]] to i8* 3911 // CK24-DAG: [[SEC0]] = getelementptr {{.*}}[[SC]]* [[VAR00:%.+]], i{{.+}} 0, i{{.+}} 2 3912 3913 // CK24-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 3914 // CK24-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 3915 // CK24-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 3916 // CK24-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 3917 // CK24-DAG: [[CBPVAL1]] = bitcast [[SB]]** [[SEC0]] to i8* 3918 // CK24-DAG: [[CPVAL1]] = bitcast [[SA]]** [[SEC1:%.+]] to i8* 3919 // CK24-DAG: [[SEC1]] = getelementptr {{.*}}[[SB]]* [[SEC11:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3920 // CK24-DAG: [[SEC11]] = load [[SB]]*, [[SB]]** [[SEC111:%[^,]+]], 3921 // CK24-DAG: [[SEC111]] = getelementptr {{.*}}[[SC]]* [[VAR000:%.+]], i{{.+}} 0, i{{.+}} 2 3922 3923 // CK24-DAG: [[BP2:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 2 3924 // CK24-DAG: [[P2:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 2 3925 // CK24-DAG: store i8* [[CBPVAL2:%[^,]+]], i8** [[BP2]] 3926 // CK24-DAG: store i8* [[CPVAL2:%[^,]+]], i8** [[P2]] 3927 // CK24-DAG: [[CBPVAL2]] = bitcast [[SA]]** [[SEC1]] to i8* 3928 // CK24-DAG: [[CPVAL2]] = bitcast [[SA]]** [[SEC2:%.+]] to i8* 3929 // CK24-DAG: [[SEC2]] = getelementptr {{.*}}[[SA]]* [[SEC22:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3930 // CK24-DAG: [[SEC22]] = load [[SA]]*, [[SA]]** [[SEC222:%[^,]+]], 3931 // CK24-DAG: [[SEC222]] = getelementptr {{.*}}[[SB]]* [[SEC2222:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3932 // CK24-DAG: [[SEC2222]] = load [[SB]]*, [[SB]]** [[SEC22222:%[^,]+]], 3933 // CK24-DAG: [[SEC22222]] = getelementptr {{.*}}[[SC]]* [[VAR0000:%.+]], i{{.+}} 0, i{{.+}} 2 3934 3935 // CK24-DAG: [[BP3:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 3 3936 // CK24-DAG: [[P3:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 3 3937 // CK24-DAG: store i8* [[CBPVAL3:%[^,]+]], i8** [[BP3]] 3938 // CK24-DAG: store i8* [[CPVAL3:%[^,]+]], i8** [[P3]] 3939 // CK24-DAG: [[CBPVAL3]] = bitcast [[SA]]** [[SEC2]] to i8* 3940 // CK24-DAG: [[CPVAL3]] = bitcast i32* [[SEC3:%.+]] to i8* 3941 // CK24-DAG: [[SEC3]] = getelementptr {{.*}}[[SA]]* [[SEC33:%[^,]+]], i{{.+}} 0, i{{.+}} 0 3942 // CK24-DAG: [[SEC33]] = load [[SA]]*, [[SA]]** [[SEC333:%[^,]+]], 3943 // CK24-DAG: [[SEC333]] = getelementptr {{.*}}[[SA]]* [[SEC3333:%[^,]+]], i{{.+}} 0, i{{.+}} 1 3944 // CK24-DAG: [[SEC3333]] = load [[SA]]*, [[SA]]** [[SEC33333:%[^,]+]], 3945 // CK24-DAG: [[SEC33333]] = getelementptr {{.*}}[[SB]]* [[SEC333333:%[^,]+]], i{{.+}} 0, i{{.+}} 4 3946 // CK24-DAG: [[SEC333333]] = load [[SB]]*, [[SB]]** [[SEC3333333:%[^,]+]], 3947 // CK24-DAG: [[SEC3333333]] = getelementptr {{.*}}[[SC]]* [[VAR00000:%.+]], i{{.+}} 0, i{{.+}} 2 3948 3949 // CK24-DAG: [[VAR0]] = load [[SC]]*, [[SC]]** %{{.+}} 3950 // CK24-DAG: [[VAR00]] = load [[SC]]*, [[SC]]** %{{.+}} 3951 // CK24-DAG: [[VAR000]] = load [[SC]]*, [[SC]]** %{{.+}} 3952 // CK24-DAG: [[VAR0000]] = load [[SC]]*, [[SC]]** %{{.+}} 3953 // CK24-DAG: [[VAR00000]] = load [[SC]]*, [[SC]]** %{{.+}} 3954 3955 // CK24: call void [[CALL24:@.+]]([[SC]]* {{[^,]+}}) 3956 #pragma omp target map(p->p->p->p->a) 3957 { p->a++; } 3958 3959 return s.a; 3960 } 3961 3962 // CK24: define {{.+}}[[CALL01]] 3963 // CK24: define {{.+}}[[CALL02]] 3964 // CK24: define {{.+}}[[CALL03]] 3965 // CK24: define {{.+}}[[CALL04]] 3966 // CK24: define {{.+}}[[CALL05]] 3967 // CK24: define {{.+}}[[CALL06]] 3968 // CK24: define {{.+}}[[CALL07]] 3969 // CK24: define {{.+}}[[CALL08]] 3970 // CK24: define {{.+}}[[CALL09]] 3971 // CK24: define {{.+}}[[CALL10]] 3972 // CK24: define {{.+}}[[CALL11]] 3973 // CK24: define {{.+}}[[CALL12]] 3974 // CK24: define {{.+}}[[CALL13]] 3975 // CK24: define {{.+}}[[CALL14]] 3976 // CK24: define {{.+}}[[CALL15]] 3977 // CK24: define {{.+}}[[CALL16]] 3978 // CK24: define {{.+}}[[CALL17]] 3979 // CK24: define {{.+}}[[CALL18]] 3980 // CK24: define {{.+}}[[CALL19]] 3981 // CK24: define {{.+}}[[CALL20]] 3982 // CK24: define {{.+}}[[CALL21]] 3983 // CK24: define {{.+}}[[CALL22]] 3984 // CK24: define {{.+}}[[CALL23]] 3985 // CK24: define {{.+}}[[CALL24]] 3986 #endif 3987 ///==========================================================================/// 3988 // RUN: %clang_cc1 -DCK25 -std=c++11 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK25 --check-prefix CK25-64 3989 // RUN: %clang_cc1 -DCK25 -std=c++11 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 3990 // RUN: %clang_cc1 -fopenmp -std=c++11 -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 --check-prefix CK25 --check-prefix CK25-64 3991 // RUN: %clang_cc1 -DCK25 -std=c++11 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK25 --check-prefix CK25-32 3992 // RUN: %clang_cc1 -DCK25 -std=c++11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 3993 // RUN: %clang_cc1 -fopenmp -std=c++11 -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK25 --check-prefix CK25-32 3994 #ifdef CK25 3995 // CK25: [[ST:%.+]] = type { i32, float } 3996 // CK25: [[CA00:%.+]] = type { [[ST]]* } 3997 // CK25: [[CA01:%.+]] = type { i32* } 3998 3999 // CK25: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] [i[[Z:64|32]] 4] 4000 // CK25: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 4001 4002 // CK25: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 4003 // CK25: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 33] 4004 4005 // CK25-LABEL: explicit_maps_with_inner_lambda 4006 4007 template <int X, typename T> 4008 struct CC { 4009 T A; 4010 float B; 4011 4012 int foo(T arg) { 4013 // Region 00 4014 // CK25-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 4015 // CK25-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4016 // CK25-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4017 4018 // CK25-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4019 // CK25-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4020 // CK25-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4021 // CK25-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4022 // CK25-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 4023 // CK25-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 4024 // CK25-DAG: [[SEC0]] = getelementptr {{.*}}[[ST]]* [[VAR0:%.+]], i{{.+}} 0, i{{.+}} 0 4025 4026 // CK25: call void [[CALL00:@.+]]([[ST]]* {{[^,]+}}) 4027 #pragma omp target map(to:A) 4028 { 4029 [&]() { 4030 A += 1; 4031 }(); 4032 } 4033 4034 // Region 01 4035 // CK25-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 4036 // CK25-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4037 // CK25-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4038 4039 // CK25-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4040 // CK25-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4041 // CK25-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4042 // CK25-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4043 // CK25-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 4044 // CK25-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8* 4045 4046 // CK25: call void [[CALL01:@.+]](i32* {{[^,]+}}) 4047 #pragma omp target map(to:arg) 4048 { 4049 [&]() { 4050 arg += 1; 4051 }(); 4052 } 4053 4054 return A+arg; 4055 } 4056 }; 4057 4058 int explicit_maps_with_inner_lambda(int a){ 4059 CC<123,int> c; 4060 return c.foo(a); 4061 } 4062 4063 // CK25: define {{.+}}[[CALL00]]([[ST]]* [[VAL:%.+]]) 4064 // CK25: store [[ST]]* [[VAL]], [[ST]]** [[VALADDR:%[^,]+]], 4065 // CK25: [[VAL1:%.+]] = load [[ST]]*, [[ST]]** [[VALADDR]], 4066 // CK25: [[VALADDR1:%.+]] = getelementptr inbounds [[CA00]], [[CA00]]* [[CA:%[^,]+]], i32 0, i32 0 4067 // CK25: store [[ST]]* [[VAL1]], [[ST]]** [[VALADDR1]], 4068 // CK25: call void {{.*}}[[LAMBDA:@.+]]{{.*}}([[CA00]]* [[CA]]) 4069 4070 // CK25: define {{.+}}[[LAMBDA]] 4071 4072 // CK25: define {{.+}}[[CALL01]](i32* {{.*}}[[VAL:%.+]]) 4073 // CK25: store i32* [[VAL]], i32** [[VALADDR:%[^,]+]], 4074 // CK25: [[VAL1:%.+]] = load i32*, i32** [[VALADDR]], 4075 // CK25: [[VALADDR1:%.+]] = getelementptr inbounds [[CA01]], [[CA01]]* [[CA:%[^,]+]], i32 0, i32 0 4076 // CK25: store i32* [[VAL1]], i32** [[VALADDR1]], 4077 // CK25: call void {{.*}}[[LAMBDA]]{{.*}}([[CA01]]* [[CA]]) 4078 #endif 4079 ///==========================================================================/// 4080 // RUN: %clang_cc1 -DCK26 -std=c++11 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK26 --check-prefix CK26-64 4081 // RUN: %clang_cc1 -DCK26 -std=c++11 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 4082 // RUN: %clang_cc1 -fopenmp -std=c++11 -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 --check-prefix CK26 --check-prefix CK26-64 4083 // RUN: %clang_cc1 -DCK26 -std=c++11 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK26 --check-prefix CK26-32 4084 // RUN: %clang_cc1 -DCK26 -std=c++11 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 4085 // RUN: %clang_cc1 -fopenmp -std=c++11 -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK26 --check-prefix CK26-32 4086 #ifdef CK26 4087 // CK26: [[ST:%.+]] = type { i32, float*, i32, float* } 4088 4089 // CK26: [[SIZE00:@.+]] = private {{.*}}constant [2 x i[[Z:64|32]]] [i[[Z:64|32]] {{32|16}}, i[[Z:64|32]] 4] 4090 // CK26: [[MTYPE00:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35] 4091 4092 // CK26: [[SIZE01:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{32|16}}, i[[Z]] 4] 4093 // CK26: [[MTYPE01:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35] 4094 4095 // CK26: [[SIZE02:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{32|16}}, i[[Z]] 4] 4096 // CK26: [[MTYPE02:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35] 4097 4098 // CK26: [[SIZE03:@.+]] = private {{.*}}constant [2 x i[[Z]]] [i[[Z]] {{32|16}}, i[[Z]] 4] 4099 // CK26: [[MTYPE03:@.+]] = private {{.*}}constant [2 x i32] [i32 35, i32 35] 4100 4101 // CK26-LABEL: explicit_maps_with_private_class_members 4102 4103 struct CC { 4104 int fA; 4105 float &fB; 4106 int pA; 4107 float &pB; 4108 4109 CC(float &B) : fB(B), pB(B) { 4110 4111 // CK26: call {{.*}}@__kmpc_fork_call{{.*}} [[OUTCALL:@.+]] to void (i32*, i32*, ...)* 4112 // define {{.*}}void [[OUTCALL]] 4113 #pragma omp parallel firstprivate(fA,fB) private(pA,pB) 4114 { 4115 // Region 00 4116 // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE00]]{{.+}}) 4117 // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4118 // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4119 4120 // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4121 // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4122 // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4123 // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4124 // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 4125 // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8* 4126 4127 // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 4128 // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 4129 // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 4130 // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 4131 // CK26-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 4132 // CK26-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 4133 // CK26-DAG: [[VAR1]] = load i32*, i32** [[PVT:%.+]], 4134 // CK26-DAG: [[SEC1]] = load i32*, i32** [[PVT]], 4135 4136 // CK26: call void [[CALL00:@.+]]([[ST]]* {{[^,]+}}, i32* {{[^,]+}}) 4137 #pragma omp target map(fA) 4138 { 4139 ++fA; 4140 } 4141 4142 // Region 01 4143 // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE01]]{{.+}}) 4144 // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4145 // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4146 4147 // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4148 // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4149 // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4150 // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4151 // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 4152 // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8* 4153 4154 // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 4155 // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 4156 // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 4157 // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 4158 // CK26-DAG: [[CBPVAL1]] = bitcast float* [[VAR1:%.+]] to i8* 4159 // CK26-DAG: [[CPVAL1]] = bitcast float* [[SEC1:%.+]] to i8* 4160 // CK26-DAG: [[VAR1]] = load float*, float** [[PVT:%.+]], 4161 // CK26-DAG: [[SEC1]] = load float*, float** [[PVT]], 4162 4163 // CK26: call void [[CALL01:@.+]]([[ST]]* {{[^,]+}}, float* {{[^,]+}}) 4164 #pragma omp target map(fB) 4165 { 4166 fB += 1.0; 4167 } 4168 4169 // Region 02 4170 // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE02]]{{.+}}) 4171 // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4172 // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4173 4174 // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4175 // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4176 // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4177 // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4178 // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 4179 // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8* 4180 4181 // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 4182 // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 4183 // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 4184 // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 4185 // CK26-DAG: [[CBPVAL1]] = bitcast i32* [[VAR1:%.+]] to i8* 4186 // CK26-DAG: [[CPVAL1]] = bitcast i32* [[SEC1:%.+]] to i8* 4187 // CK26-DAG: [[VAR1]] = load i32*, i32** [[PVT:%.+]], 4188 // CK26-DAG: [[SEC1]] = load i32*, i32** [[PVT]], 4189 4190 // CK26: call void [[CALL02:@.+]]([[ST]]* {{[^,]+}}, i32* {{[^,]+}}) 4191 #pragma omp target map(pA) 4192 { 4193 ++pA; 4194 } 4195 4196 // Region 01 4197 // CK26-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE03]]{{.+}}) 4198 // CK26-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4199 // CK26-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4200 4201 // CK26-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4202 // CK26-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4203 // CK26-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4204 // CK26-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4205 // CK26-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8* 4206 // CK26-DAG: [[CPVAL0]] = bitcast [[ST]]* [[VAR0]] to i8* 4207 4208 // CK26-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1 4209 // CK26-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1 4210 // CK26-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]] 4211 // CK26-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]] 4212 // CK26-DAG: [[CBPVAL1]] = bitcast float* [[VAR1:%.+]] to i8* 4213 // CK26-DAG: [[CPVAL1]] = bitcast float* [[SEC1:%.+]] to i8* 4214 // CK26-DAG: [[VAR1]] = load float*, float** [[PVT:%.+]], 4215 // CK26-DAG: [[SEC1]] = load float*, float** [[PVT]], 4216 4217 // CK26: call void [[CALL03:@.+]]([[ST]]* {{[^,]+}}, float* {{[^,]+}}) 4218 #pragma omp target map(pB) 4219 { 4220 pB += 1.0; 4221 } 4222 } 4223 } 4224 4225 int foo() { 4226 return fA + pA; 4227 } 4228 }; 4229 4230 // Make sure the private instance is used in all target regions. 4231 // CK26: define {{.+}}[[CALL00]]({{.*}}i32*{{.*}}[[PVTARG:%.+]]) 4232 // CK26: store i32* [[PVTARG]], i32** [[PVTADDR:%.+]], 4233 // CK26: [[ADDR:%.+]] = load i32*, i32** [[PVTADDR]], 4234 // CK26: [[VAL:%.+]] = load i32, i32* [[ADDR]], 4235 // CK26: add nsw i32 [[VAL]], 1 4236 4237 // CK26: define {{.+}}[[CALL01]]({{.*}}float*{{.*}}[[PVTARG:%.+]]) 4238 // CK26: store float* [[PVTARG]], float** [[PVTADDR:%.+]], 4239 // CK26: [[ADDR:%.+]] = load float*, float** [[PVTADDR]], 4240 // CK26: [[VAL:%.+]] = load float, float* [[ADDR]], 4241 // CK26: [[EXT:%.+]] = fpext float [[VAL]] to double 4242 // CK26: fadd double [[EXT]], 1.000000e+00 4243 4244 // CK26: define {{.+}}[[CALL02]]({{.*}}i32*{{.*}}[[PVTARG:%.+]]) 4245 // CK26: store i32* [[PVTARG]], i32** [[PVTADDR:%.+]], 4246 // CK26: [[ADDR:%.+]] = load i32*, i32** [[PVTADDR]], 4247 // CK26: [[VAL:%.+]] = load i32, i32* [[ADDR]], 4248 // CK26: add nsw i32 [[VAL]], 1 4249 4250 // CK26: define {{.+}}[[CALL03]]({{.*}}float*{{.*}}[[PVTARG:%.+]]) 4251 // CK26: store float* [[PVTARG]], float** [[PVTADDR:%.+]], 4252 // CK26: [[ADDR:%.+]] = load float*, float** [[PVTADDR]], 4253 // CK26: [[VAL:%.+]] = load float, float* [[ADDR]], 4254 // CK26: [[EXT:%.+]] = fpext float [[VAL]] to double 4255 // CK26: fadd double [[EXT]], 1.000000e+00 4256 4257 int explicit_maps_with_private_class_members(){ 4258 float B; 4259 CC c(B); 4260 return c.foo(); 4261 } 4262 #endif 4263 ///==========================================================================/// 4264 // RUN: %clang_cc1 -DCK27 -verify -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK27 --check-prefix CK27-64 4265 // RUN: %clang_cc1 -DCK27 -fopenmp -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 4266 // RUN: %clang_cc1 -fopenmp -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 --check-prefix CK27 --check-prefix CK27-64 4267 // RUN: %clang_cc1 -DCK27 -verify -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK27 --check-prefix CK27-32 4268 // RUN: %clang_cc1 -DCK27 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 4269 // RUN: %clang_cc1 -fopenmp -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s --check-prefix CK27 --check-prefix CK27-32 4270 #ifdef CK27 4271 4272 // CK27: [[SIZE00:@.+]] = private {{.*}}constant [1 x i[[Z:64|32]]] zeroinitializer 4273 // CK27: [[MTYPE00:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 4274 4275 // CK27: [[SIZE01:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer 4276 // CK27: [[MTYPE01:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 4277 4278 // CK27: [[SIZE02:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer 4279 // CK27: [[MTYPE02:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 4280 4281 // CK27: [[SIZE03:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer 4282 // CK27: [[MTYPE03:@.+]] = private {{.*}}constant [1 x i32] [i32 35] 4283 4284 // CK27: [[SIZE05:@.+]] = private {{.*}}constant [1 x i[[Z]]] zeroinitializer 4285 // CK27: [[MTYPE05:@.+]] = private {{.*}}constant [1 x i32] [i32 32] 4286 4287 // CK27: [[SIZE07:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 4] 4288 // CK27: [[MTYPE07:@.+]] = private {{.*}}constant [1 x i32] [i32 288] 4289 4290 // CK27: [[SIZE09:@.+]] = private {{.*}}constant [1 x i[[Z]]] [i[[Z]] 40] 4291 // CK27: [[MTYPE09:@.+]] = private {{.*}}constant [1 x i32] [i32 161] 4292 4293 // CK27-LABEL: zero_size_section_and_private_maps 4294 void zero_size_section_and_private_maps (int ii){ 4295 4296 // Map of a pointer. 4297 int *pa; 4298 4299 // Region 00 4300 // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}}) 4301 // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4302 // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4303 4304 // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4305 // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4306 // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4307 // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4308 // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 4309 // CK27-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8* 4310 4311 // CK27: call void [[CALL00:@.+]](i32* {{[^,]+}}) 4312 #pragma omp target 4313 { 4314 pa[50]++; 4315 } 4316 4317 // Region 01 4318 // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE01]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE01]]{{.+}}) 4319 // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4320 // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4321 4322 // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4323 // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4324 // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4325 // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4326 // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 4327 // CK27-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 4328 // CK27-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 4329 // CK27-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0 4330 // CK27-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 4331 4332 // CK27: call void [[CALL01:@.+]](i32* {{[^,]+}}) 4333 #pragma omp target map(pa[:0]) 4334 { 4335 pa[50]++; 4336 } 4337 4338 // Region 02 4339 // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}}) 4340 // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4341 // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4342 4343 // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4344 // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4345 // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4346 // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4347 // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 4348 // CK27-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 4349 // CK27-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 4350 // CK27-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} 0 4351 // CK27-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 4352 4353 // CK27: call void [[CALL02:@.+]](i32* {{[^,]+}}) 4354 #pragma omp target map(pa[0:0]) 4355 { 4356 pa[50]++; 4357 } 4358 4359 // Region 03 4360 // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE03]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}}) 4361 // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4362 // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4363 4364 // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4365 // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4366 // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4367 // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4368 // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[RVAR0:%.+]] to i8* 4369 // CK27-DAG: [[CPVAL0]] = bitcast i32* [[SEC0:%.+]] to i8* 4370 // CK27-DAG: [[RVAR0]] = load i32*, i32** [[VAR0:%[^,]+]] 4371 // CK27-DAG: [[SEC0]] = getelementptr {{.*}}i32* [[RVAR00:%.+]], i{{.+}} %{{.+}} 4372 // CK27-DAG: [[RVAR00]] = load i32*, i32** [[VAR0]] 4373 4374 // CK27: call void [[CALL03:@.+]](i32* {{[^,]+}}) 4375 #pragma omp target map(pa[ii:0]) 4376 { 4377 pa[50]++; 4378 } 4379 4380 int *pvtPtr; 4381 int pvtScl; 4382 int pvtArr[10]; 4383 4384 // Region 04 4385 // CK27: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i32* null) 4386 // CK27: call void [[CALL04:@.+]]() 4387 #pragma omp target private(pvtPtr) 4388 { 4389 pvtPtr[5]++; 4390 } 4391 4392 // Region 05 4393 // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE05]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE05]]{{.+}}) 4394 // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4395 // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4396 4397 // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4398 // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4399 // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4400 // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4401 // CK27-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8* 4402 // CK27-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8* 4403 4404 // CK27: call void [[CALL05:@.+]](i32* {{[^,]+}}) 4405 #pragma omp target firstprivate(pvtPtr) 4406 { 4407 pvtPtr[5]++; 4408 } 4409 4410 // Region 06 4411 // CK27: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i32* null) 4412 // CK27: call void [[CALL06:@.+]]() 4413 #pragma omp target private(pvtScl) 4414 { 4415 pvtScl++; 4416 } 4417 4418 // Region 07 4419 // CK27-DAG: call i32 @__tgt_target(i32 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZE07]]{{.+}}, {{.+}}[[MTYPE07]]{{.+}}) 4420 // CK27-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0 4421 // CK27-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0 4422 // CK27-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0 4423 // CK27-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0 4424 // CK27-DAG: store i8* [[VALBP:%.+]], i8** [[BP1]], 4425 // CK27-DAG: store i8* [[VALP:%.+]], i8** [[P1]], 4426 // CK27-DAG: [[VALBP]] = inttoptr i[[Z]] [[VAL:%.+]] to i8* 4427 // CK27-DAG: [[VALP]] = inttoptr i[[Z]] [[VAL:%.+]] to i8* 4428 // CK27-DAG: [[VAL]] = load i[[Z]], i[[Z]]* [[ADDR:%.+]], 4429 // CK27-64-DAG: [[CADDR:%.+]] = bitcast i[[Z]]* [[ADDR]] to i32* 4430 // CK27-64-DAG: store i32 {{.+}}, i32* [[CADDR]], 4431 4432 // CK27: call void [[CALL07:@.+]](i[[Z]] [[VAL]]) 4433 #pragma omp target firstprivate(pvtScl) 4434 { 4435 pvtScl++; 4436 } 4437 4438 // Region 08 4439 // CK27: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 0, i8** null, i8** null, i{{64|32}}* null, i32* null) 4440 // CK27: call void [[CALL08:@.+]]() 4441 #pragma omp target private(pvtArr) 4442 { 4443 pvtArr[5]++; 4444 } 4445 4446 // Region 09 4447 // CK27-DAG: call i32 @__tgt_target(i32 {{[^,]+}}, i8* {{[^,]+}}, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE09]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE09]]{{.+}}) 4448 // CK27-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]] 4449 // CK27-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]] 4450 4451 // CK27-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0 4452 // CK27-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0 4453 // CK27-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]] 4454 // CK27-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]] 4455 // CK27-DAG: [[CBPVAL0]] = bitcast [10 x i32]* [[VAR0:%.+]] to i8* 4456 // CK27-DAG: [[CPVAL0]] = bitcast [10 x i32]* [[VAR0]] to i8* 4457 4458 // CK27: call void [[CALL09:@.+]]([10 x i32]* {{[^,]+}}) 4459 #pragma omp target firstprivate(pvtArr) 4460 { 4461 pvtArr[5]++; 4462 } 4463 } 4464 4465 // CK27: define {{.+}}[[CALL00]] 4466 // CK27: define {{.+}}[[CALL01]] 4467 // CK27: define {{.+}}[[CALL02]] 4468 // CK27: define {{.+}}[[CALL03]] 4469 // CK27: define {{.+}}[[CALL04]] 4470 // CK27: define {{.+}}[[CALL05]] 4471 // CK27: define {{.+}}[[CALL06]] 4472 // CK27: define {{.+}}[[CALL07]] 4473 #endif 4474 #endif 4475