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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits