summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/MemorySSA.cpp
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2016-07-06 05:32:05 +0000
committerDaniel Berlin <dberlin@dberlin.org>2016-07-06 05:32:05 +0000
commitfc7e651bfd1d144252cb25409917e72966d35091 (patch)
treea5828921a5d73bc1dfc62f8183c8083a0143dc82 /llvm/lib/Transforms/Utils/MemorySSA.cpp
parent5c29783bf2e115712cacac1d3247fca16d1595be (diff)
downloadbcm5719-llvm-fc7e651bfd1d144252cb25409917e72966d35091.tar.gz
bcm5719-llvm-fc7e651bfd1d144252cb25409917e72966d35091.zip
Fix handling of forward unreachable but reverse-reachable blocks in MemorySSA construction
llvm-svn: 274606
Diffstat (limited to 'llvm/lib/Transforms/Utils/MemorySSA.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/MemorySSA.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/MemorySSA.cpp b/llvm/lib/Transforms/Utils/MemorySSA.cpp
index a1f04c574f0..d13cfe35470 100644
--- a/llvm/lib/Transforms/Utils/MemorySSA.cpp
+++ b/llvm/lib/Transforms/Utils/MemorySSA.cpp
@@ -201,8 +201,6 @@ MemoryAccess *MemorySSA::renameBlock(BasicBlock *BB,
continue;
AccessList *Accesses = It->second.get();
auto *Phi = cast<MemoryPhi>(&Accesses->front());
- assert(std::find(succ_begin(BB), succ_end(BB), S) != succ_end(BB) &&
- "Must be at least one edge from Succ to BB!");
Phi->addIncoming(IncomingVal, BB);
}
@@ -252,6 +250,22 @@ void MemorySSA::markUnreachableAsLiveOnEntry(BasicBlock *BB) {
assert(!DT->isReachableFromEntry(BB) &&
"Reachable block found while handling unreachable blocks");
+ // Make sure phi nodes in our reachable successors end up with a
+ // LiveOnEntryDef for our incoming edge, even though our block is forward
+ // unreachable. We could just disconnect these blocks from the CFG fully,
+ // but we do not right now.
+ for (const BasicBlock *S : successors(BB)) {
+ if (!DT->isReachableFromEntry(S))
+ continue;
+ auto It = PerBlockAccesses.find(S);
+ // Rename the phi nodes in our successor block
+ if (It == PerBlockAccesses.end() || !isa<MemoryPhi>(It->second->front()))
+ continue;
+ AccessList *Accesses = It->second.get();
+ auto *Phi = cast<MemoryPhi>(&Accesses->front());
+ Phi->addIncoming(LiveOnEntryDef.get(), BB);
+ }
+
auto It = PerBlockAccesses.find(BB);
if (It == PerBlockAccesses.end())
return;
OpenPOWER on IntegriCloud