diff options
author | NimishMishra <42909663+NimishMishra@users.noreply.github.com> | 2025-04-09 15:31:44 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-09 03:01:44 -0700 |
commit | 53fa92dcad49466412a139eef223710bf5891213 (patch) | |
tree | 38bf917921bbdac8f876c24aff0bfaaad29ad084 /llvm | |
parent | 712c21336fa891f5b32254dd51b024178d61befb (diff) | |
download | llvm-53fa92dcad49466412a139eef223710bf5891213.zip llvm-53fa92dcad49466412a139eef223710bf5891213.tar.gz llvm-53fa92dcad49466412a139eef223710bf5891213.tar.bz2 |
[mlir][llvm][OpenMP] Hoist __atomic_load alloca (#132888)
Current implementation of `__atomic_compare_exchange` uses an alloca for
`__atomic_load`, leading to issues like
https://github.com/llvm/llvm-project/issues/120724. This PR hoists this
alloca to `AllocaIP`.
Fixes: https://github.com/llvm/llvm-project/issues/120724
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/Frontend/Atomic/Atomic.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h | 10 | ||||
-rw-r--r-- | llvm/lib/Frontend/Atomic/Atomic.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 6 | ||||
-rw-r--r-- | llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | 11 |
5 files changed, 24 insertions, 12 deletions
diff --git a/llvm/include/llvm/Frontend/Atomic/Atomic.h b/llvm/include/llvm/Frontend/Atomic/Atomic.h index 9f46fde..fb85a3b 100644 --- a/llvm/include/llvm/Frontend/Atomic/Atomic.h +++ b/llvm/include/llvm/Frontend/Atomic/Atomic.h @@ -22,14 +22,15 @@ protected: Align AtomicAlign; Align ValueAlign; bool UseLibcall; + IRBuilderBase::InsertPoint AllocaIP; public: AtomicInfo(IRBuilderBase *Builder, Type *Ty, uint64_t AtomicSizeInBits, uint64_t ValueSizeInBits, Align AtomicAlign, Align ValueAlign, - bool UseLibcall) + bool UseLibcall, IRBuilderBase::InsertPoint AllocaIP) : Builder(Builder), Ty(Ty), AtomicSizeInBits(AtomicSizeInBits), ValueSizeInBits(ValueSizeInBits), AtomicAlign(AtomicAlign), - ValueAlign(ValueAlign), UseLibcall(UseLibcall) {} + ValueAlign(ValueAlign), UseLibcall(UseLibcall), AllocaIP(AllocaIP) {} virtual ~AtomicInfo() = default; diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h index 6b10470..10d69e56 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -489,9 +489,10 @@ public: public: AtomicInfo(IRBuilder<> *Builder, llvm::Type *Ty, uint64_t AtomicSizeInBits, uint64_t ValueSizeInBits, llvm::Align AtomicAlign, - llvm::Align ValueAlign, bool UseLibcall, llvm::Value *AtomicVar) + llvm::Align ValueAlign, bool UseLibcall, + IRBuilderBase::InsertPoint AllocaIP, llvm::Value *AtomicVar) : llvm::AtomicInfo(Builder, Ty, AtomicSizeInBits, ValueSizeInBits, - AtomicAlign, ValueAlign, UseLibcall), + AtomicAlign, ValueAlign, UseLibcall, AllocaIP), AtomicVar(AtomicVar) {} llvm::Value *getAtomicPointer() const override { return AtomicVar; } @@ -3270,11 +3271,12 @@ public: /// value /// \param AO Atomic ordering of the generated atomic /// instructions. - /// + /// \param AllocaIP Insert point for allocas + // /// \return Insertion point after generated atomic read IR. InsertPointTy createAtomicRead(const LocationDescription &Loc, AtomicOpValue &X, AtomicOpValue &V, - AtomicOrdering AO); + AtomicOrdering AO, InsertPointTy AllocaIP); /// Emit atomic write for : X = Expr --- Only Scalar data types. /// diff --git a/llvm/lib/Frontend/Atomic/Atomic.cpp b/llvm/lib/Frontend/Atomic/Atomic.cpp index c9f9a9d..37db8fe 100644 --- a/llvm/lib/Frontend/Atomic/Atomic.cpp +++ b/llvm/lib/Frontend/Atomic/Atomic.cpp @@ -118,8 +118,12 @@ AtomicInfo::EmitAtomicLoadLibcall(AtomicOrdering AO) { Value *PtrVal = getAtomicPointer(); PtrVal = Builder->CreateAddrSpaceCast(PtrVal, PointerType::getUnqual(Ctx)); Args.push_back(PtrVal); + + auto CurrentIP = Builder->saveIP(); + Builder->restoreIP(AllocaIP); AllocaInst *AllocaResult = CreateAlloca(Ty, getAtomicPointer()->getName() + "atomic.temp.load"); + Builder->restoreIP(CurrentIP); const Align AllocaAlignment = DL.getPrefTypeAlign(SizedIntTy); AllocaResult->setAlignment(AllocaAlignment); Args.push_back(AllocaResult); diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index 28662ef..4b3f9c6 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -8631,7 +8631,7 @@ bool OpenMPIRBuilder::checkAndEmitFlushAfterAtomic( OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createAtomicRead(const LocationDescription &Loc, AtomicOpValue &X, AtomicOpValue &V, - AtomicOrdering AO) { + AtomicOrdering AO, InsertPointTy AllocaIP) { if (!updateToLocation(Loc)) return Loc.IP; @@ -8659,7 +8659,7 @@ OpenMPIRBuilder::createAtomicRead(const LocationDescription &Loc, LoadDL.getTypeStoreSize(OldVal->getPointerOperand()->getType()); OpenMPIRBuilder::AtomicInfo atomicInfo( &Builder, XElemTy, LoadSize * 8, LoadSize * 8, OldVal->getAlign(), - OldVal->getAlign(), true /* UseLibcall */, X.Var); + OldVal->getAlign(), true /* UseLibcall */, AllocaIP, X.Var); auto AtomicLoadRes = atomicInfo.EmitAtomicLoadLibcall(AO); XRead = AtomicLoadRes.first; OldVal->eraseFromParent(); @@ -8824,7 +8824,7 @@ Expected<std::pair<Value *, Value *>> OpenMPIRBuilder::emitAtomicUpdate( OpenMPIRBuilder::AtomicInfo atomicInfo( &Builder, XElemTy, LoadSize * 8, LoadSize * 8, OldVal->getAlign(), - OldVal->getAlign(), true /* UseLibcall */, X); + OldVal->getAlign(), true /* UseLibcall */, AllocaIP, X); auto AtomicLoadRes = atomicInfo.EmitAtomicLoadLibcall(AO); BasicBlock *CurBB = Builder.GetInsertBlock(); Instruction *CurBBTI = CurBB->getTerminator(); diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp index 2d3d318..5dd0180 100644 --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -3781,6 +3781,9 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicReadFlt) { IRBuilder<> Builder(BB); OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL}); + BasicBlock *EntryBB = BB; + OpenMPIRBuilder::InsertPointTy AllocaIP(EntryBB, + EntryBB->getFirstInsertionPt()); Type *Float32 = Type::getFloatTy(M->getContext()); AllocaInst *XVal = Builder.CreateAlloca(Float32); @@ -3791,7 +3794,7 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicReadFlt) { OpenMPIRBuilder::AtomicOpValue X = {XVal, Float32, false, false}; OpenMPIRBuilder::AtomicOpValue V = {VVal, Float32, false, false}; - Builder.restoreIP(OMPBuilder.createAtomicRead(Loc, X, V, AO)); + Builder.restoreIP(OMPBuilder.createAtomicRead(Loc, X, V, AO, AllocaIP)); IntegerType *IntCastTy = IntegerType::get(M->getContext(), Float32->getScalarSizeInBits()); @@ -3821,6 +3824,9 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicReadInt) { IRBuilder<> Builder(BB); OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL}); + BasicBlock *EntryBB = BB; + OpenMPIRBuilder::InsertPointTy AllocaIP(EntryBB, + EntryBB->getFirstInsertionPt()); IntegerType *Int32 = Type::getInt32Ty(M->getContext()); AllocaInst *XVal = Builder.CreateAlloca(Int32); @@ -3831,9 +3837,8 @@ TEST_F(OpenMPIRBuilderTest, OMPAtomicReadInt) { OpenMPIRBuilder::AtomicOpValue X = {XVal, Int32, false, false}; OpenMPIRBuilder::AtomicOpValue V = {VVal, Int32, false, false}; - BasicBlock *EntryBB = BB; + Builder.restoreIP(OMPBuilder.createAtomicRead(Loc, X, V, AO, AllocaIP)); - Builder.restoreIP(OMPBuilder.createAtomicRead(Loc, X, V, AO)); LoadInst *AtomicLoad = nullptr; StoreInst *StoreofAtomic = nullptr; |