14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// expected-no-diagnostics
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifndef HEADER
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define HEADER
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///==========================================================================///
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifdef CK1
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[ST:%.+]] = type { i32, double* }
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T>
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ST {
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T a;
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  double *b;
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarST<int> gb;
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainardouble gc[100];
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[SIZE00:@.+]] = {{.+}}constant [1 x i[[sz:64|32]]] [i{{64|32}} 800]
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[MTYPE00:@.+]] = {{.+}}constant [1 x i32] [i32 34]
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[SIZE02:@.+]] = {{.+}}constant [1 x i[[sz]]] [i[[sz]] 4]
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[MTYPE02:@.+]] = {{.+}}constant [1 x i32] [i32 32]
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[MTYPE03:@.+]] = {{.+}}constant [1 x i32] [i32 38]
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[SIZE04:@.+]] = {{.+}}constant [2 x i[[sz]]] [i[[sz]] {{8|4}}, i[[sz]] 24]
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1: [[MTYPE04:@.+]] = {{.+}}constant [2 x i32] [i32 32, i32 16]
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK1-LABEL: _Z3fooi
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid foo(int arg) {
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int la;
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  float lb[arg];
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Region 00
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-NOT: __tgt_target_data_begin
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: call void @__tgt_target_data_end(i32 [[DEV:%[^,]+]], i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE00]]{{.+}})
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* bitcast ([100 x double]* @gc to i8*), i8** [[BP0]]
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* bitcast ([100 x double]* @gc to i8*), i8** [[P0]]
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp target exit data if(1+3-5) device(arg) map(from: gc)
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Region 01
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp target exit data map(release: la) if(1+3-4)
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Region 02
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-NOT: __tgt_target_data_begin
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: [[IFTHEN]]
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: call void @__tgt_target_data_end(i32 4, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[SIZE02]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE02]]{{.+}})
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[CBPVAL0]] = bitcast i32* [[VAR0:%.+]] to i8*
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[CPVAL0]] = bitcast i32* [[VAR0]] to i8*
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: br label %[[IFEND:[^,]+]]
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: [[IFELSE]]
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: br label %[[IFEND]]
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: [[IFEND]]
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp target exit data map(release: arg) if(arg) device(4)
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Region 03
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-NOT: __tgt_target_data_begin
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: call void @__tgt_target_data_end(i32 -1, i32 1, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], i[[sz]]* [[GEPS:%.+]], {{.+}}getelementptr {{.+}}[1 x i{{.+}}]* [[MTYPE03]]{{.+}})
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPS]] = getelementptr inbounds {{.+}}[[S:%[^,]+]]
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[S0:%.+]] = getelementptr inbounds {{.+}}[[S]], i{{.+}} 0, i{{.+}} 0
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i[[sz]] [[CSVAL0:%[^,]+]], i[[sz]]* [[S0]]
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[CBPVAL0]] = bitcast float* [[VAR0:%.+]] to i8*
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[CPVAL0]] = bitcast float* [[VAR0]] to i8*
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[CSVAL0]] = mul nuw i[[sz]] %{{[^,]+}}, 4
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp target exit data map(always, from: lb)
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Region 04
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-NOT: __tgt_target_data_begin
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: call void @__tgt_target_data_end(i32 -1, i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE04]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE04]]{{.+}})
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* bitcast ([[ST]]* @gb to i8*), i8** [[BP0]]
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* bitcast (double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1) to i8*), i8** [[P0]]
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* bitcast (double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1) to i8*), i8** [[BP1]]
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[CPVAL1]] = bitcast double* [[SEC1:%.+]] to i8*
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[SEC1]] = getelementptr inbounds {{.+}}double* [[SEC11:%[^,]+]], i{{.+}} 0
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1-DAG: [[SEC11]] = load double*, double** getelementptr inbounds ([[ST]], [[ST]]* @gb, i32 0, i32 1),
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK1: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp target exit data map(release: gb.b[:3])
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///==========================================================================///
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifdef CK2
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: [[ST:%.+]] = type { i32, double* }
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T>
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct ST {
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T a;
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  double *b;
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T foo(T arg) {
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Region 00
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    #pragma omp target exit data map(always, release: b[1:3]) if(a>123) device(arg)
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    {arg++;}
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return arg;
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: [[SIZE00:@.+]] = {{.+}}constant [2 x i[[sz:64|32]]] [i{{64|32}} {{8|4}}, i{{64|32}} 24]
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: [[MTYPE00:@.+]] = {{.+}}constant [2 x i32] [i32 36, i32 20]
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-LABEL: _Z3bari
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarint bar(int arg){
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ST<int> A;
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return A.foo(arg);
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Region 00
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-NOT: __tgt_target_data_begin
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: br i1 %{{[^,]+}}, label %[[IFTHEN:[^,]+]], label %[[IFELSE:[^,]+]]
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: [[IFTHEN]]
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: call void @__tgt_target_data_end(i32 [[DEV:%[^,]+]], i32 2, i8** [[GEPBP:%.+]], i8** [[GEPP:%.+]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[SIZE00]], {{.+}}getelementptr {{.+}}[2 x i{{.+}}]* [[MTYPE00]]{{.+}})
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[DEV]] = load i32, i32* %{{[^,]+}},
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[GEPBP]] = getelementptr inbounds {{.+}}[[BP:%[^,]+]]
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[GEPP]] = getelementptr inbounds {{.+}}[[P:%[^,]+]]
1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[BP0:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 0
1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[P0:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 0
1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: store i8* [[CBPVAL0:%[^,]+]], i8** [[BP0]]
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: store i8* [[CPVAL0:%[^,]+]], i8** [[P0]]
1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[CBPVAL0]] = bitcast [[ST]]* [[VAR0:%.+]] to i8*
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[CPVAL0]] = bitcast double** [[SEC0:%[^,]+]] to i8*
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[SEC0]] = getelementptr inbounds {{.*}}[[ST]]* [[VAR0]], i32 0, i32 1
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BP]], i{{.+}} 0, i{{.+}} 1
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[P]], i{{.+}} 0, i{{.+}} 1
1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: store i8* [[CBPVAL1:%[^,]+]], i8** [[BP1]]
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: store i8* [[CPVAL1:%[^,]+]], i8** [[P1]]
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[CBPVAL1]] = bitcast double** [[SEC0]] to i8*
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[CPVAL1]] = bitcast double* [[SEC1:%[^,]+]] to i8*
1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[SEC1]] = getelementptr inbounds {{.*}}double* [[SEC11:%[^,]+]], i{{.+}} 1
1924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[SEC11]] = load double*, double** [[SEC111:%[^,]+]],
1934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2-DAG: [[SEC111]] = getelementptr inbounds {{.*}}[[ST]]* [[VAR0]], i32 0, i32 1
1944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: br label %[[IFEND:[^,]+]]
1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: [[IFELSE]]
1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: br label %[[IFEND]]
1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: [[IFEND]]
2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK2: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
2014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
2024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar///==========================================================================///
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -DCK3 -verify -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s  --check-prefix CK3 --check-prefix CK3-32
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 -DCK3 -fopenmp -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifdef CK3
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CK3-LABEL: no_target_devices
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid no_target_devices(int arg) {
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK3-NOT: tgt_target_data_begin
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK3: %{{.+}} = add nsw i32 %{{[^,]+}}, 1
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK3-NOT: tgt_target_data_end
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // CK3: ret
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  #pragma omp target exit data map(from: arg) if(arg) device(4)
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {++arg;}
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif
222