Index: llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp +++ llvm/trunk/lib/Transforms/Scalar/NewGVN.cpp @@ -3497,9 +3497,11 @@ if (!ToErase->use_empty()) ToErase->replaceAllUsesWith(UndefValue::get(ToErase->getType())); - if (ToErase->getParent()) - ToErase->eraseFromParent(); + assert(ToErase->getParent() && + "BB containing ToErase deleted unexpectedly!"); + ToErase->eraseFromParent(); } + Changed |= !InstructionsToErase.empty(); // Delete all unreachable blocks. auto UnreachableBlockPred = [&](const BasicBlock &BB) { Index: llvm/trunk/test/Transforms/NewGVN/eliminate-callsite-inline.ll =================================================================== --- llvm/trunk/test/Transforms/NewGVN/eliminate-callsite-inline.ll +++ llvm/trunk/test/Transforms/NewGVN/eliminate-callsite-inline.ll @@ -0,0 +1,18 @@ +; RUN: opt -inline -newgvn -S < %s | FileCheck %s + +; CHECK-LABEL: @f2() +; CHECK-NEXT: ret void +; CHECK-NOT: @f1 + +define void @f2() { + call void @f1() + call void @f1() + ret void +} + +define internal void @f1() #1 { +entry: + ret void +} + +attributes #1 = { noinline nounwind readnone }