Skip to content

Commit 1b29367

Browse files
committed
AMDGPU: Avoid manually reconstructing atomicrmw
When introducing the address space predicates, move and mutate the original instruction, and clone for the shared case.
1 parent 97e1261 commit 1b29367

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

llvm/lib/Target/AMDGPU/SIISelLowering.cpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16659,18 +16659,6 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const {
1665916659
Value *Addr = AI->getPointerOperand();
1666016660
Align Alignment = AI->getAlign();
1666116661

16662-
auto CreateNewAtomicRMW = [AI](IRBuilder<> &Builder, Value *Addr,
16663-
Value *Val) -> Value * {
16664-
AtomicRMWInst *OldVal =
16665-
Builder.CreateAtomicRMW(AI->getOperation(), Addr, Val, AI->getAlign(),
16666-
AI->getOrdering(), AI->getSyncScopeID());
16667-
SmallVector<std::pair<unsigned, MDNode *>> MDs;
16668-
AI->getAllMetadata(MDs);
16669-
for (auto &P : MDs)
16670-
OldVal->setMetadata(P.first, P.second);
16671-
return OldVal;
16672-
};
16673-
1667416662
std::prev(BB->end())->eraseFromParent();
1667516663
Builder.SetInsertPoint(BB);
1667616664
CallInst *IsShared = Builder.CreateIntrinsic(Intrinsic::amdgcn_is_shared, {},
@@ -16680,7 +16668,13 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const {
1668016668
Builder.SetInsertPoint(SharedBB);
1668116669
Value *CastToLocal = Builder.CreateAddrSpaceCast(
1668216670
Addr, PointerType::get(Ctx, AMDGPUAS::LOCAL_ADDRESS));
16683-
Value *LoadedShared = CreateNewAtomicRMW(Builder, CastToLocal, Val);
16671+
16672+
Instruction *Clone = AI->clone();
16673+
Clone->insertInto(SharedBB, SharedBB->end());
16674+
Clone->getOperandUse(AtomicRMWInst::getPointerOperandIndex())
16675+
.set(CastToLocal);
16676+
Instruction *LoadedShared = Clone;
16677+
1668416678
Builder.CreateBr(PhiBB);
1668516679

1668616680
Builder.SetInsertPoint(CheckPrivateBB);
@@ -16702,23 +16696,27 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const {
1670216696
Builder.SetInsertPoint(GlobalBB);
1670316697
Value *CastToGlobal = Builder.CreateAddrSpaceCast(
1670416698
Addr, PointerType::get(Ctx, AMDGPUAS::GLOBAL_ADDRESS));
16705-
Value *LoadedGlobal = CreateNewAtomicRMW(Builder, CastToGlobal, Val);
16699+
Value *LoadedGlobal = AI;
16700+
16701+
AI->getOperandUse(AtomicRMWInst::getPointerOperandIndex()).set(CastToGlobal);
16702+
16703+
AI->removeFromParent();
16704+
AI->insertInto(GlobalBB, GlobalBB->end());
16705+
1670616706
Builder.CreateBr(PhiBB);
1670716707

1670816708
Builder.SetInsertPoint(PhiBB);
1670916709

1671016710
if (ReturnValueIsUsed) {
1671116711
PHINode *Loaded = Builder.CreatePHI(ValTy, 3);
16712+
AI->replaceAllUsesWith(Loaded);
1671216713
Loaded->addIncoming(LoadedShared, SharedBB);
1671316714
Loaded->addIncoming(LoadedPrivate, PrivateBB);
1671416715
Loaded->addIncoming(LoadedGlobal, GlobalBB);
1671516716
Loaded->takeName(AI);
16716-
AI->replaceAllUsesWith(Loaded);
1671716717
}
1671816718

1671916719
Builder.CreateBr(ExitBB);
16720-
16721-
AI->eraseFromParent();
1672216720
}
1672316721

1672416722
LoadInst *

0 commit comments

Comments
 (0)