@@ -16659,18 +16659,6 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const {
16659
16659
Value *Addr = AI->getPointerOperand();
16660
16660
Align Alignment = AI->getAlign();
16661
16661
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
-
16674
16662
std::prev(BB->end())->eraseFromParent();
16675
16663
Builder.SetInsertPoint(BB);
16676
16664
CallInst *IsShared = Builder.CreateIntrinsic(Intrinsic::amdgcn_is_shared, {},
@@ -16680,7 +16668,13 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const {
16680
16668
Builder.SetInsertPoint(SharedBB);
16681
16669
Value *CastToLocal = Builder.CreateAddrSpaceCast(
16682
16670
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
+
16684
16678
Builder.CreateBr(PhiBB);
16685
16679
16686
16680
Builder.SetInsertPoint(CheckPrivateBB);
@@ -16702,23 +16696,27 @@ void SITargetLowering::emitExpandAtomicRMW(AtomicRMWInst *AI) const {
16702
16696
Builder.SetInsertPoint(GlobalBB);
16703
16697
Value *CastToGlobal = Builder.CreateAddrSpaceCast(
16704
16698
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
+
16706
16706
Builder.CreateBr(PhiBB);
16707
16707
16708
16708
Builder.SetInsertPoint(PhiBB);
16709
16709
16710
16710
if (ReturnValueIsUsed) {
16711
16711
PHINode *Loaded = Builder.CreatePHI(ValTy, 3);
16712
+ AI->replaceAllUsesWith(Loaded);
16712
16713
Loaded->addIncoming(LoadedShared, SharedBB);
16713
16714
Loaded->addIncoming(LoadedPrivate, PrivateBB);
16714
16715
Loaded->addIncoming(LoadedGlobal, GlobalBB);
16715
16716
Loaded->takeName(AI);
16716
- AI->replaceAllUsesWith(Loaded);
16717
16717
}
16718
16718
16719
16719
Builder.CreateBr(ExitBB);
16720
-
16721
- AI->eraseFromParent();
16722
16720
}
16723
16721
16724
16722
LoadInst *
0 commit comments