diff --git a/llvm/lib/Analysis/MemorySSAUpdater.cpp b/llvm/lib/Analysis/MemorySSAUpdater.cpp --- a/llvm/lib/Analysis/MemorySSAUpdater.cpp +++ b/llvm/lib/Analysis/MemorySSAUpdater.cpp @@ -305,6 +305,12 @@ // point to the correct new defs, to ensure we only have one variable, and no // disconnected stores. void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) { + // Don't bother updating dead code. + if (!MSSA->DT->isReachableFromEntry(MD->getBlock())) { + MD->setDefiningAccess(MSSA->getLiveOnEntryDef()); + return; + } + VisitedBlocks.clear(); InsertedPHIs.clear(); @@ -422,10 +428,10 @@ if (NewPhiSize) tryRemoveTrivialPhis(ArrayRef(&InsertedPHIs[NewPhiIndex], NewPhiSize)); - // Now that all fixups are done, rename all uses if we are asked. Skip - // renaming for defs in unreachable blocks. + // Now that all fixups are done, rename all uses if we are asked. The defs are + // guaranteed to be in reachable code due to the check at the method entry. BasicBlock *StartBlock = MD->getBlock(); - if (RenameUses && MSSA->getDomTree().getNode(StartBlock)) { + if (RenameUses) { SmallPtrSet Visited; // We are guaranteed there is a def in the block, because we just got it // handed to us in this function. diff --git a/llvm/test/Transforms/GVN/mssa-update-dead-def.ll b/llvm/test/Transforms/GVN/mssa-update-dead-def.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/GVN/mssa-update-dead-def.ll @@ -0,0 +1,33 @@ +; RUN: opt -passes='require,gvn' -verify-memoryssa -S %s | FileCheck %s + +; This is a regression test for a bug in MemorySSA updater. +; Make sure that we don't crash and end up with a valid MemorySSA. + +; CHECK: @test() +define void @test() personality i32* ()* null { + invoke void @bar() + to label %bar.normal unwind label %exceptional + +bar.normal: + ret void + +dead.block: + br label %baz.invoke + +baz.invoke: + invoke void @baz() + to label %baz.normal unwind label %exceptional + +baz.normal: + ret void + +exceptional: + %tmp9 = landingpad { i8*, i32 } + cleanup + call void @foo() + ret void +} + +declare void @foo() +declare void @bar() +declare void @baz()