summaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/MemorySSAUpdater.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/MemorySSAUpdater.cpp')
-rw-r--r--llvm/lib/Analysis/MemorySSAUpdater.cpp68
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>