LLVM 24.0.0git
BasicBlockSections.cpp
Go to the documentation of this file.
1//===-- BasicBlockSections.cpp ---=========--------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// BasicBlockSections implementation.
10//
11// The purpose of this pass is to assign sections to basic blocks when
12// -fbasic-block-sections= option is used. Further, with profile information
13// only the subset of basic blocks with profiles are placed in separate sections
14// and the rest are grouped in a cold section. The exception handling blocks are
15// treated specially to ensure they are all in one seciton.
16//
17// This pass also implements machine function splitting
18// (-function-splitting=all). Functions without a basic block sections profile
19// are split using PGO/AutoFDO profiles: cold blocks are moved into a separate
20// section with the symbol `foo.cold`.
21//
22// Basic Block Sections
23// ====================
24//
25// With option, -fbasic-block-sections=list, every function may be split into
26// clusters of basic blocks. Every cluster will be emitted into a separate
27// section with its basic blocks sequenced in the given order. To get the
28// optimized performance, the clusters must form an optimal BB layout for the
29// function. We insert a symbol at the beginning of every cluster's section to
30// allow the linker to reorder the sections in any arbitrary sequence. A global
31// order of these sections would encapsulate the function layout.
32// For example, consider the following clusters for a function foo (consisting
33// of 6 basic blocks 0, 1, ..., 5).
34//
35// 0 2
36// 1 3 5
37//
38// * Basic blocks 0 and 2 are placed in one section with symbol `foo`
39// referencing the beginning of this section.
40// * Basic blocks 1, 3, 5 are placed in a separate section. A new symbol
41// `foo.__part.1` will reference the beginning of this section.
42// * Basic block 4 (note that it is not referenced in the list) is placed in
43// one section, and a new symbol `foo.cold` will point to it.
44//
45// There are a couple of challenges to be addressed:
46//
47// 1. The last basic block of every cluster should not have any implicit
48// fallthrough to its next basic block, as it can be reordered by the linker.
49// The compiler should make these fallthroughs explicit by adding
50// unconditional jumps..
51//
52// 2. All inter-cluster branch targets would now need to be resolved by the
53// linker as they cannot be calculated during compile time. This is done
54// using static relocations. Further, the compiler tries to use short branch
55// instructions on some ISAs for small branch offsets. This is not possible
56// for inter-cluster branches as the offset is not determined at compile
57// time, and therefore, long branch instructions have to be used for those.
58//
59// 3. Debug Information (DebugInfo) and Call Frame Information (CFI) emission
60// needs special handling with basic block sections. DebugInfo needs to be
61// emitted with more relocations as basic block sections can break a
62// function into potentially several disjoint pieces, and CFI needs to be
63// emitted per cluster. This also bloats the object file and binary sizes.
64//
65// Basic Block Address Map
66// ==================
67//
68// With -fbasic-block-address-map, we emit the offsets of BB addresses of
69// every function into the .llvm_bb_addr_map section. Along with the function
70// symbols, this allows for mapping of virtual addresses in PMU profiles back to
71// the corresponding basic blocks. This logic is implemented in AsmPrinter. This
72// pass only assigns the BBSectionType of every function to ``labels``.
73//
74// Machine Function Splitting
75// ==========================
76//
77// With -function-splitting=all, functions without a basic block sections
78// profile are split using PGO/AutoFDO profiles. Blocks deemed cold are placed
79// in a separate section prefixed with ".text.split." (see
80// -bbsections-cold-text-prefix), referenced by the symbol `foo.cold`. Grouping
81// cold blocks across functions decreases fragmentation and improves icache and
82// iTLB utilization. Such functions get the BBSectionType ``Preset``.
83//
84// For the original RFC of machine function splitting please see
85// https://groups.google.com/d/msg/llvm-dev/RUegaMg-iqc/wFAVxa6fCgAJ
86//
87//===----------------------------------------------------------------------===//
88
90#include "llvm/ADT/StringRef.h"
101#include "llvm/CodeGen/Passes.h"
103#include "llvm/IR/Function.h"
109#include <optional>
110
111using namespace llvm;
112
113// Placing the cold clusters in a separate section mitigates against poor
114// profiles and allows optimizations such as hugepage mapping to be applied at a
115// section granularity. Defaults to ".text.split." which is recognized by lld
116// via the `-z keep-text-section-prefix` flag.
118 "bbsections-cold-text-prefix",
119 cl::desc("The text prefix to use for cold basic block clusters"),
120 cl::init(".text.split."), cl::Hidden);
121
123 "bbsections-detect-source-drift",
124 cl::desc("This checks if there is a fdo instr. profile hash "
125 "mismatch for this function"),
126 cl::init(true), cl::Hidden);
127
128// FIXME: This cutoff value is CPU dependent and should be moved to
129// TargetTransformInfo once we consider enabling this on other platforms.
130// The value is expressed as a ProfileSummaryInfo integer percentile cutoff.
131// Defaults to 999950, i.e. all blocks colder than 99.995 percentile are split.
132// The default was empirically determined to be optimal when considering cutoff
133// values between 99%-ile to 100%-ile with respect to iTLB and icache metrics on
134// Intel CPUs.
136 PercentileCutoff("mfs-psi-cutoff",
137 cl::desc("Percentile profile summary cutoff used to "
138 "determine cold blocks. Unused if set to zero."),
139 cl::init(999950), cl::Hidden);
140
142 "mfs-count-threshold",
143 cl::desc(
144 "Minimum number of times a block must be executed to be retained."),
145 cl::init(1), cl::Hidden);
146
148 "mfs-split-ehcode",
149 cl::desc("Splits all EH code and it's descendants by default."),
150 cl::init(false), cl::Hidden);
151
152namespace {
153
154class BasicBlockSections : public MachineFunctionPass {
155public:
156 static char ID;
157
158 explicit BasicBlockSections(bool SplitWithPGO = false)
159 : MachineFunctionPass(ID), SplitWithPGO(SplitWithPGO) {
161 }
162
163 StringRef getPassName() const override {
164 return "Basic Block Sections Transformation";
165 }
166
167 void getAnalysisUsage(AnalysisUsage &AU) const override;
168
169 /// Identify basic blocks that need separate sections and prepare to emit them
170 /// accordingly.
171 bool runOnMachineFunction(MachineFunction &MF) override;
172
173private:
174 bool handleBBSections(MachineFunction &MF);
175 bool handleBBAddrMap(MachineFunction &MF);
176 bool shouldSplitWithPGO(MachineFunction &MF);
177 void assignColdSectionWithPGO(MachineFunction &MF);
178
179 // Whether functions without a basic block sections profile are split using
180 // PGO/AutoFDO profiles (-function-splitting=all).
181 const bool SplitWithPGO;
182};
183
184} // end anonymous namespace
185
186char BasicBlockSections::ID = 0;
188 BasicBlockSections, "bbsections-prepare",
189 "Prepares for basic block sections, by splitting functions "
190 "into clusters of basic blocks.",
191 false, false)
195INITIALIZE_PASS_END(BasicBlockSections, "bbsections-prepare",
196 "Prepares for basic block sections, by splitting functions "
197 "into clusters of basic blocks.",
199
200// This function updates and optimizes the branching instructions of every basic
201// block in a given function to account for changes in the layout.
202static void
204 const SmallVector<MachineBasicBlock *> &PreLayoutFallThroughs) {
205 const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
207 for (auto &MBB : MF) {
208 auto NextMBBI = std::next(MBB.getIterator());
209 auto *FTMBB = PreLayoutFallThroughs[MBB.getNumber()];
210 // If this block had a fallthrough before we need an explicit unconditional
211 // branch to that block if either
212 // 1- the block ends a section, which means its next block may be
213 // reorderd by the linker, or
214 // 2- the fallthrough block is not adjacent to the block in the new
215 // order.
216 if (FTMBB && (MBB.isEndSection() || &*NextMBBI != FTMBB))
217 TII->insertUnconditionalBranch(MBB, FTMBB, MBB.findBranchDebugLoc());
218
219 // We do not optimize branches for machine basic blocks ending sections, as
220 // their adjacent block might be reordered by the linker.
221 if (MBB.isEndSection())
222 continue;
223
224 // It might be possible to optimize branches by flipping the branch
225 // condition.
226 Cond.clear();
227 MachineBasicBlock *TBB = nullptr, *FBB = nullptr; // For analyzeBranch.
228 if (TII->analyzeBranch(MBB, TBB, FBB, Cond))
229 continue;
230 MBB.updateTerminator(FTMBB);
231 }
232}
233
234// This function generates the machine basic block clusters of "hot" blocks.
235// Currently, only support one cluster creation.
236// TODO: Support multi-cluster creation and path cloning.
240 SmallVector<BBClusterInfo> BBClusterInfos;
241 auto OptWeightInfo = BMI.getWeightInfo(MF.getName());
242 if (!OptWeightInfo)
243 return BBClusterInfos;
244 auto BlockWeights = OptWeightInfo->BlockWeights;
245 auto EdgeWeights = OptWeightInfo->EdgeWeights;
246
248 if (MF.size() <= 2) {
249 for (auto &MBB : MF) {
250 if (MBB.isEntryBlock() || BlockWeights[&MBB] > 0) {
251 HotMBBs.push_back(&MBB);
252 }
253 }
254 } else {
255 SmallVector<uint64_t, 0> BlockSizes(MF.size());
256 SmallVector<uint64_t, 0> BlockCounts(MF.size());
257 std::vector<const MachineBasicBlock *> OrigOrder;
258 OrigOrder.reserve(MF.size());
260
261 // Renumber blocks for running the layout algorithm.
262 MF.RenumberBlocks();
263
264 // Init the MBB size and count.
265 for (auto &MBB : MF) {
266 auto NonDbgInsts =
267 instructionsWithoutDebug(MBB.instr_begin(), MBB.instr_end());
268 int NumInsts = std::distance(NonDbgInsts.begin(), NonDbgInsts.end());
269 BlockSizes[MBB.getNumber()] = 4 * NumInsts;
270 BlockCounts[MBB.getNumber()] = BlockWeights[&MBB];
271 OrigOrder.push_back(&MBB);
272 }
273
274 // Init the edge count.
275 for (auto &MBB : MF) {
276 for (auto *Succ : MBB.successors()) {
277 auto EdgeWeight = EdgeWeights[std::make_pair(&MBB, Succ)];
278 JumpCounts.push_back({static_cast<uint64_t>(MBB.getNumber()),
279 static_cast<uint64_t>(Succ->getNumber()),
280 EdgeWeight});
281 }
282 }
283
284 // Run the layout algorithm.
285 auto Result = computeExtTspLayout(BlockSizes, BlockCounts, JumpCounts);
286 for (uint64_t R : Result) {
287 auto Block = OrigOrder[R];
288 if (Block->isEntryBlock() || BlockWeights[Block] > 0)
289 HotMBBs.push_back(Block);
290 }
291 }
292
293 // Generate the "hot" basic block cluster.
294 if (!HotMBBs.empty()) {
295 unsigned CurrentPosition = 0;
296 for (auto &MBB : HotMBBs) {
297 if (MBB->getBBID()) {
298 BBClusterInfos.push_back({*(MBB->getBBID()), 0, CurrentPosition++});
299 }
300 }
301 }
302 return BBClusterInfos;
303}
304
305// This function sorts basic blocks according to the cluster's information.
306// All explicitly specified clusters of basic blocks will be ordered
307// accordingly. All non-specified BBs go into a separate "Cold" section.
308// Additionally, if exception handling landing pads end up in more than one
309// clusters, they are moved into a single "Exception" section. Eventually,
310// clusters are ordered in increasing order of their IDs, with the "Exception"
311// and "Cold" succeeding all other clusters. With -function-splitting=none, all
312// basic blocks stay in the default section instead.
313// FuncClusterInfo represents the cluster information for basic blocks. It
314// maps from BBID of basic blocks to their cluster information.
315static void
317 const DenseMap<UniqueBBID, BBClusterInfo> &FuncClusterInfo) {
318 assert(MF.hasBBSections() && "BB Sections is not set for function.");
319 // With function splitting disabled, the profile only decides the layout and
320 // the function is emitted as a single section.
323 return;
324 // This variable stores the section ID of the cluster containing eh_pads (if
325 // all eh_pads are one cluster). If more than one cluster contain eh_pads, we
326 // set it equal to ExceptionSectionID.
327 std::optional<MBBSectionID> EHPadsSectionID;
328
329 for (auto &MBB : MF) {
330 // With the 'all' option, every basic block is placed in a unique section.
331 // With the 'list' option, every basic block is placed in a section
332 // associated with its cluster.
334 // If unique sections are desired for all basic blocks of the function, we
335 // set every basic block's section ID equal to its original position in
336 // the layout (which is equal to its number). This ensures that basic
337 // blocks are ordered canonically.
338 MBB.setSectionID(MBB.getNumber());
339 } else {
340 auto I = FuncClusterInfo.find(*MBB.getBBID());
341 if (I != FuncClusterInfo.end()) {
342 MBB.setSectionID(I->second.ClusterID);
343 } else {
344 const TargetInstrInfo &TII =
345 *MBB.getParent()->getSubtarget().getInstrInfo();
346
347 if (TII.isMBBSafeToSplitToCold(MBB)) {
348 // BB goes into the special cold section if it is not specified in the
349 // cluster info map. If it is not safe to split, it is kept in the
350 // default section.
351 MBB.setSectionID(MBBSectionID::ColdSectionID);
352 }
353 }
354 }
355
356 if (MBB.isEHPad() && EHPadsSectionID != MBB.getSectionID() &&
357 EHPadsSectionID != MBBSectionID::ExceptionSectionID) {
358 // If we already have one cluster containing eh_pads, this must be updated
359 // to ExceptionSectionID. Otherwise, we set it equal to the current
360 // section ID.
361 EHPadsSectionID = EHPadsSectionID ? MBBSectionID::ExceptionSectionID
362 : MBB.getSectionID();
363 }
364 }
365
366 // If EHPads are in more than one section, this places all of them in the
367 // special exception section.
368 if (EHPadsSectionID == MBBSectionID::ExceptionSectionID)
369 for (auto &MBB : MF)
370 if (MBB.isEHPad())
371 MBB.setSectionID(*EHPadsSectionID);
372}
373
376 [[maybe_unused]] const MachineBasicBlock *EntryBlock = &MF.front();
377 SmallVector<MachineBasicBlock *> PreLayoutFallThroughs(MF.getNumBlockIDs());
378 for (auto &MBB : MF)
379 PreLayoutFallThroughs[MBB.getNumber()] =
380 MBB.getFallThrough(/*JumpToFallThrough=*/false);
381
382 MF.sort(MBBCmp);
383 assert(&MF.front() == EntryBlock &&
384 "Entry block should not be displaced by basic block sections");
385
386 // Set IsBeginSection and IsEndSection according to the assigned section IDs.
388
389 // After reordering basic blocks, we must update basic block branches to
390 // insert explicit fallthrough branches when required and optimize branches
391 // when possible.
392 updateBranches(MF, PreLayoutFallThroughs);
393}
394
395// If the exception section begins with a landing pad, that landing pad will
396// assume a zero offset (relative to @LPStart) in the LSDA. However, a value of
397// zero implies "no landing pad." This function inserts a NOP just before the EH
398// pad label to ensure a nonzero offset.
400 std::optional<MBBSectionID> CurrentSection;
401 auto IsFirstNonEmptyBBInSection = [&](const MachineBasicBlock &MBB) {
402 if (MBB.getFirstNonDebugInstr() == MBB.end() ||
403 MBB.getSectionID() == CurrentSection)
404 return false;
405 CurrentSection = MBB.getSectionID();
406 return true;
407 };
408
409 for (auto &MBB : MF) {
410 if (IsFirstNonEmptyBBInSection(MBB) && MBB.isEHPad()) {
412 while (!MI->isEHLabel())
413 ++MI;
415 }
416 }
417}
418
421 return false;
422
423 const char MetadataName[] = "instr_prof_hash_mismatch";
424 auto *Existing = MF.getFunction().getMetadata(LLVMContext::MD_annotation);
425 if (Existing) {
426 MDTuple *Tuple = cast<MDTuple>(Existing);
427 for (const auto &N : Tuple->operands())
428 if (N.equalsStr(MetadataName))
429 return true;
430 }
431
432 return false;
433}
434
435/// setDescendantEHBlocksCold - This splits all EH pads and blocks reachable
436/// only by EH pad as cold. This will help mark EH pads statically cold
437/// instead of relying on profile data.
440 computeEHOnlyBlocks(MF, EHBlocks);
441 for (auto Block : EHBlocks) {
442 Block->setSectionID(MBBSectionID::ColdSectionID);
443 }
444}
445
447 const MachineBlockFrequencyInfo *MBFI,
448 ProfileSummaryInfo *PSI) {
449 std::optional<uint64_t> Count = MBFI->getBlockProfileCount(&MBB);
450 // For instrumentation profiles and sample profiles, we use different ways
451 // to judge whether a block is cold and should be split.
453 // If using instrument profile, which is deemed "accurate", no count means
454 // cold.
455 if (!Count)
456 return true;
457 if (PercentileCutoff > 0)
459 // Fallthrough to end of function.
460 } else if (PSI->hasSampleProfile()) {
461 // For sample profile, no count means "do not judege coldness".
462 if (!Count)
463 return false;
464 }
465
466 return (*Count < ColdCountThreshold);
467}
468
469// Returns whether a function which does not have a basic block sections profile
470// should be split using its PGO/AutoFDO profile.
471bool BasicBlockSections::shouldSplitWithPGO(MachineFunction &MF) {
472 if (!SplitWithPGO || skipFunction(MF.getFunction()))
473 return false;
474
475 // We target functions with profile data. Static information in the form
476 // of exception handling code may be split to cold if user passes the
477 // mfs-split-ehcode flag.
479 return false;
480
481 const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
482 if (!TII.isFunctionSafeToSplit(MF))
483 return false;
484
485 // Do not split functions which are in the basic block sections profile, even
486 // if their profile is not used due to source drift.
487 if (MF.getTarget().getBBSectionsType() == BasicBlockSection::List &&
488 getAnalysis<BasicBlockSectionsProfileReaderWrapperPass>()
489 .getBBSPR()
490 .isFunctionHot(MF.getName()))
491 return false;
492
493 return true;
494}
495
496// Splits a function using its PGO/AutoFDO profile: assigns the cold section to
497// cold blocks, and the default section to all the other blocks.
498void BasicBlockSections::assignColdSectionWithPGO(MachineFunction &MF) {
499 MF.setBBSectionsType(BasicBlockSection::Preset);
500
501 const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();
502 bool UseProfileData = MF.getFunction().hasProfileData();
503 MachineBlockFrequencyInfo *MBFI = nullptr;
504 ProfileSummaryInfo *PSI = nullptr;
505 if (UseProfileData) {
506 MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
507 PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
508 // If we don't have a good profile (sample profile is not deemed
509 // as a "good profile") and the function is not hot, then early
510 // return. (Because we can only trust hot functions when profile
511 // quality is not good.)
512 if (PSI->hasSampleProfile() && !PSI->isFunctionHotInCallGraph(&MF, *MBFI)) {
513 // Split all EH code and it's descendant statically by default.
514 if (SplitAllEHCode)
516 return;
517 }
518 }
519
521 for (auto &MBB : MF) {
522 if (MBB.isEntryBlock())
523 continue;
524
525 if (MBB.isEHPad())
526 LandingPads.push_back(&MBB);
527 else if (UseProfileData && isColdBlock(MBB, MBFI, PSI) &&
528 TII.isMBBSafeToSplitToCold(MBB) && !SplitAllEHCode)
530 }
531
532 // Split all EH code and it's descendant statically by default.
533 if (SplitAllEHCode)
535 // We only split out eh pads if all of them are cold.
536 else {
537 // Here we have UseProfileData == true.
538 bool HasHotLandingPads = false;
539 for (const MachineBasicBlock *LP : LandingPads) {
540 if (!isColdBlock(*LP, MBFI, PSI) || !TII.isMBBSafeToSplitToCold(*LP))
541 HasHotLandingPads = true;
542 }
543 if (!HasHotLandingPads) {
544 for (MachineBasicBlock *LP : LandingPads)
545 LP->setSectionID(MBBSectionID::ColdSectionID);
546 }
547 }
548}
549
550// Identify, arrange, and modify basic blocks which need separate sections
551// according to the specification provided by the -fbasic-block-sections flag,
552// or according to the PGO/AutoFDO profile with -function-splitting=all.
553bool BasicBlockSections::handleBBSections(MachineFunction &MF) {
554 auto BBSectionsType = MF.getTarget().getBBSectionsType();
555
556 DenseMap<UniqueBBID, BBClusterInfo> FuncClusterInfo;
557 // Check for source drift. If the source has changed since the profiles
558 // were obtained, optimizing basic blocks might be sub-optimal.
559 // This only applies to BasicBlockSection::List as it creates
560 // clusters of basic blocks using basic block ids. Source drift can
561 // invalidate these groupings leading to sub-optimal code generation with
562 // regards to performance.
563 if (BBSectionsType == BasicBlockSection::List &&
566 if (auto *BMI = getAnalysisIfAvailable<BasicBlockMatchingAndInference>()) {
568 } else {
569 ClusterInfo = getAnalysis<BasicBlockSectionsProfileReaderWrapperPass>()
570 .getClusterInfoForFunction(MF.getName());
571 }
572 for (auto &BBClusterInfo : ClusterInfo) {
573 FuncClusterInfo.try_emplace(BBClusterInfo.BBID, BBClusterInfo);
574 }
575 }
576
577 // A function without a basic block sections profile is split using its
578 // PGO/AutoFDO profile, if enabled.
579 const bool UsePGO =
580 BBSectionsType == BasicBlockSection::None ||
581 (BBSectionsType == BasicBlockSection::List && FuncClusterInfo.empty());
582 if (UsePGO && !shouldSplitWithPGO(MF))
583 return false;
584
585 // Renumber blocks before assigning sections and sorting them. This is useful
586 // for accessing the original layout positions and finding the original
587 // fallthroughs. Blocks which are not in any cluster keep their original
588 // order, which retains decisions made by prior passes such as
589 // MachineBlockPlacement.
590 MF.RenumberBlocks();
591
592 if (UsePGO) {
593 assignColdSectionWithPGO(MF);
594 } else {
595 MF.setBBSectionsType(BBSectionsType);
596 assignSections(MF, FuncClusterInfo);
597 }
598
599 const MachineBasicBlock &EntryBB = MF.front();
600 auto EntryBBSectionID = EntryBB.getSectionID();
601
602 // Helper function for ordering BB sections as follows:
603 // * Entry section (section including the entry block).
604 // * Regular sections (in increasing order of their Number).
605 // ...
606 // * Exception section
607 // * Cold section
608 auto MBBSectionOrder = [EntryBBSectionID](const MBBSectionID &LHS,
609 const MBBSectionID &RHS) {
610 // We make sure that the section containing the entry block precedes all the
611 // other sections.
612 if (LHS == EntryBBSectionID || RHS == EntryBBSectionID)
613 return LHS == EntryBBSectionID;
614 return LHS.Type == RHS.Type ? LHS.Number < RHS.Number : LHS.Type < RHS.Type;
615 };
616
617 // We sort all basic blocks to make sure the basic blocks of every cluster are
618 // contiguous and ordered accordingly. Furthermore, clusters are ordered in
619 // increasing order of their section IDs, with the exception and the
620 // cold section placed at the end of the function.
621 // Also, we force the entry block of the function to be placed at the
622 // beginning of the function, regardless of the requested order.
623 auto Comparator = [&](const MachineBasicBlock &X,
624 const MachineBasicBlock &Y) {
625 auto XSectionID = X.getSectionID();
626 auto YSectionID = Y.getSectionID();
627 if (XSectionID != YSectionID)
628 return MBBSectionOrder(XSectionID, YSectionID);
629 // Make sure that the entry block is placed at the beginning.
630 if (&X == &EntryBB || &Y == &EntryBB)
631 return &X == &EntryBB;
632 // If the two basic blocks are in the same section, the order is decided by
633 // their cluster and their position within the cluster. A section holds more
634 // than one cluster only with -function-splitting=none. Basic blocks which
635 // are not in any cluster come after all the profiled basic blocks of the
636 // section, in their original order. Without a basic block sections profile,
637 // all basic blocks keep their original order (they might not have BBIDs).
638 if (XSectionID.Type == MBBSectionID::SectionType::Default &&
639 !FuncClusterInfo.empty()) {
640 auto XI = FuncClusterInfo.find(*X.getBBID());
641 auto YI = FuncClusterInfo.find(*Y.getBBID());
642 bool XInCluster = XI != FuncClusterInfo.end();
643 bool YInCluster = YI != FuncClusterInfo.end();
644 if (XInCluster != YInCluster)
645 return XInCluster;
646 if (XInCluster)
647 return std::tie(XI->second.ClusterID, XI->second.PositionInCluster) <
648 std::tie(YI->second.ClusterID, YI->second.PositionInCluster);
649 }
650 return X.getNumber() < Y.getNumber();
651 };
652
653 sortBasicBlocksAndUpdateBranches(MF, Comparator);
655 return true;
656}
657
658// When the BB address map needs to be generated, this renumbers basic blocks to
659// make them appear in increasing order of their IDs in the function. This
660// avoids the need to store basic block IDs in the BB address map section, since
661// they can be determined implicitly.
662bool BasicBlockSections::handleBBAddrMap(MachineFunction &MF) {
663 if (!MF.getTarget().Options.BBAddrMap)
664 return false;
665 MF.RenumberBlocks();
666 return true;
667}
668
669bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
670 // First handle the basic block sections.
671 auto R1 = handleBBSections(MF);
672 // Handle basic block address map after basic block sections are finalized.
673 auto R2 = handleBBAddrMap(MF);
674 return R1 || R2;
675}
676
677void BasicBlockSections::getAnalysisUsage(AnalysisUsage &AU) const {
678 AU.setPreservesAll();
679 AU.addRequired<BasicBlockSectionsProfileReaderWrapperPass>();
680 if (SplitWithPGO) {
681 AU.addRequired<MachineBlockFrequencyInfoWrapperPass>();
682 AU.addRequired<ProfileSummaryInfoWrapperPass>();
683 }
684 AU.addUsedIfAvailable<BasicBlockMatchingAndInference>();
685 AU.addUsedIfAvailable<MachineDominatorTreeWrapperPass>();
686 AU.addUsedIfAvailable<MachinePostDominatorTreeWrapperPass>();
688}
689
691 return new BasicBlockSections(SplitWithPGO);
692}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
uint64_t uint64_t
MachineBasicBlock & MBB
static bool isColdBlock(const MachineBasicBlock &MBB, const MachineBlockFrequencyInfo *MBFI, ProfileSummaryInfo *PSI)
static cl::opt< unsigned > ColdCountThreshold("mfs-count-threshold", cl::desc("Minimum number of times a block must be executed to be retained."), cl::init(1), cl::Hidden)
static void assignSections(MachineFunction &MF, const DenseMap< UniqueBBID, BBClusterInfo > &FuncClusterInfo)
static cl::opt< bool > BBSectionsDetectSourceDrift("bbsections-detect-source-drift", cl::desc("This checks if there is a fdo instr. profile hash " "mismatch for this function"), cl::init(true), cl::Hidden)
static void setDescendantEHBlocksCold(MachineFunction &MF)
setDescendantEHBlocksCold - This splits all EH pads and blocks reachable only by EH pad as cold.
bbsections Prepares for basic block by splitting functions into clusters of basic static false void updateBranches(MachineFunction &MF, const SmallVector< MachineBasicBlock * > &PreLayoutFallThroughs)
static cl::opt< unsigned > PercentileCutoff("mfs-psi-cutoff", cl::desc("Percentile profile summary cutoff used to " "determine cold blocks. Unused if set to zero."), cl::init(999950), cl::Hidden)
static cl::opt< bool > SplitAllEHCode("mfs-split-ehcode", cl::desc("Splits all EH code and it's descendants by default."), cl::init(false), cl::Hidden)
static SmallVector< BBClusterInfo > createBBClusterInfoForFunction(MachineFunction &MF, const BasicBlockMatchingAndInference &BMI)
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
Declares methods and data structures for code layout algorithms.
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
#define R2(n)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
Value * RHS
Value * LHS
AnalysisUsage & addUsedIfAvailable()
Add the specified Pass class to the set of analyses used by this pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
std::optional< WeightInfo > getWeightInfo(StringRef FuncName) const
bool empty() const
Definition DenseMap.h:716
iterator find(const_arg_type_t< KeyT > Val)
Definition DenseMap.h:766
iterator end()
Definition DenseMap.h:686
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:856
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
bool hasProfileData() const
Return true if the function is annotated with profile data.
Definition Function.h:313
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
Tuple of metadata.
Definition Metadata.h:1496
bool isEHPad() const
Returns true if the block is a landing pad.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
LLVM_ABI bool isEntryBlock() const
Returns true if this is the entry block of the function.
void setSectionID(MBBSectionID V)
Sets the section ID for this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
LLVM_ABI std::optional< uint64_t > getBlockProfileCount(const MachineBasicBlock *MBB) const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
void setBBSectionsType(BasicBlockSection V)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
Function & getFunction()
Return the LLVM function that this machine code represents.
unsigned getNumBlockIDs() const
getNumBlockIDs - Return the number of MBB ID's allocated.
void RenumberBlocks(MachineBasicBlock *MBBFrom=nullptr)
RenumberBlocks - This discards all of the MachineBasicBlock numbers and recomputes them.
const MachineBasicBlock & front() const
void assignBeginEndSections()
Assign IsBeginSection IsEndSection fields for basic blocks in this function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
bool hasCSInstrumentationProfile() const
Returns true if module M has context sensitive instrumentation profile.
bool hasInstrumentationProfile() const
Returns true if module M has instrumentation profile.
bool hasSampleProfile() const
Returns true if module M has sample profile.
LLVM_ABI bool isColdCountNthPercentile(int PercentileCutoff, uint64_t C) const
Returns true if count C is considered cold with regard to a given cold percentile cutoff value.
bool isFunctionHotInCallGraph(const FuncT *F, BFIT &BFI) const
Returns true if F contains hot code.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetInstrInfo - Interface to description of machine instruction set.
virtual void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const
Insert a noop into the instruction stream at the specified point.
TargetOptions Options
llvm::BasicBlockSection getBBSectionsType() const
If basic blocks should be emitted into their own section, corresponding to -fbasic-block-sections.
FunctionSplittingMode FunctionSplitting
Which functions are eligible for late function splitting.
virtual const TargetInstrInfo * getInstrInfo() const
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI MachineFunctionPass * createBasicBlockSectionsPass(bool SplitWithPGO=false)
createBasicBlockSections Pass - This pass assigns sections to machine basic blocks and is enabled wit...
LLVM_ABI void initializeBasicBlockSectionsPass(PassRegistry &)
static void computeEHOnlyBlocks(FunctionT &F, DenseSet< BlockT * > &EHBlocks)
Compute a list of blocks that are only reachable via EH paths.
Definition EHUtils.h:18
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
auto instructionsWithoutDebug(IterT It, IterT End, bool SkipPseudoOp=true)
Construct a range iterator which begins at It and moves forwards until End is reached,...
LLVM_ABI bool hasInstrProfHashMismatch(MachineFunction &MF)
This checks if the source of this function has drifted since this binary was profiled previously.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
SmallPtrSet< SUnit *, 8 > ClusterInfo
Keep record of which SUnit are in the same cluster group.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI void avoidZeroOffsetLandingPad(MachineFunction &MF)
LLVM_ABI cl::opt< std::string > BBSectionsColdTextPrefix
function_ref< bool(const MachineBasicBlock &, const MachineBasicBlock &)> MachineBasicBlockComparator
LLVM_ABI void sortBasicBlocksAndUpdateBranches(MachineFunction &MF, MachineBasicBlockComparator MBBCmp)
#define N
LLVM_ABI static const MBBSectionID ExceptionSectionID
LLVM_ABI static const MBBSectionID ColdSectionID