[llvm] 2b7ee86 - [JumpThreading] Don't divide by all-zero branch weights (#221846)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 17:11:05 PDT 2026
Author: Timur Baidusenov
Date: 2026-09-08T00:10:59Z
New Revision: 2b7ee868b318f45372933e03d9a22203638e92db
URL: https://github.com/llvm/llvm-project/commit/2b7ee868b318f45372933e03d9a22203638e92db
DIFF: https://github.com/llvm/llvm-project/commit/2b7ee868b318f45372933e03d9a22203638e92db.diff
LOG: [JumpThreading] Don't divide by all-zero branch weights (#221846)
Fixes #192165.
Added:
Modified:
llvm/lib/Transforms/Scalar/JumpThreading.cpp
llvm/test/Transforms/JumpThreading/update-bpi-bfi-unfold-select.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index 7a0542aac83fc..66233407a5548 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -3056,22 +3056,27 @@ bool JumpThreadingPass::tryToUnfoldSelectInCurrBB(BasicBlock *BB) {
assert(Extracted);
uint64_t Denominator =
sum_of(llvm::map_range(BW, StaticCastTo<uint64_t>));
- assert(Denominator > 0 &&
- "At least one of the branch probabilities should be non-zero");
- BranchProbability TrueProb =
- BranchProbability::getBranchProbability(BW[0], Denominator);
- BranchProbability FalseProb =
- BranchProbability::getBranchProbability(BW[1], Denominator);
- SmallVector<BranchProbability, 2> BP = {TrueProb, FalseProb};
-
- if (BPI)
- BPI->setEdgeProbability(BB, BP);
-
- if (BFI) {
- auto BBOrigFreq = BFI->getBlockFreq(BB);
- auto NewBBFreq = BBOrigFreq * TrueProb;
- BFI->setBlockFreq(NewBB, NewBBFreq);
- BFI->setBlockFreq(SplitBB, BBOrigFreq);
+ // Zero branch_weights do not give a hint for getting branch
+ // probabilities, and their sum would be a division-by-zero denominator.
+ if (Denominator > 0) {
+ BranchProbability TrueProb =
+ BranchProbability::getBranchProbability(BW[0], Denominator);
+ BranchProbability FalseProb =
+ BranchProbability::getBranchProbability(BW[1], Denominator);
+ SmallVector<BranchProbability, 2> BP = {TrueProb, FalseProb};
+
+ if (BPI)
+ BPI->setEdgeProbability(BB, BP);
+
+ if (BFI) {
+ auto BBOrigFreq = BFI->getBlockFreq(BB);
+ auto NewBBFreq = BBOrigFreq * TrueProb;
+ BFI->setBlockFreq(NewBB, NewBBFreq);
+ BFI->setBlockFreq(SplitBB, BBOrigFreq);
+ }
+ } else {
+ setExplicitlyUnknownBranchWeightsIfProfiled(*BB->getTerminator(),
+ DEBUG_TYPE);
}
}
SI->eraseFromParent();
diff --git a/llvm/test/Transforms/JumpThreading/update-bpi-bfi-unfold-select.ll b/llvm/test/Transforms/JumpThreading/update-bpi-bfi-unfold-select.ll
index 83edce3d95b76..61ed8dc9296d8 100644
--- a/llvm/test/Transforms/JumpThreading/update-bpi-bfi-unfold-select.ll
+++ b/llvm/test/Transforms/JumpThreading/update-bpi-bfi-unfold-select.ll
@@ -7,6 +7,27 @@
@e = global i32 0, align 4
@a = global i32 0, align 4
+; All-zero branch weights give no probability to derive, and their sum would be
+; a division-by-zero denominator. Say the profile is unknown instead of
+; deriving one from them.
+; CHECK-LABEL: @zero_branch_weights
+; CHECK: br i1 %cond.fr{{.*}}, label %{{.*}}, label %{{.*}}, !prof ![[UNK:[0-9]+]]
+define i32 @zero_branch_weights(i1 %c, i1 %d) !prof !0 {
+entry:
+ br i1 %d, label %a, label %b
+
+a:
+ br label %join
+
+b:
+ br label %join
+
+join:
+ %p = phi i1 [ true, %a ], [ %c, %b ]
+ %s = select i1 %p, i32 0, i32 2, !prof !3
+ ret i32 %s
+}
+
; CHECK-LABEL: @test
define i32 @test() !prof !0 {
bb:
@@ -53,6 +74,8 @@ bb18:
!0 = !{!"function_entry_count", i64 10}
!1 = !{!"branch_weights", i32 5, i32 5}
!2 = !{!"branch_weights", i32 0, i32 10}
+!3 = !{!"branch_weights", i32 0, i32 0}
; CHECK: br i1 %cond.fr{{.*}}, label %{{.*}}, label %{{.*}}, !prof ![[MD:[0-9]+]]
+; CHECK: ![[UNK]] = !{!"unknown", !"jump-threading"}
; CHECK: ![[MD]] = !{!"branch_weights", i32 0, i32 -2147483648}
More information about the llvm-commits
mailing list