@@ -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
1672416722LoadInst *
0 commit comments