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

shaw young via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 13 09:31:02 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.
----------------
shawbyoung wrote:

We would need binary block info because the condition "block has no successors" does not fully encompass our definition of "exit blocks". For instance, there are landing pads flow blocks that have cfg successors but call/transitively std::terminate or some other function that transfers control back outside of the function, thus qualifying it as an exit block. We need binary block information to parse through instructions and identify these calls. I plan to cover these degenerate cases in a following commit. 

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


More information about the llvm-commits mailing list