[PATCH] D79071: [BPI] Incorrect probability reported in case of mulptiple edges.

Evgeniy via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 29 22:09:51 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rGbb0842a3f11e: [BPI] Incorrect probability reported in case of mulptiple edges. (authored by ebrevnov).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D79071/new/

https://reviews.llvm.org/D79071

Files:
  llvm/lib/Analysis/BranchProbabilityInfo.cpp
  llvm/test/Analysis/BranchProbabilityInfo/switch.ll


Index: llvm/test/Analysis/BranchProbabilityInfo/switch.ll
===================================================================
--- /dev/null
+++ llvm/test/Analysis/BranchProbabilityInfo/switch.ll
@@ -0,0 +1,53 @@
+; RUN: opt < %s -analyze -branch-prob | FileCheck %s
+; RUN: opt < %s -analyze -lazy-branch-prob | FileCheck %s
+; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
+
+declare void @g(i32)
+
+; Check correctness of reported probabilities in case of multiple edges between
+; basic blocks. In this case sum of probabilities over all edges should be
+; returned by BranchProbabilityInfo::getEdgeProbability.
+
+define void @test1(i32 %x) {
+;CHECK: edge entry -> return probability is 0x0ccccccd / 0x80000000 = 10.00%
+;CHECK: edge entry -> bb0 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb0 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb0 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb1 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb1 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb1 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb2 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb2 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge entry -> bb2 probability is 0x26666666 / 0x80000000 = 30.00%
+;CHECK: edge bb0 -> return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
+;CHECK: edge bb1 -> return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
+;CHECK: edge bb2 -> return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
+
+entry:
+  switch i32 %x, label %return [
+    i32 0, label %bb0
+    i32 3, label %bb0
+    i32 6, label %bb0
+    i32 1, label %bb1
+    i32 4, label %bb1
+    i32 7, label %bb1
+    i32 2, label %bb2
+    i32 5, label %bb2
+    i32 8, label %bb2
+  ]
+
+bb0:                                              ; preds = %entry, %entry, %entry
+  tail call void @g(i32 0)
+  br label %return
+
+bb1:                                              ; preds = %entry, %entry, %entry
+  tail call void @g(i32 1)
+  br label %return
+
+bb2:                                              ; preds = %entry, %entry, %entry
+  tail call void @g(i32 2)
+  br label %return
+
+return:                                           ; preds = %bb2, %bb1, %bb0, %entry
+  ret void
+}
Index: llvm/lib/Analysis/BranchProbabilityInfo.cpp
===================================================================
--- llvm/lib/Analysis/BranchProbabilityInfo.cpp
+++ llvm/lib/Analysis/BranchProbabilityInfo.cpp
@@ -936,8 +936,10 @@
                                           const BasicBlock *Dst) const {
   auto Prob = BranchProbability::getZero();
   bool FoundProb = false;
+  uint32_t EdgeCount = 0;
   for (const_succ_iterator I = succ_begin(Src), E = succ_end(Src); I != E; ++I)
     if (*I == Dst) {
+      ++EdgeCount;
       auto MapI = Probs.find(std::make_pair(Src, I.getSuccessorIndex()));
       if (MapI != Probs.end()) {
         FoundProb = true;
@@ -945,7 +947,7 @@
       }
     }
   uint32_t succ_num = std::distance(succ_begin(Src), succ_end(Src));
-  return FoundProb ? Prob : BranchProbability(1, succ_num);
+  return FoundProb ? Prob : BranchProbability(EdgeCount, succ_num);
 }
 
 /// Set the edge probability for a given edge specified by PredBlock and an


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79071.261129.patch
Type: text/x-patch
Size: 3444 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200430/c4d2f725/attachment.bin>


More information about the llvm-commits mailing list