[PATCH] D89088: [MBP] Add whole chain to BlockFilterSet instead of individual BB

Guozhi Wei via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 8 18:14:43 PDT 2020


Carrot created this revision.
Carrot added a reviewer: davidxl.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
Carrot requested review of this revision.

Currently we add individual BB to BlockFilterSet if its frequency satisfies

  LoopFreq / Freq <= LoopToColdBlockRatio

LoopFreq is edge frequency from outside to loop header. LoopToColdBlockRatio is a command line parameter.

It doesn't make sense since we always layout whole chain, not individual BBs.

It may also cause a tricky problem. Sometimes it is possible that the LoopFreq of an inner loop is smaller than LoopFreq of outer loop. So a BB can be in BlockFilterSet of inner loop, but not in BlockFilterSet of outer loop, like .cold in the test case. So it is added to the chain of inner loop. When work on the outer loop, .cold is not added to BlockFilterSet, so the edge to successor .problem is not counted in UnscheduledPredecessors of .problem chain. But other blocks in the inner loop are added BlockFilterSet, so the whole inner loop chain can be layout, and markChainSuccessors is called to decrease UnscheduledPredecessors of following chains. markChainSuccessors calls markBlockSuccessors for every BB, even it is not in BlockFilterSet, like .cold, so .problem chain's UnscheduledPredecessors is decreased, but this edge was not counted on in fillWorkLists, so .problem chain's UnscheduledPredecessors becomes 0 when it still has an unscheduled predecessor .pred! And it causes problems in following various successor BB selection algorithms.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D89088

Files:
  llvm/lib/CodeGen/MachineBlockPlacement.cpp
  llvm/test/CodeGen/X86/block_set.ll


Index: llvm/test/CodeGen/X86/block_set.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/block_set.ll
@@ -0,0 +1,64 @@
+; RUN: llc -mtriple=i686-linux < %s | FileCheck %s
+
+define i1 @block_filter() !prof !22{
+; CHECK-LABEL: block_filter
+; CHECK: %.entry
+; CHECK: %.header1
+; CHECK: %.bb1
+; CHECK: %.header2
+; CHECK: %.latch2
+; CHECK: %.cold
+; CHECK: %.pred
+; CHECK: %.problem
+; CHECK: %.latch1
+; CHECK: %.exit
+.entry:
+  %val0 = call i1 @bar()
+  br label %.header1
+
+.header1:
+  %val1 = call i1 @foo()
+  br i1 %val1, label %.bb1, label %.pred, !prof !2
+
+.bb1:
+  %val11 = call i1 @foo()
+  br i1 %val11, label %.header2, label %.pred, !prof !2
+
+.header2:
+  %val2 = call i1 @foo()
+  br i1 %val2, label %.latch2, label %.cold, !prof !10
+
+.cold:
+  %val4 = call i1 @bar()
+  br i1 %val4, label %.latch2, label %.problem
+
+.latch2:
+  %val5 = call i1 @foo()
+  br i1 %val5, label %.header2, label %.latch1, !prof !1
+
+.pred:
+  %valp = call i1 @foo()
+  br label %.problem
+
+.problem:
+  %val3 = call i1 @foo()
+  br label %.latch1
+
+.latch1:
+  %val6 = call i1 @foo()
+  br i1 %val6, label %.header1, label %.exit, !prof !1
+
+.exit:
+  %val7 = call i1 @foo()
+  ret i1 %val7
+}
+
+declare i1 @foo()
+declare i1 @bar()
+
+!1 = !{!"branch_weights", i32 5, i32 5}
+!2 = !{!"branch_weights", i32 60, i32 40}
+!3 = !{!"branch_weights", i32 90, i32 10}
+!10 = !{!"branch_weights", i32 90, i32 10}
+
+!22 = !{!"function_entry_count", i64 100}
Index: llvm/lib/CodeGen/MachineBlockPlacement.cpp
===================================================================
--- llvm/lib/CodeGen/MachineBlockPlacement.cpp
+++ llvm/lib/CodeGen/MachineBlockPlacement.cpp
@@ -2541,10 +2541,14 @@
                     MBPI->getEdgeProbability(LoopPred, L.getHeader());
 
     for (MachineBasicBlock *LoopBB : L.getBlocks()) {
+      if (LoopBlockSet.count(LoopBB))
+        continue;
       auto Freq = MBFI->getBlockFreq(LoopBB).getFrequency();
       if (Freq == 0 || LoopFreq.getFrequency() / Freq > LoopToColdBlockRatio)
         continue;
-      LoopBlockSet.insert(LoopBB);
+      BlockChain *Chain = BlockToChain[LoopBB];
+      for (MachineBasicBlock *ChainBB : *Chain)
+        LoopBlockSet.insert(ChainBB);
     }
   } else
     LoopBlockSet.insert(L.block_begin(), L.block_end());


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89088.297083.patch
Type: text/x-patch
Size: 2356 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201009/9a450598/attachment.bin>


More information about the llvm-commits mailing list