forked from OSchip/llvm-project
[OPENMP]Fix PR46688: cast the type of the allocated variable to the initial one.
Summary: If the original variable is marked for allocation in the different address space using #pragma omp allocate, need to cast the allocated variable to its original type with the original address space. Otherwise, the compiler may crash trying to bitcast the type of the new allocated variable to the original type in some cases, like passing this variable as an argument in function calls. Reviewers: jdoerfert Subscribers: jholewinski, cfe-commits, yaxunl, guansong, caomhin Tags: #clang Differential Revision: https://reviews.llvm.org/D83696
This commit is contained in:
parent
30c382a7c6
commit
9dc327d1b7
|
@ -4770,6 +4770,7 @@ Address CGOpenMPRuntimeNVPTX::getAddressOfLocalVariable(CodeGenFunction &CGF,
|
|||
const VarDecl *VD) {
|
||||
if (VD && VD->hasAttr<OMPAllocateDeclAttr>()) {
|
||||
const auto *A = VD->getAttr<OMPAllocateDeclAttr>();
|
||||
auto AS = LangAS::Default;
|
||||
switch (A->getAllocatorType()) {
|
||||
// Use the default allocator here as by default local vars are
|
||||
// threadlocal.
|
||||
|
@ -4783,42 +4784,30 @@ Address CGOpenMPRuntimeNVPTX::getAddressOfLocalVariable(CodeGenFunction &CGF,
|
|||
case OMPAllocateDeclAttr::OMPUserDefinedMemAlloc:
|
||||
// TODO: implement aupport for user-defined allocators.
|
||||
return Address::invalid();
|
||||
case OMPAllocateDeclAttr::OMPConstMemAlloc: {
|
||||
llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
|
||||
auto *GV = new llvm::GlobalVariable(
|
||||
CGM.getModule(), VarTy, /*isConstant=*/false,
|
||||
llvm::GlobalValue::InternalLinkage,
|
||||
llvm::Constant::getNullValue(VarTy), VD->getName(),
|
||||
/*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal,
|
||||
CGM.getContext().getTargetAddressSpace(LangAS::cuda_constant));
|
||||
CharUnits Align = CGM.getContext().getDeclAlign(VD);
|
||||
GV->setAlignment(Align.getAsAlign());
|
||||
return Address(GV, Align);
|
||||
}
|
||||
case OMPAllocateDeclAttr::OMPPTeamMemAlloc: {
|
||||
llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
|
||||
auto *GV = new llvm::GlobalVariable(
|
||||
CGM.getModule(), VarTy, /*isConstant=*/false,
|
||||
llvm::GlobalValue::InternalLinkage,
|
||||
llvm::Constant::getNullValue(VarTy), VD->getName(),
|
||||
/*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal,
|
||||
CGM.getContext().getTargetAddressSpace(LangAS::cuda_shared));
|
||||
CharUnits Align = CGM.getContext().getDeclAlign(VD);
|
||||
GV->setAlignment(Align.getAsAlign());
|
||||
return Address(GV, Align);
|
||||
}
|
||||
case OMPAllocateDeclAttr::OMPConstMemAlloc:
|
||||
AS = LangAS::cuda_constant;
|
||||
break;
|
||||
case OMPAllocateDeclAttr::OMPPTeamMemAlloc:
|
||||
AS = LangAS::cuda_shared;
|
||||
break;
|
||||
case OMPAllocateDeclAttr::OMPLargeCapMemAlloc:
|
||||
case OMPAllocateDeclAttr::OMPCGroupMemAlloc: {
|
||||
llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
|
||||
auto *GV = new llvm::GlobalVariable(
|
||||
CGM.getModule(), VarTy, /*isConstant=*/false,
|
||||
llvm::GlobalValue::InternalLinkage,
|
||||
llvm::Constant::getNullValue(VarTy), VD->getName());
|
||||
CharUnits Align = CGM.getContext().getDeclAlign(VD);
|
||||
GV->setAlignment(Align.getAsAlign());
|
||||
return Address(GV, Align);
|
||||
}
|
||||
case OMPAllocateDeclAttr::OMPCGroupMemAlloc:
|
||||
break;
|
||||
}
|
||||
llvm::Type *VarTy = CGF.ConvertTypeForMem(VD->getType());
|
||||
auto *GV = new llvm::GlobalVariable(
|
||||
CGM.getModule(), VarTy, /*isConstant=*/false,
|
||||
llvm::GlobalValue::InternalLinkage, llvm::Constant::getNullValue(VarTy),
|
||||
VD->getName(),
|
||||
/*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal,
|
||||
CGM.getContext().getTargetAddressSpace(AS));
|
||||
CharUnits Align = CGM.getContext().getDeclAlign(VD);
|
||||
GV->setAlignment(Align.getAsAlign());
|
||||
return Address(
|
||||
CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
|
||||
GV, VarTy->getPointerTo(CGM.getContext().getTargetAddressSpace(
|
||||
VD->getType().getAddressSpace()))),
|
||||
Align);
|
||||
}
|
||||
|
||||
if (getDataSharingMode(CGM) != CGOpenMPRuntimeNVPTX::Generic)
|
||||
|
|
|
@ -101,7 +101,7 @@ void bar() {
|
|||
// CHECK: alloca float,
|
||||
// CHECK-NOT: alloca double,
|
||||
// CHECK: load float, float* %
|
||||
// CHECK: store double {{.+}}, double addrspace(3)* @bar_b,
|
||||
// CHECK: store double {{.+}}, double* addrspacecast (double addrspace(3)* @bar_b to double*),
|
||||
}
|
||||
|
||||
#pragma omp end declare target
|
||||
|
|
Loading…
Reference in New Issue