[llvm] [BOLT] Add sink block to flow CFG in profile inference (PR #95047)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 12 21:34:34 PDT 2024


================
@@ -309,23 +309,28 @@ createFlowFunction(const BinaryFunction::BasicBlockOrderType &BlockOrder) {
   FlowFunction Func;
 
   // Add a special "dummy" source so that there is always a unique entry point.
-  // Because of the extra source, for all other blocks in FlowFunction it holds
-  // that Block.Index == BB->getIndex() + 1
   FlowBlock EntryBlock;
   EntryBlock.Index = 0;
   Func.Blocks.push_back(EntryBlock);
 
-  // Create FlowBlock for every basic block in the binary function
+  // Create FlowBlock for every basic block in the binary function.
   for (const BinaryBasicBlock *BB : BlockOrder) {
     Func.Blocks.emplace_back();
     FlowBlock &Block = Func.Blocks.back();
     Block.Index = Func.Blocks.size() - 1;
+    Block.IsExit = BB->successors().empty();
     (void)BB;
     assert(Block.Index == BB->getIndex() + 1 &&
            "incorrectly assigned basic block index");
   }
 
-  // Create FlowJump for each jump between basic blocks in the binary function
+  // Add a special "dummy" sink block so there is always a unique sink.
----------------
WenleiHe wrote:

I don't see why do we need BinaryBasicBlock info in profi. So we construct a CFG represented with flow blocks first. BinaryBasicBlock is only used during CFG construction like it is now. Then within profi, if we find multiple exit blocks (no successors) in that CFG, we just connect these exit blocks into a dummy sink block, without needing info from original BinaryBasicBlock. 

https://github.com/llvm/llvm-project/pull/95047


More information about the llvm-commits mailing list