@@ -565,24 +565,26 @@ static MemoryAccess *onlySingleValue(MemoryPhi *MP) {
565565 return MA;
566566}
567567
568- static MemoryAccess *getNewDefiningAccessForClone (MemoryAccess *MA,
569- const ValueToValueMapTy &VMap,
570- PhiToDefMap &MPhiMap,
571- MemorySSA *MSSA) {
568+ static MemoryAccess *getNewDefiningAccessForClone (
569+ MemoryAccess *MA, const ValueToValueMapTy &VMap, PhiToDefMap &MPhiMap,
570+ MemorySSA *MSSA, function_ref<bool (BasicBlock *BB)> IsInClonedRegion) {
572571 MemoryAccess *InsnDefining = MA;
573572 if (MemoryDef *DefMUD = dyn_cast<MemoryDef>(InsnDefining)) {
574- if (!MSSA->isLiveOnEntryDef (DefMUD)) {
575- Instruction *DefMUDI = DefMUD->getMemoryInst ();
576- assert (DefMUDI && " Found MemoryUseOrDef with no Instruction." );
577- if (Instruction *NewDefMUDI =
578- cast_or_null<Instruction>(VMap.lookup (DefMUDI))) {
579- InsnDefining = MSSA->getMemoryAccess (NewDefMUDI);
580- if (!InsnDefining || isa<MemoryUse>(InsnDefining)) {
581- // The clone was simplified, it's no longer a MemoryDef, look up.
582- InsnDefining = getNewDefiningAccessForClone (
583- DefMUD->getDefiningAccess (), VMap, MPhiMap, MSSA);
584- }
585- }
573+ if (MSSA->isLiveOnEntryDef (DefMUD))
574+ return DefMUD;
575+
576+ // If the MemoryDef is not part of the cloned region, leave it alone.
577+ Instruction *DefMUDI = DefMUD->getMemoryInst ();
578+ assert (DefMUDI && " Found MemoryUseOrDef with no Instruction." );
579+ if (!IsInClonedRegion (DefMUDI->getParent ()))
580+ return DefMUD;
581+
582+ auto *NewDefMUDI = cast_or_null<Instruction>(VMap.lookup (DefMUDI));
583+ InsnDefining = NewDefMUDI ? MSSA->getMemoryAccess (NewDefMUDI) : nullptr ;
584+ if (!InsnDefining || isa<MemoryUse>(InsnDefining)) {
585+ // The clone was simplified, it's no longer a MemoryDef, look up.
586+ InsnDefining = getNewDefiningAccessForClone (
587+ DefMUD->getDefiningAccess (), VMap, MPhiMap, MSSA, IsInClonedRegion);
586588 }
587589 } else {
588590 MemoryPhi *DefPhi = cast<MemoryPhi>(InsnDefining);
@@ -593,10 +595,10 @@ static MemoryAccess *getNewDefiningAccessForClone(MemoryAccess *MA,
593595 return InsnDefining;
594596}
595597
596- void MemorySSAUpdater::cloneUsesAndDefs (BasicBlock *BB, BasicBlock *NewBB,
597- const ValueToValueMapTy &VMap,
598- PhiToDefMap &MPhiMap,
599- bool CloneWasSimplified) {
598+ void MemorySSAUpdater::cloneUsesAndDefs (
599+ BasicBlock *BB, BasicBlock *NewBB, const ValueToValueMapTy &VMap,
600+ PhiToDefMap &MPhiMap, function_ref< bool (BasicBlock *)> IsInClonedRegion ,
601+ bool CloneWasSimplified) {
600602 const MemorySSA::AccessList *Acc = MSSA->getBlockAccesses (BB);
601603 if (!Acc)
602604 return ;
@@ -615,7 +617,7 @@ void MemorySSAUpdater::cloneUsesAndDefs(BasicBlock *BB, BasicBlock *NewBB,
615617 MemoryAccess *NewUseOrDef = MSSA->createDefinedAccess (
616618 NewInsn,
617619 getNewDefiningAccessForClone (MUD->getDefiningAccess (), VMap,
618- MPhiMap, MSSA),
620+ MPhiMap, MSSA, IsInClonedRegion ),
619621 /* Template=*/ CloneWasSimplified ? nullptr : MUD,
620622 /* CreationMustSucceed=*/ false );
621623 if (NewUseOrDef)
@@ -668,8 +670,13 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
668670 ArrayRef<BasicBlock *> ExitBlocks,
669671 const ValueToValueMapTy &VMap,
670672 bool IgnoreIncomingWithNoClones) {
671- PhiToDefMap MPhiMap;
673+ SmallSetVector<BasicBlock *, 16 > Blocks;
674+ for (BasicBlock *BB : concat<BasicBlock *const >(LoopBlocks, ExitBlocks))
675+ Blocks.insert (BB);
672676
677+ auto IsInClonedRegion = [&](BasicBlock *BB) { return Blocks.contains (BB); };
678+
679+ PhiToDefMap MPhiMap;
673680 auto FixPhiIncomingValues = [&](MemoryPhi *Phi, MemoryPhi *NewPhi) {
674681 assert (Phi && NewPhi && " Invalid Phi nodes." );
675682 BasicBlock *NewPhiBB = NewPhi->getBlock ();
@@ -692,9 +699,10 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
692699 continue ;
693700
694701 // Determine incoming value and add it as incoming from IncBB.
695- NewPhi->addIncoming (
696- getNewDefiningAccessForClone (IncomingAccess, VMap, MPhiMap, MSSA),
697- IncBB);
702+ NewPhi->addIncoming (getNewDefiningAccessForClone (IncomingAccess, VMap,
703+ MPhiMap, MSSA,
704+ IsInClonedRegion),
705+ IncBB);
698706 }
699707 if (auto *SingleAccess = onlySingleValue (NewPhi)) {
700708 MPhiMap[Phi] = SingleAccess;
@@ -716,13 +724,13 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
716724 MPhiMap[MPhi] = NewPhi;
717725 }
718726 // Update Uses and Defs.
719- cloneUsesAndDefs (BB, NewBlock, VMap, MPhiMap);
727+ cloneUsesAndDefs (BB, NewBlock, VMap, MPhiMap, IsInClonedRegion );
720728 };
721729
722- for (auto *BB : llvm::concat<BasicBlock * const >(LoopBlocks, ExitBlocks) )
730+ for (auto *BB : Blocks )
723731 ProcessBlock (BB);
724732
725- for (auto *BB : llvm::concat<BasicBlock * const >(LoopBlocks, ExitBlocks) )
733+ for (auto *BB : Blocks )
726734 if (MemoryPhi *MPhi = MSSA->getMemoryAccess (BB))
727735 if (MemoryAccess *NewPhi = MPhiMap.lookup (MPhi))
728736 FixPhiIncomingValues (MPhi, cast<MemoryPhi>(NewPhi));
@@ -741,7 +749,9 @@ void MemorySSAUpdater::updateForClonedBlockIntoPred(
741749 PhiToDefMap MPhiMap;
742750 if (MemoryPhi *MPhi = MSSA->getMemoryAccess (BB))
743751 MPhiMap[MPhi] = MPhi->getIncomingValueForBlock (P1);
744- cloneUsesAndDefs (BB, P1, VM, MPhiMap, /* CloneWasSimplified=*/ true );
752+ cloneUsesAndDefs (
753+ BB, P1, VM, MPhiMap, [&](BasicBlock *CheckBB) { return BB == CheckBB; },
754+ /* CloneWasSimplified=*/ true );
745755}
746756
747757template <typename Iter>
0 commit comments