Index: llvm/lib/Transforms/Scalar/JumpThreading.cpp =================================================================== --- llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ llvm/lib/Transforms/Scalar/JumpThreading.cpp @@ -214,11 +214,16 @@ if (!CondBr) return; - BranchProbability BP; uint64_t TrueWeight, FalseWeight; if (!CondBr->extractProfMetadata(TrueWeight, FalseWeight)) return; + if (TrueWeight + FalseWeight == 0) + // Zero branch_weights do not give a hint for getting branch probabilities. + // Technically it would result in division by zero denominator, which is + // TrueWeight + FalseWeight. + return; + // Returns the outgoing edge of the dominating predecessor block // that leads to the PhiNode's incoming block: auto GetPredOutEdge = @@ -253,10 +258,11 @@ if (!CI || !CI->getType()->isIntegerTy(1)) continue; - BP = (CI->isOne() ? BranchProbability::getBranchProbability( - TrueWeight, TrueWeight + FalseWeight) - : BranchProbability::getBranchProbability( - FalseWeight, TrueWeight + FalseWeight)); + BranchProbability BP = + (CI->isOne() ? BranchProbability::getBranchProbability( + TrueWeight, TrueWeight + FalseWeight) + : BranchProbability::getBranchProbability( + FalseWeight, TrueWeight + FalseWeight)); auto PredOutEdge = GetPredOutEdge(PN->getIncomingBlock(i), BB); if (!PredOutEdge.first) Index: llvm/test/Transforms/JumpThreading/threading_prof3.ll =================================================================== --- /dev/null +++ llvm/test/Transforms/JumpThreading/threading_prof3.ll @@ -0,0 +1,30 @@ +; RUN: opt -jump-threading -S < %s | FileCheck %s +; RUN: opt -passes=jump-threading -S < %s | FileCheck %s + +; Check that all zero branch weights do not cause a crash. +define void @zero_branch_weights(i32 %tmp, i32 %tmp3) { +bb: + %tmp1 = icmp eq i32 %tmp, 1 + br i1 %tmp1, label %bb5, label %bb2 +; CHECK-NOT: br i1 %tmp1,{{.*}} !prof + +bb2: + %tmp4 = icmp ne i32 %tmp3, 1 + br label %bb5 +; CHECK: br i1 %tmp4, {{.*}} !prof ![[PROF:[0-9]+]] + +bb5: + %tmp6 = phi i1 [ false, %bb ], [ %tmp4, %bb2 ] + br i1 %tmp6, label %bb8, label %bb7, !prof !{!"branch_weights", i32 0, i32 0} + +bb7: + br label %bb9 + +bb8: + br label %bb9 + +bb9: + ret void +} + +;CHECK: ![[PROF]] = !{!"branch_weights", i32 0, i32 0}