[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