Fix MemorySSAUpdater::insertDef for dead code

Fix for https://github.com/llvm/llvm-project/issues/51257.

Differential Revision: https://reviews.llvm.org/D122601
This commit is contained in:
Artur Pilipenko 2022-03-31 16:30:14 -07:00
parent 71ec09b33e
commit 4fbde1ef40
2 changed files with 42 additions and 3 deletions

View File

@ -305,6 +305,12 @@ static void setMemoryPhiValueForBlock(MemoryPhi *MP, const BasicBlock *BB,
// 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 @@ void MemorySSAUpdater::insertDef(MemoryDef *MD, bool RenameUses) {
if (NewPhiSize)
tryRemoveTrivialPhis(ArrayRef<WeakVH>(&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<BasicBlock *, 16> Visited;
// We are guaranteed there is a def in the block, because we just got it
// handed to us in this function.

View File

@ -0,0 +1,33 @@
; RUN: opt -passes='require<memoryssa>,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()