Index: lib/Transforms/Scalar/SCCP.cpp =================================================================== --- lib/Transforms/Scalar/SCCP.cpp +++ lib/Transforms/Scalar/SCCP.cpp @@ -2019,8 +2019,25 @@ for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) { if (!Solver.isBlockExecutable(&*BB)) { LLVM_DEBUG(dbgs() << " BasicBlock Dead:" << *BB); - ++NumDeadBlocks; + + // By using changeToUnreachable below, PHI nodes in successors of + // BB with 2 predecessors are replaced by the incoming value. Therefore + // we have to try and replace them with constants here, before they + // are removed. + for (BasicBlock *Successor : successors(&*BB)) { + for (PHINode &PN : Successor->phis()) { + if (PN.getNumIncomingValues() != 2 || + !Solver.isBlockExecutable(Successor)) + continue; + + // There is no need to remove PN here, as changeToUnreachable will + // take care of that. + if (tryToReplaceWithConstant(Solver, &PN)) + ++IPNumInstRemoved; + } + } + NumInstRemoved += changeToUnreachable(BB->getFirstNonPHI(), /*UseLLVMTrap=*/false); Index: test/Transforms/SCCP/ipsccp-phi-one-pred-dead.ll =================================================================== --- /dev/null +++ test/Transforms/SCCP/ipsccp-phi-one-pred-dead.ll @@ -0,0 +1,39 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -ipsccp | FileCheck %s +target triple = "x86_64-unknown-linux-gnu" + +define void @test() { +; CHECK-LABEL: @test( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label %Flow5.pre +; CHECK: Flow6: +; CHECK-NEXT: br label %end2 +; CHECK: Flow5.pre: +; CHECK-NEXT: br label %Flow5 +; CHECK: Flow5: +; CHECK-NEXT: br label %Flow6 +; CHECK: end2: +; CHECK-NEXT: unreachable +; +entry: + br i1 true, label %Flow5.pre, label %Flow5.pre.unreachable + +Flow5.pre.unreachable: + br label %Flow5 + +Flow6: + br i1 %0, label %end1, label %end2 + +Flow5.pre: + br label %Flow5 + +Flow5: + %0 = phi i1 [ undef, %Flow5.pre ], [ false, %Flow5.pre.unreachable ] + br label %Flow6 + +end1: + unreachable + +end2: + unreachable +}