forked from OSchip/llvm-project
[OPENMP]Fix codegen for is_device_ptr component, captured by reference.
Need to map the component as TO instead of the literal, because need to pass a reference to a component if the pointer is overaligned. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D84887
This commit is contained in:
parent
609f5e050c
commit
9e3842d603
|
@ -8460,10 +8460,12 @@ public:
|
|||
if (DevPointersMap.count(VD)) {
|
||||
CombinedInfo.BasePointers.emplace_back(Arg, VD);
|
||||
CombinedInfo.Pointers.push_back(Arg);
|
||||
CombinedInfo.Sizes.push_back(
|
||||
CGF.Builder.CreateIntCast(CGF.getTypeSize(CGF.getContext().VoidPtrTy),
|
||||
CGF.Int64Ty, /*isSigned=*/true));
|
||||
CombinedInfo.Types.push_back(OMP_MAP_LITERAL | OMP_MAP_TARGET_PARAM);
|
||||
CombinedInfo.Sizes.push_back(CGF.Builder.CreateIntCast(
|
||||
CGF.getTypeSize(CGF.getContext().VoidPtrTy), CGF.Int64Ty,
|
||||
/*isSigned=*/true));
|
||||
CombinedInfo.Types.push_back(
|
||||
(Cap->capturesVariable() ? OMP_MAP_TO : OMP_MAP_LITERAL) |
|
||||
OMP_MAP_TARGET_PARAM);
|
||||
CombinedInfo.Mappers.push_back(nullptr);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -285,4 +285,41 @@ void bar(double *arg){
|
|||
++arg;
|
||||
}
|
||||
#endif
|
||||
///==========================================================================///
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
|
||||
// RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s
|
||||
// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -std=c++11 -triple powerpc64le-unknown-unknown -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-targets=powerpc64le-ibm-linux-gnu -x c++ -triple powerpc64le-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
|
||||
// RUN: %clang_cc1 -DCK3 -verify -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY1 %s
|
||||
// RUN: %clang_cc1 -DCK3 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -std=c++11 -triple i386-unknown-unknown -emit-pch -o %t %s
|
||||
// RUN: %clang_cc1 -fopenmp-simd -fopenmp-targets=i386-pc-linux-gnu -x c++ -triple i386-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY1 %s
|
||||
// SIMD-ONLY1-NOT: {{__kmpc|__tgt}}
|
||||
#ifdef CK3
|
||||
|
||||
// CK3-DAG: [[SIZES:@.+]] = {{.+}}constant [1 x i[[SZ:64|32]]] [i{{64|32}} {{8|4}}]
|
||||
// OMP_MAP_TARGET_PARAM = 0x20 | OMP_MAP_TO = 0x1 = 0x21
|
||||
// CK3-DAG: [[TYPES:@.+]] = {{.+}}constant [1 x i64] [i64 [[#0x21]]]
|
||||
void bar() {
|
||||
__attribute__((aligned(64))) double *ptr;
|
||||
// CK3-DAG: call i32 @__tgt_target_mapper(i64 {{.+}}, i8* {{.+}}, i32 1, i8** [[BPGEP:%[0-9]+]], i8** [[PGEP:%[0-9]+]], {{.+}}[[SIZES]]{{.+}}, {{.+}}[[TYPES]]{{.+}}, i8** null)
|
||||
// CK3-DAG: [[BPGEP]] = getelementptr inbounds {{.+}}[[BPS:%[^,]+]], i32 0, i32 0
|
||||
// CK3-DAG: [[PGEP]] = getelementptr inbounds {{.+}}[[PS:%[^,]+]], i32 0, i32 0
|
||||
// CK3-DAG: [[BP1:%.+]] = getelementptr inbounds {{.+}}[[BPS]], i32 0, i32 0
|
||||
// CK3-DAG: [[P1:%.+]] = getelementptr inbounds {{.+}}[[PS]], i32 0, i32 0
|
||||
// CK3-DAG: [[CBP1:%.+]] = bitcast i8** [[BP1]] to double***
|
||||
// CK3-DAG: [[CP1:%.+]] = bitcast i8** [[P1]] to double***
|
||||
// CK3-DAG: store double** [[PTR:%.+]], double*** [[CBP1]]
|
||||
// CK3-DAG: store double** [[PTR]], double*** [[CP1]]
|
||||
|
||||
// CK3: call void [[KERNEL:@.+]](double** [[PTR]])
|
||||
#pragma omp target is_device_ptr(ptr)
|
||||
*ptr = 0;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue