[clang] c384e79 - [OpenMP][IR] Set correct alignment for internal variables
via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 11 12:21:34 PDT 2023
Author: Hao Jin
Date: 2023-08-11T15:20:15-04:00
New Revision: c384e79675fe44cd2651dbd9d506d0a421c37533
URL: https://github.com/llvm/llvm-project/commit/c384e79675fe44cd2651dbd9d506d0a421c37533
DIFF: https://github.com/llvm/llvm-project/commit/c384e79675fe44cd2651dbd9d506d0a421c37533.diff
LOG: [OpenMP][IR] Set correct alignment for internal variables
OpenMP runtime functions assume the pointers are aligned to sizeof(pointer),
but it is being aligned incorrectly. Fix with the proper alignment in the IR builder.
Reviewed By: tianshilei1992
Differential Revision: https://reviews.llvm.org/D157040
Added:
Modified:
clang/lib/CodeGen/CGOpenMPRuntime.cpp
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 02410c4d2b4250..fad8faad68c479 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -2161,11 +2161,7 @@ Address CGOpenMPRuntime::emitThreadIDAddress(CodeGenFunction &CGF,
llvm::Value *CGOpenMPRuntime::getCriticalRegionLock(StringRef CriticalName) {
std::string Prefix = Twine("gomp_critical_user_", CriticalName).str();
std::string Name = getName({Prefix, "var"});
- llvm::GlobalVariable *G = OMPBuilder.getOrCreateInternalVariable(KmpCriticalNameTy, Name);
- llvm::Align PtrAlign = OMPBuilder.M.getDataLayout().getPointerABIAlignment(G->getAddressSpace());
- if (PtrAlign > llvm::Align(G->getAlignment()))
- G->setAlignment(PtrAlign);
- return G;
+ return OMPBuilder.getOrCreateInternalVariable(KmpCriticalNameTy, Name);
}
namespace {
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 1694df8f482e67..3eedef17b0d080 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4493,7 +4493,10 @@ OpenMPIRBuilder::getOrCreateInternalVariable(Type *Ty, const StringRef &Name,
M, Ty, /*IsConstant=*/false, GlobalValue::CommonLinkage,
Constant::getNullValue(Ty), Elem.first(),
/*InsertBefore=*/nullptr, GlobalValue::NotThreadLocal, AddressSpace);
- GV->setAlignment(M.getDataLayout().getABITypeAlign(Ty));
+ const DataLayout &DL = M.getDataLayout();
+ const llvm::Align TypeAlign = DL.getABITypeAlign(Ty);
+ const llvm::Align PtrAlign = DL.getPointerABIAlignment(AddressSpace);
+ GV->setAlignment(std::max(TypeAlign, PtrAlign));
Elem.second = GV;
}
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index 51af5eb392f5ae..0ec7b751be60e3 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -2744,7 +2744,15 @@ TEST_F(OpenMPIRBuilderTest, CriticalDirective) {
PointerType *CriticalNamePtrTy =
PointerType::getUnqual(ArrayType::get(Type::getInt32Ty(Ctx), 8));
EXPECT_EQ(CriticalEndCI->getArgOperand(2), CriticalEntryCI->getArgOperand(2));
- EXPECT_EQ(CriticalEndCI->getArgOperand(2)->getType(), CriticalNamePtrTy);
+ GlobalVariable *GV =
+ dyn_cast<GlobalVariable>(CriticalEndCI->getArgOperand(2));
+ ASSERT_NE(GV, nullptr);
+ EXPECT_EQ(GV->getType(), CriticalNamePtrTy);
+ const DataLayout &DL = M->getDataLayout();
+ const llvm::Align TypeAlign = DL.getABITypeAlign(CriticalNamePtrTy);
+ const llvm::Align PtrAlign = DL.getPointerABIAlignment(GV->getAddressSpace());
+ if (const llvm::MaybeAlign Alignment = GV->getAlign())
+ EXPECT_EQ(*Alignment, std::max(TypeAlign, PtrAlign));
}
TEST_F(OpenMPIRBuilderTest, OrderedDirectiveDependSource) {
More information about the cfe-commits
mailing list