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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 12 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 15 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 20 // CK1-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 57 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 60 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 65 // CK2-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 106 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 109 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 114 // CK3-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 150 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 153 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 158 // CK4-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 206 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 209 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 214 // CK5-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 257 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 260 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 265 // CK6-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 303 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 306 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 314 // CK7-64-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 315 // Map types: OMP_MAP_TO = 1 316 // CK7-32-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 1] 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 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK8 364 // RUN: %clang_cc1 -DCK8 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 365 // RUN: %clang_cc1 -fopenmp -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 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK8 367 // RUN: %clang_cc1 -DCK8 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 368 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 373 // CK8-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK9 408 // RUN: %clang_cc1 -DCK9 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 409 // RUN: %clang_cc1 -fopenmp -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 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK9 411 // RUN: %clang_cc1 -DCK9 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 412 // RUN: %clang_cc1 -fopenmp -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 = 2 + 1 417 // CK9-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 3] 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 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK10 449 // RUN: %clang_cc1 -DCK10 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 450 // RUN: %clang_cc1 -fopenmp -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 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK10 452 // RUN: %clang_cc1 -DCK10 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 453 // RUN: %clang_cc1 -fopenmp -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]]] [i{{64|32}} {{8|4}}] 457 // Map types: OMP_MAP_BYCOPY | OMP_MAP_PTR = 128 + 32 458 // CK10-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 160] 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 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK11 491 // RUN: %clang_cc1 -DCK11 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 492 // RUN: %clang_cc1 -fopenmp -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 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK11 494 // RUN: %clang_cc1 -DCK11 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 495 // RUN: %clang_cc1 -fopenmp -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 = 1 500 // CK11-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 1] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 532 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 535 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 543 // CK12-64-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 544 // Map types: OMP_MAP_TO = 1 545 // CK12-32-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 1] 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 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK13 592 // RUN: %clang_cc1 -DCK13 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 593 // RUN: %clang_cc1 -fopenmp -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 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK13 595 // RUN: %clang_cc1 -DCK13 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 596 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 (vla size) 602 // - OMP_MAP_BYCOPY = 128 (vla size) 603 // - OMP_MAP_TO + OMP_MAP_FROM = 2 + 1 604 // CK13-DAG: [[TYPES:@.+]] = {{.+}}constant [3 x i32] [i32 128, i32 128, i32 3] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 663 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 666 // RUN: %clang_cc1 -fopenmp -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 = 1 + 2 673 // - OMP_MAP_BYCOPY = 128 674 // CK14-DAG: [[TYPES:@.+]] = {{.+}}constant [2 x i32] [i32 3, i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 737 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 740 // RUN: %clang_cc1 -fopenmp -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 = 1 + 2 747 // - OMP_MAP_BYCOPY = 128 748 // CK15: [[TYPES:@.+]] = {{.+}}constant [2 x i32] [i32 3, i32 128] 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 = 1 + 2 753 // - OMP_MAP_BYCOPY = 128 754 // CK15: [[TYPES2:@.+]] = {{.+}}constant [2 x i32] [i32 3, i32 128] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 865 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 868 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 874 // CK16-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK17 917 // RUN: %clang_cc1 -DCK17 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 918 // RUN: %clang_cc1 -fopenmp -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 -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s --check-prefix CK17 920 // RUN: %clang_cc1 -DCK17 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 921 // RUN: %clang_cc1 -fopenmp -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 = 2 + 1 927 // CK17-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 3] 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 -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 -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s 966 // RUN: %clang_cc1 -fopenmp -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 -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 -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s 969 // RUN: %clang_cc1 -fopenmp -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_BYCOPY = 128 975 // CK18-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i32] [i32 128] 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 #endif 1016