Skip to content

Commit

Permalink
[openmp] Add addrspacecast to getOrCreateIdent
Browse files Browse the repository at this point in the history
Fixes 51982. Adds a missing CreatePointerCast and allocates a global in
the correct address space.

Test case derived from https://github.com/ROCm-Developer-Tools/aomp/\
blob/aomp-dev/test/smoke/nest_call_par2/nest_call_par2.c by deleting
parts while checking the assertion failure still occurred.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D110556
  • Loading branch information
JonChesterfield committed Sep 30, 2021
1 parent b75a748 commit 3247329
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
21 changes: 13 additions & 8 deletions llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,15 +276,20 @@ Value *OpenMPIRBuilder::getOrCreateIdent(Constant *SrcLocStr,
for (GlobalVariable &GV : M.getGlobalList())
if (GV.getValueType() == OpenMPIRBuilder::Ident && GV.hasInitializer())
if (GV.getInitializer() == Initializer)
return Ident = &GV;

auto *GV = new GlobalVariable(M, OpenMPIRBuilder::Ident,
/* isConstant = */ true,
GlobalValue::PrivateLinkage, Initializer);
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
GV->setAlignment(Align(8));
Ident = GV;
Ident = &GV;

if (!Ident) {
auto *GV = new GlobalVariable(
M, OpenMPIRBuilder::Ident,
/* isConstant = */ true, GlobalValue::PrivateLinkage, Initializer, "",
nullptr, GlobalValue::NotThreadLocal,
M.getDataLayout().getDefaultGlobalsAddressSpace());
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
GV->setAlignment(Align(8));
Ident = GV;
}
}

return Builder.CreatePointerCast(Ident, IdentPtr);
}

Expand Down
24 changes: 24 additions & 0 deletions openmp/libomptarget/test/offloading/bug51982.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// RUN: %libomptarget-compile-generic -O1 && %libomptarget-run-generic
// -O1 to run openmp-opt

int main(void) {
long int aa = 0;

int ng = 12;
int nxyz = 5;

const long exp = ng * nxyz;

#pragma omp target map(tofrom : aa)
for (int gid = 0; gid < nxyz; gid++) {
#pragma omp parallel for
for (unsigned int g = 0; g < ng; g++) {
#pragma omp atomic
aa += 1;
}
}
if (aa != exp) {
return 1;
}
return 0;
}

0 comments on commit 3247329

Please sign in to comment.