diff options
Diffstat (limited to 'llvm/lib/Analysis/MemorySSAUpdater.cpp')
| -rw-r--r-- | llvm/lib/Analysis/MemorySSAUpdater.cpp | 68 |
1 files changed, 39 insertions, 29 deletions
diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp index f672bd0e1e13..050b827388d3 100644 --- a/llvm/lib/Analysis/MemorySSAUpdater.cpp +++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp @@ -565,24 +565,26 @@ static MemoryAccess *onlySingleValue(MemoryPhi *MP) { return MA; } -static MemoryAccess *getNewDefiningAccessForClone(MemoryAccess *MA, - const ValueToValueMapTy &VMap, - PhiToDefMap &MPhiMap, - MemorySSA *MSSA) { +static MemoryAccess *getNewDefiningAccessForClone( + MemoryAccess *MA, const ValueToValueMapTy &VMap, PhiToDefMap &MPhiMap, + MemorySSA *MSSA, function_ref<bool(BasicBlock *BB)> IsInClonedRegion) { MemoryAccess *InsnDefining = MA; if (MemoryDef *DefMUD = dyn_cast<MemoryDef>(InsnDefining)) { - if (!MSSA->isLiveOnEntryDef(DefMUD)) { - Instruction *DefMUDI = DefMUD->getMemoryInst(); - assert(DefMUDI && "Found MemoryUseOrDef with no Instruction."); - if (Instruction *NewDefMUDI = - cast_or_null<Instruction>(VMap.lookup(DefMUDI))) { - InsnDefining = MSSA->getMemoryAccess(NewDefMUDI); - if (!InsnDefining || isa<MemoryUse>(InsnDefining)) { - // The clone was simplified, it's no longer a MemoryDef, look up. - InsnDefining = getNewDefiningAccessForClone( - DefMUD->getDefiningAccess(), VMap, MPhiMap, MSSA); - } - } + if (MSSA->isLiveOnEntryDef(DefMUD)) + return DefMUD; + + // If the MemoryDef is not part of the cloned region, leave it alone. + Instruction *DefMUDI = DefMUD->getMemoryInst(); + assert(DefMUDI && "Found MemoryUseOrDef with no Instruction."); + if (!IsInClonedRegion(DefMUDI->getParent())) + return DefMUD; + + auto *NewDefMUDI = cast_or_null<Instruction>(VMap.lookup(DefMUDI)); + InsnDefining = NewDefMUDI ? MSSA->getMemoryAccess(NewDefMUDI) : nullptr; + if (!InsnDefining || isa<MemoryUse>(InsnDefining)) { + // The clone was simplified, it's no longer a MemoryDef, look up. + InsnDefining = getNewDefiningAccessForClone( + DefMUD->getDefiningAccess(), VMap, MPhiMap, MSSA, IsInClonedRegion); } } else { MemoryPhi *DefPhi = cast<MemoryPhi>(InsnDefining); @@ -593,10 +595,10 @@ static MemoryAccess *getNewDefiningAccessForClone(MemoryAccess *MA, return InsnDefining; } -void MemorySSAUpdater::cloneUsesAndDefs(BasicBlock *BB, BasicBlock *NewBB, - const ValueToValueMapTy &VMap, - PhiToDefMap &MPhiMap, - bool CloneWasSimplified) { +void MemorySSAUpdater::cloneUsesAndDefs( + BasicBlock *BB, BasicBlock *NewBB, const ValueToValueMapTy &VMap, + PhiToDefMap &MPhiMap, function_ref<bool(BasicBlock *)> IsInClonedRegion, + bool CloneWasSimplified) { const MemorySSA::AccessList *Acc = MSSA->getBlockAccesses(BB); if (!Acc) return; @@ -615,7 +617,7 @@ void MemorySSAUpdater::cloneUsesAndDefs(BasicBlock *BB, BasicBlock *NewBB, MemoryAccess *NewUseOrDef = MSSA->createDefinedAccess( NewInsn, getNewDefiningAccessForClone(MUD->getDefiningAccess(), VMap, - MPhiMap, MSSA), + MPhiMap, MSSA, IsInClonedRegion), /*Template=*/CloneWasSimplified ? nullptr : MUD, /*CreationMustSucceed=*/false); if (NewUseOrDef) @@ -668,8 +670,13 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks, ArrayRef<BasicBlock *> ExitBlocks, const ValueToValueMapTy &VMap, bool IgnoreIncomingWithNoClones) { - PhiToDefMap MPhiMap; + SmallSetVector<BasicBlock *, 16> Blocks; + for (BasicBlock *BB : concat<BasicBlock *const>(LoopBlocks, ExitBlocks)) + Blocks.insert(BB); + auto IsInClonedRegion = [&](BasicBlock *BB) { return Blocks.contains(BB); }; + + PhiToDefMap MPhiMap; auto FixPhiIncomingValues = [&](MemoryPhi *Phi, MemoryPhi *NewPhi) { assert(Phi && NewPhi && "Invalid Phi nodes."); BasicBlock *NewPhiBB = NewPhi->getBlock(); @@ -692,9 +699,10 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks, continue; // Determine incoming value and add it as incoming from IncBB. - NewPhi->addIncoming( - getNewDefiningAccessForClone(IncomingAccess, VMap, MPhiMap, MSSA), - IncBB); + NewPhi->addIncoming(getNewDefiningAccessForClone(IncomingAccess, VMap, + MPhiMap, MSSA, + IsInClonedRegion), + IncBB); } if (auto *SingleAccess = onlySingleValue(NewPhi)) { MPhiMap[Phi] = SingleAccess; @@ -716,13 +724,13 @@ void MemorySSAUpdater::updateForClonedLoop(const LoopBlocksRPO &LoopBlocks, MPhiMap[MPhi] = NewPhi; } // Update Uses and Defs. - cloneUsesAndDefs(BB, NewBlock, VMap, MPhiMap); + cloneUsesAndDefs(BB, NewBlock, VMap, MPhiMap, IsInClonedRegion); }; - for (auto *BB : llvm::concat<BasicBlock *const>(LoopBlocks, ExitBlocks)) + for (auto *BB : Blocks) ProcessBlock(BB); - for (auto *BB : llvm::concat<BasicBlock *const>(LoopBlocks, ExitBlocks)) + for (auto *BB : Blocks) if (MemoryPhi *MPhi = MSSA->getMemoryAccess(BB)) if (MemoryAccess *NewPhi = MPhiMap.lookup(MPhi)) FixPhiIncomingValues(MPhi, cast<MemoryPhi>(NewPhi)); @@ -741,7 +749,9 @@ void MemorySSAUpdater::updateForClonedBlockIntoPred( PhiToDefMap MPhiMap; if (MemoryPhi *MPhi = MSSA->getMemoryAccess(BB)) MPhiMap[MPhi] = MPhi->getIncomingValueForBlock(P1); - cloneUsesAndDefs(BB, P1, VM, MPhiMap, /*CloneWasSimplified=*/true); + cloneUsesAndDefs( + BB, P1, VM, MPhiMap, [&](BasicBlock *CheckBB) { return BB == CheckBB; }, + /*CloneWasSimplified=*/true); } template <typename Iter> |
