@@ -565,24 +565,26 @@ static MemoryAccess *onlySingleValue(MemoryPhi *MP) {
565
565
return MA;
566
566
}
567
567
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) {
572
571
MemoryAccess *InsnDefining = MA;
573
572
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);
586
588
}
587
589
} else {
588
590
MemoryPhi *DefPhi = cast<MemoryPhi>(InsnDefining);
@@ -593,10 +595,10 @@ static MemoryAccess *getNewDefiningAccessForClone(MemoryAccess *MA,
593
595
return InsnDefining;
594
596
}
595
597
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) {
600
602
const MemorySSA::AccessList *Acc = MSSA->getBlockAccesses (BB);
601
603
if (!Acc)
602
604
return ;
@@ -615,7 +617,7 @@ void MemorySSAUpdater::cloneUsesAndDefs(BasicBlock *BB, BasicBlock *NewBB,
615
617
MemoryAccess *NewUseOrDef = MSSA->createDefinedAccess (
616
618
NewInsn,
617
619
getNewDefiningAccessForClone (MUD->getDefiningAccess (), VMap,
618
- MPhiMap, MSSA),
620
+ MPhiMap, MSSA, IsInClonedRegion ),
619
621
/* Template=*/ CloneWasSimplified ? nullptr : MUD,
620
622
/* CreationMustSucceed=*/ false );
621
623
if (NewUseOrDef)
@@ -668,8 +670,13 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
668
670
ArrayRef<BasicBlock *> ExitBlocks,
669
671
const ValueToValueMapTy &VMap,
670
672
bool IgnoreIncomingWithNoClones) {
671
- PhiToDefMap MPhiMap;
673
+ SmallSetVector<BasicBlock *, 16 > Blocks;
674
+ for (BasicBlock *BB : concat<BasicBlock *const >(LoopBlocks, ExitBlocks))
675
+ Blocks.insert (BB);
672
676
677
+ auto IsInClonedRegion = [&](BasicBlock *BB) { return Blocks.contains (BB); };
678
+
679
+ PhiToDefMap MPhiMap;
673
680
auto FixPhiIncomingValues = [&](MemoryPhi *Phi, MemoryPhi *NewPhi) {
674
681
assert (Phi && NewPhi && " Invalid Phi nodes." );
675
682
BasicBlock *NewPhiBB = NewPhi->getBlock ();
@@ -692,9 +699,10 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
692
699
continue ;
693
700
694
701
// 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);
698
706
}
699
707
if (auto *SingleAccess = onlySingleValue (NewPhi)) {
700
708
MPhiMap[Phi] = SingleAccess;
@@ -716,13 +724,13 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks,
716
724
MPhiMap[MPhi] = NewPhi;
717
725
}
718
726
// Update Uses and Defs.
719
- cloneUsesAndDefs (BB, NewBlock, VMap, MPhiMap);
727
+ cloneUsesAndDefs (BB, NewBlock, VMap, MPhiMap, IsInClonedRegion );
720
728
};
721
729
722
- for (auto *BB : llvm::concat<BasicBlock * const >(LoopBlocks, ExitBlocks) )
730
+ for (auto *BB : Blocks )
723
731
ProcessBlock (BB);
724
732
725
- for (auto *BB : llvm::concat<BasicBlock * const >(LoopBlocks, ExitBlocks) )
733
+ for (auto *BB : Blocks )
726
734
if (MemoryPhi *MPhi = MSSA->getMemoryAccess (BB))
727
735
if (MemoryAccess *NewPhi = MPhiMap.lookup (MPhi))
728
736
FixPhiIncomingValues (MPhi, cast<MemoryPhi>(NewPhi));
@@ -741,7 +749,9 @@ void MemorySSAUpdater::updateForClonedBlockIntoPred(
741
749
PhiToDefMap MPhiMap;
742
750
if (MemoryPhi *MPhi = MSSA->getMemoryAccess (BB))
743
751
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 );
745
755
}
746
756
747
757
template <typename Iter>
0 commit comments