diff options
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; |