diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp --- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp +++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp @@ -1182,6 +1182,8 @@ } void BranchProbabilityInfo::eraseBlock(const BasicBlock *BB) { + LLVM_DEBUG(dbgs() << "eraseBlock " << BB->getName() << "\n"); + // Note that we cannot use successors of BB because the terminator of BB may // have changed when eraseBlock is called as a BasicBlockCallbackVH callback. // Instead we remove prob data for the block by iterating successors by their diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -1697,6 +1697,8 @@ BranchInst::Create(OnlyDest, Term); Term->eraseFromParent(); DTU->applyUpdatesPermissive(Updates); + if (HasProfileData) + BPI->eraseBlock(BB); // If the condition is now dead due to the removal of the old terminator, // erase it. diff --git a/llvm/test/Transforms/JumpThreading/thread-prob-2.ll b/llvm/test/Transforms/JumpThreading/thread-prob-2.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/JumpThreading/thread-prob-2.ll @@ -0,0 +1,27 @@ +; RUN: opt -debug-only=branch-prob -jump-threading -S %s 2>&1 | FileCheck %s +; REQUIRES: asserts + +; Make sure that we clear edge probabilities for bb.cond as we fold +; the conditional branch in it. + +; CHECK: eraseBlock bb.cond + +define i32 @foo(i1 %cond) !prof !0 { +; CHECK-LABEL: @foo +; CHECK: bb.entry: +; CHECK-NEXT: br i1 %cond, label %bb.31, label %bb.12 +; CHECK-NOT: bb.cond: +bb.entry: + br i1 %cond, label %bb.31, label %bb.cond + +bb.cond: + br i1 %cond, label %bb.31, label %bb.12 + +bb.31: + ret i32 31 + +bb.12: + ret i32 12 +} + +!0 = !{!"function_entry_count", i64 0}