192327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix HOST --check-prefix CHECK
292327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
392327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix DEVICE --check-prefix CHECK
492327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t
592327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - | FileCheck %s --check-prefix DEVICE --check-prefix CHECK
692327c50SAlexey Bataev 
792327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix SIMD-ONLY
892327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm-bc %s -o %t-ppc-host.bc
992327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o -| FileCheck %s --check-prefix SIMD-ONLY
1092327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t
1192327c50SAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -verify -o - | FileCheck %s --check-prefix SIMD-ONLY
1292327c50SAlexey Bataev 
1392327c50SAlexey Bataev // expected-no-diagnostics
1492327c50SAlexey Bataev 
1592327c50SAlexey Bataev // SIMD-ONLY-NOT: {{__kmpc|__tgt}}
1692327c50SAlexey Bataev 
1792327c50SAlexey Bataev #ifndef HEADER
1892327c50SAlexey Bataev #define HEADER
1992327c50SAlexey Bataev 
20d01b7497SAlexey Bataev // HOST-DAG: @c = external global i32,
21d01b7497SAlexey Bataev // HOST-DAG: @c_decl_tgt_link_ptr = global i32* @c
2292327c50SAlexey Bataev // DEVICE-NOT: @c =
2303f270c9SAlexey Bataev // DEVICE: @c_decl_tgt_link_ptr = common global i32* null
2492327c50SAlexey Bataev // HOST: [[SIZES:@.+]] = private unnamed_addr constant [2 x i64] [i64 4, i64 4]
2592327c50SAlexey Bataev // HOST: [[MAPTYPES:@.+]] = private unnamed_addr constant [2 x i64] [i64 35, i64 531]
26c52f01d1SAlexey Bataev // HOST: @.omp_offloading.entry_name{{.*}} = internal unnamed_addr constant [{{[0-9]+}} x i8] c"c_decl_tgt_link_ptr\00"
27c52f01d1SAlexey Bataev // HOST: @.omp_offloading.entry.c_decl_tgt_link_ptr = weak constant %struct.__tgt_offload_entry { i8* bitcast (i32** @c_decl_tgt_link_ptr to i8*), i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.omp_offloading.entry_name, i32 0, i32 0), i64 8, i32 1, i32 0 }, section ".omp_offloading.entries", align 1
28c52f01d1SAlexey Bataev // DEVICE-NOT: internal unnamed_addr constant [{{[0-9]+}} x i8] c"c_decl_tgt_link_ptr\00"
2992327c50SAlexey Bataev // CHECK: @llvm.used = appending global [1 x i8*] [i8* bitcast (i32** @c_decl_tgt_link_ptr to i8*)]
3092327c50SAlexey Bataev 
3192327c50SAlexey Bataev extern int c;
3292327c50SAlexey Bataev #pragma omp declare target link(c)
3392327c50SAlexey Bataev 
3492327c50SAlexey Bataev int maini1() {
3592327c50SAlexey Bataev   int a;
3692327c50SAlexey Bataev #pragma omp target map(tofrom : a)
3792327c50SAlexey Bataev   {
3892327c50SAlexey Bataev     a = c;
3992327c50SAlexey Bataev   }
40*a495c640SAlexey Bataev #pragma omp target
41*a495c640SAlexey Bataev #pragma omp teams
42*a495c640SAlexey Bataev   c = a;
4392327c50SAlexey Bataev   return 0;
4492327c50SAlexey Bataev }
4592327c50SAlexey Bataev 
46*a495c640SAlexey Bataev // DEVICE: define weak void @__omp_offloading_{{.*}}_{{.*}}maini1{{.*}}_l[[@LINE-10]](i32* dereferenceable{{[^,]*}}
4792327c50SAlexey Bataev // DEVICE: [[C_REF:%.+]] = load i32*, i32** @c_decl_tgt_link_ptr,
4892327c50SAlexey Bataev // DEVICE: [[C:%.+]] = load i32, i32* [[C_REF]],
4992327c50SAlexey Bataev // DEVICE: store i32 [[C]], i32* %
5092327c50SAlexey Bataev 
5192327c50SAlexey Bataev // HOST: define {{.*}}i32 @{{.*}}maini1{{.*}}()
5292327c50SAlexey Bataev // HOST: [[BASEPTRS:%.+]] = alloca [2 x i8*],
5392327c50SAlexey Bataev // HOST: [[PTRS:%.+]] = alloca [2 x i8*],
5492327c50SAlexey Bataev // HOST: getelementptr inbounds [2 x i8*], [2 x i8*]* [[BASEPTRS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
5592327c50SAlexey Bataev // HOST: getelementptr inbounds [2 x i8*], [2 x i8*]* [[PTRS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
5692327c50SAlexey Bataev // HOST: [[BP1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BASEPTRS]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
5792327c50SAlexey Bataev // HOST: [[BP1_CAST:%.+]] = bitcast i8** [[BP1]] to i32***
5892327c50SAlexey Bataev // HOST: store i32** @c_decl_tgt_link_ptr, i32*** [[BP1_CAST]],
5992327c50SAlexey Bataev // HOST: [[P1:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[PTRS]], i{{[0-9]+}} 0, i{{[0-9]+}} 1
6092327c50SAlexey Bataev // HOST: [[P1_CAST:%.+]] = bitcast i8** [[P1]] to i32**
6192327c50SAlexey Bataev // HOST: store i32* @c, i32** [[P1_CAST]],
6292327c50SAlexey Bataev // HOST: [[BP0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[BASEPTRS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
6392327c50SAlexey Bataev // HOST: [[P0:%.+]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[PTRS]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
6492327c50SAlexey Bataev // HOST: call i32 @__tgt_target(i64 -1, i8* @{{[^,]+}}, i32 2, i8** [[BP0]], i8** [[P0]], i64* getelementptr inbounds ([2 x i64], [2 x i64]* [[SIZES]], i{{[0-9]+}} 0, i{{[0-9]+}} 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* [[MAPTYPES]], i{{[0-9]+}} 0, i{{[0-9]+}} 0))
65*a495c640SAlexey Bataev // HOST: call void @__omp_offloading_{{.*}}_{{.*}}maini1{{.*}}_l[[@LINE-29]](i32* %{{[^,]+}})
66*a495c640SAlexey Bataev // HOST: call i32 @__tgt_target_teams(i64 -1, i8* @.__omp_offloading_{{.+}}_l40.region_id, i32 2, {{.+}})
6792327c50SAlexey Bataev 
68*a495c640SAlexey Bataev // HOST: define internal void @__omp_offloading_{{.*}}_{{.*}}maini1{{.*}}_l[[@LINE-32]](i32* dereferenceable{{.*}})
6992327c50SAlexey Bataev // HOST: [[C:%.*]] = load i32, i32* @c,
7092327c50SAlexey Bataev // HOST: store i32 [[C]], i32* %
7192327c50SAlexey Bataev 
72c52f01d1SAlexey Bataev // CHECK: !{i32 1, !"c_decl_tgt_link_ptr", i32 1, i32 {{[0-9]+}}}
7392327c50SAlexey Bataev #endif // HEADER
74