[llvm] a57fe21 - [JumpThreading] Fix branch probabilities in DuplicateCondBranchOnPHIIntoPred()

Yevgeny Rouban via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 16 23:41:38 PST 2020


Author: Yevgeny Rouban
Date: 2020-11-17T14:40:50+07:00
New Revision: a57fe210ff7cf553b721bf08e74df42b0ae1df38

URL: https://github.com/llvm/llvm-project/commit/a57fe210ff7cf553b721bf08e74df42b0ae1df38
DIFF: https://github.com/llvm/llvm-project/commit/a57fe210ff7cf553b721bf08e74df42b0ae1df38.diff

LOG: [JumpThreading] Fix branch probabilities in DuplicateCondBranchOnPHIIntoPred()

When instructions are cloned from block BB to PredBB in the method
DuplicateCondBranchOnPHIIntoPred() number of successors of PredBB
changes from 1 to number of successors of BB. So we have to copy
branch probabilities from BB to PredBB.

Reviewed By: Kazu Hirata

Differential Revision: https://reviews.llvm.org/D90841

Added: 
    llvm/test/Transforms/JumpThreading/thread-prob-3.ll

Modified: 
    llvm/lib/Transforms/Scalar/JumpThreading.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
index df44b3893589..81376e590b4d 100644
--- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp
+++ b/llvm/lib/Transforms/Scalar/JumpThreading.cpp
@@ -2239,12 +2239,8 @@ void JumpThreadingPass::threadThroughTwoBasicBlocks(BasicBlock *PredPredBB,
       cloneInstructions(PredBB->begin(), PredBB->end(), NewBB, PredPredBB);
 
   // Copy the edge probabilities from PredBB to NewBB.
-  if (HasProfileData) {
-    SmallVector<BranchProbability, 4> Probs;
-    for (BasicBlock *Succ : successors(PredBB))
-      Probs.push_back(BPI->getEdgeProbability(PredBB, Succ));
-    BPI->setEdgeProbability(NewBB, Probs);
-  }
+  if (HasProfileData)
+    BPI->copyEdgeProbabilities(PredBB, NewBB);
 
   // Update the terminator of PredPredBB to jump to NewBB instead of PredBB.
   // This eliminates predecessors from PredPredBB, which requires us to simplify
@@ -2674,6 +2670,8 @@ bool JumpThreadingPass::duplicateCondBranchOnPHIIntoPred(
 
   // Remove the unconditional branch at the end of the PredBB block.
   OldPredBranch->eraseFromParent();
+  if (HasProfileData)
+    BPI->copyEdgeProbabilities(BB, PredBB);
   DTU->applyUpdatesPermissive(Updates);
 
   ++NumDupes;

diff  --git a/llvm/test/Transforms/JumpThreading/thread-prob-3.ll b/llvm/test/Transforms/JumpThreading/thread-prob-3.ll
new file mode 100644
index 000000000000..a4a432b1a832
--- /dev/null
+++ b/llvm/test/Transforms/JumpThreading/thread-prob-3.ll
@@ -0,0 +1,29 @@
+; RUN: opt -debug-only=branch-prob -jump-threading -S %s 2>&1 | FileCheck %s
+; REQUIRES: asserts
+
+; Make sure that we set edge probabilities for bb2 as we
+; call DuplicateCondBranchOnPHIIntoPred(bb3, {bb2}).
+;
+; CHECK-LABEL: ---- Branch Probability Info : foo
+; CHECK:      set edge bb2 -> 0 successor probability to 0x7fffffff / 0x80000000 = 100.00%
+; CHECK-NEXT: set edge bb2 -> 1 successor probability to 0x00000001 / 0x80000000 = 0.00%
+define void @foo(i1 %f0, i1 %f1, i1 %f2) !prof !{!"function_entry_count", i64 0} {
+; CHECK-LABEL: @foo(
+bb1:
+  br i1 %f0, label %bb3, label %bb2
+
+bb2:
+; CHECK:      bb2:
+; CHECK-NEXT:   br i1 %f2, label %exit1, label %unreach
+  br label %bb3
+
+bb3:
+  %ph = phi i1 [ %f1, %bb1 ], [ %f2, %bb2 ]
+  br i1 %ph, label %exit1, label %unreach
+
+exit1:
+  ret void
+
+unreach:
+  unreachable
+}


        


More information about the llvm-commits mailing list