diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2016-07-06 05:32:05 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@dberlin.org> | 2016-07-06 05:32:05 +0000 |
commit | fc7e651bfd1d144252cb25409917e72966d35091 (patch) | |
tree | a5828921a5d73bc1dfc62f8183c8083a0143dc82 /llvm/lib/Transforms/Utils/MemorySSA.cpp | |
parent | 5c29783bf2e115712cacac1d3247fca16d1595be (diff) | |
download | bcm5719-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.cpp | 18 |
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; |