LLVM 22.0.0git
HotColdSplitting.cpp File Reference

The goal of hot/cold splitting is to improve the memory locality of code. More...

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "hotcoldsplit"

Typedefs

using BlockTy = std::pair<BasicBlock *, unsigned>
 A pair of (basic block, score).

Functions

 STATISTIC (NumColdRegionsFound, "Number of cold regions found.")
 STATISTIC (NumColdRegionsOutlined, "Number of cold regions outlined.")
static InstructionCost getOutliningBenefit (ArrayRef< BasicBlock * > Region, TargetTransformInfo &TTI)
 Get the benefit score of outlining Region.
static int getOutliningPenalty (ArrayRef< BasicBlock * > Region, unsigned NumInputs, unsigned NumOutputs)
 Get the penalty score for outlining Region.

Variables

static cl::opt< boolEnableStaticAnalysis ("hot-cold-static-analysis", cl::init(true), cl::Hidden)
static cl::opt< int > SplittingThreshold ("hotcoldsplit-threshold", cl::init(2), cl::Hidden, cl::desc("Base penalty for splitting cold code (as a " "multiple of TCC_Basic)"))
static cl::opt< boolEnableColdSection ("enable-cold-section", cl::init(false), cl::Hidden, cl::desc("Enable placement of extracted cold functions" " into a separate section after hot-cold splitting."))
static cl::opt< std::stringColdSectionName ("hotcoldsplit-cold-section-name", cl::init("__llvm_cold"), cl::Hidden, cl::desc("Name for the section containing cold functions " "extracted by hot-cold splitting."))
static cl::opt< int > MaxParametersForSplit ("hotcoldsplit-max-params", cl::init(4), cl::Hidden, cl::desc("Maximum number of parameters for a split function"))
static cl::opt< int > ColdBranchProbDenom ("hotcoldsplit-cold-probability-denom", cl::init(100), cl::Hidden, cl::desc("Divisor of cold branch probability." "BranchProbability = 1/ColdBranchProbDenom"))

Detailed Description

The goal of hot/cold splitting is to improve the memory locality of code.

The splitting pass does this by identifying cold blocks and moving them into separate functions.

When the splitting pass finds a cold block (referred to as "the sink"), it grows a maximal cold region around that block. The maximal region contains all blocks (post-)dominated by the sink [*]. In theory, these blocks are as cold as the sink. Once a region is found, it's split out of the original function provided it's profitable to do so.

[*] In practice, there is some added complexity because some blocks are not safe to extract.

TODO: Use the PM to get domtrees, and preserve BFI/BPI. TODO: Reorder outlined functions.

Definition in file HotColdSplitting.cpp.

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "hotcoldsplit"

Definition at line 60 of file HotColdSplitting.cpp.

Typedef Documentation

◆ BlockTy

using BlockTy = std::pair<BasicBlock *, unsigned>

A pair of (basic block, score).

Definition at line 456 of file HotColdSplitting.cpp.

Function Documentation

◆ getOutliningBenefit()

InstructionCost getOutliningBenefit ( ArrayRef< BasicBlock * > Region,
TargetTransformInfo & TTI )
static

◆ getOutliningPenalty()

◆ STATISTIC() [1/2]

STATISTIC ( NumColdRegionsFound ,
"Number of cold regions found."  )

◆ STATISTIC() [2/2]

STATISTIC ( NumColdRegionsOutlined ,
"Number of cold regions outlined."  )

Variable Documentation

◆ ColdBranchProbDenom

cl::opt< int > ColdBranchProbDenom("hotcoldsplit-cold-probability-denom", cl::init(100), cl::Hidden, cl::desc("Divisor of cold branch probability." "BranchProbability = 1/ColdBranchProbDenom")) ( "hotcoldsplit-cold-probability-denom" ,
cl::init(100) ,
cl::Hidden ,
cl::desc("Divisor of cold branch probability." "BranchProbability = 1/ColdBranchProbDenom")  )
static

◆ ColdSectionName

cl::opt< std::string > ColdSectionName("hotcoldsplit-cold-section-name", cl::init("__llvm_cold"), cl::Hidden, cl::desc("Name for the section containing cold functions " "extracted by hot-cold splitting.")) ( "hotcoldsplit-cold-section-name" ,
cl::init("__llvm_cold") ,
cl::Hidden ,
cl::desc("Name for the section containing cold functions " "extracted by hot-cold splitting.")  )
static

◆ EnableColdSection

cl::opt< bool > EnableColdSection("enable-cold-section", cl::init(false), cl::Hidden, cl::desc("Enable placement of extracted cold functions" " into a separate section after hot-cold splitting.")) ( "enable-cold-section" ,
cl::init(false) ,
cl::Hidden ,
cl::desc("Enable placement of extracted cold functions" " into a separate section after hot-cold splitting.")  )
static

◆ EnableStaticAnalysis

cl::opt< bool > EnableStaticAnalysis("hot-cold-static-analysis", cl::init(true), cl::Hidden) ( "hot-cold-static-analysis" ,
cl::init(true) ,
cl::Hidden  )
static

◆ MaxParametersForSplit

cl::opt< int > MaxParametersForSplit("hotcoldsplit-max-params", cl::init(4), cl::Hidden, cl::desc("Maximum number of parameters for a split function")) ( "hotcoldsplit-max-params" ,
cl::init(4) ,
cl::Hidden ,
cl::desc("Maximum number of parameters for a split function")  )
static

Referenced by getOutliningPenalty().

◆ SplittingThreshold

cl::opt< int > SplittingThreshold("hotcoldsplit-threshold", cl::init(2), cl::Hidden, cl::desc("Base penalty for splitting cold code (as a " "multiple of TCC_Basic)")) ( "hotcoldsplit-threshold" ,
cl::init(2) ,
cl::Hidden ,
cl::desc("Base penalty for splitting cold code (as a " "multiple of TCC_Basic)")  )
static

Referenced by getOutliningPenalty().