https://github.com/arsenm created https://github.com/llvm/llvm-project/pull/103769
When introducing the address space predicates, move and mutate the original instruction, and clone for the shared case. >From 1b293677b5030415b828d005a43aca57cd4b3f7b Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Wed, 14 Aug 2024 14:26:37 +0400 Subject: [PATCH] AMDGPU: Avoid manually reconstructing atomicrmw When introducing the address space predicates, move and mutate the original instruction, and clone for the shared case. --- llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 32 +++++++++++------------ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index b884cea5a34de..25fee559faa29 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -16659,18 +16659,6 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const { Value *Addr = AI->getPointerOperand(); Align Alignment = AI->getAlign(); - auto CreateNewAtomicRMW = [AI](IRBuilder<> &Builder, Value *Addr, - Value *Val) -> Value * { - AtomicRMWInst *OldVal = - Builder.CreateAtomicRMW(AI->getOperation(), Addr, Val, AI->getAlign(), - AI->getOrdering(), AI->getSyncScopeID()); - SmallVector<std::pair<unsigned, MDNode *>> MDs; - AI->getAllMetadata(MDs); - for (auto &P : MDs) - OldVal->setMetadata(P.first, P.second); - return OldVal; - }; - std::prev(BB->end())->eraseFromParent(); Builder.SetInsertPoint(BB); CallInst *IsShared = Builder.CreateIntrinsic(Intrinsic::amdgcn_is_shared, {}, @@ -16680,7 +16668,13 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const { Builder.SetInsertPoint(SharedBB); Value *CastToLocal = Builder.CreateAddrSpaceCast( Addr, PointerType::get(Ctx, AMDGPUAS::LOCAL_ADDRESS)); - Value *LoadedShared = CreateNewAtomicRMW(Builder, CastToLocal, Val); + + Instruction *Clone = AI->clone(); + Clone->insertInto(SharedBB, SharedBB->end()); + Clone->getOperandUse(AtomicRMWInst::getPointerOperandIndex()) + .set(CastToLocal); + Instruction *LoadedShared = Clone; + Builder.CreateBr(PhiBB); Builder.SetInsertPoint(CheckPrivateBB); @@ -16702,23 +16696,27 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const { Builder.SetInsertPoint(GlobalBB); Value *CastToGlobal = Builder.CreateAddrSpaceCast( Addr, PointerType::get(Ctx, AMDGPUAS::GLOBAL_ADDRESS)); - Value *LoadedGlobal = CreateNewAtomicRMW(Builder, CastToGlobal, Val); + Value *LoadedGlobal = AI; + + AI->getOperandUse(AtomicRMWInst::getPointerOperandIndex()).set(CastToGlobal); + + AI->removeFromParent(); + AI->insertInto(GlobalBB, GlobalBB->end()); + Builder.CreateBr(PhiBB); Builder.SetInsertPoint(PhiBB); if (ReturnValueIsUsed) { PHINode *Loaded = Builder.CreatePHI(ValTy, 3); + AI->replaceAllUsesWith(Loaded); Loaded->addIncoming(LoadedShared, SharedBB); Loaded->addIncoming(LoadedPrivate, PrivateBB); Loaded->addIncoming(LoadedGlobal, GlobalBB); Loaded->takeName(AI); - AI->replaceAllUsesWith(Loaded); } Builder.CreateBr(ExitBB); - - AI->eraseFromParent(); } LoadInst * _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits