LLVM  10.0.0svn
Macros | Typedefs | Functions | Variables
HotColdSplitting.cpp File Reference

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

#include "llvm/ADT/PostOrderIterator.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/CFG.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/PostDominators.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CFG.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Use.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Pass.h"
#include "llvm/Support/BlockFrequency.h"
#include "llvm/Support/BranchProbability.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/IPO.h"
#include "llvm/Transforms/IPO/HotColdSplitting.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Transforms/Utils/CodeExtractor.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <algorithm>
#include <cassert>
Include dependency graph for HotColdSplitting.cpp:

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). More...
 

Functions

 STATISTIC (NumColdRegionsFound, "Number of cold regions found.")
 
 STATISTIC (NumColdRegionsOutlined, "Number of cold regions outlined.")
 
static int getOutliningBenefit (ArrayRef< BasicBlock *> Region, TargetTransformInfo &TTI)
 Get the benefit score of outlining Region. More...
 
static int getOutliningPenalty (ArrayRef< BasicBlock *> Region, unsigned NumInputs, unsigned NumOutputs)
 Get the penalty score for outlining Region. More...
 
 INITIALIZE_PASS_BEGIN (HotColdSplittingLegacyPass, "hotcoldsplit", "Hot Cold Splitting", false, false) INITIALIZE_PASS_END(HotColdSplittingLegacyPass
 

Variables

static cl::opt< boolEnableStaticAnalyis ("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)"))
 
 hotcoldsplit
 
Hot Cold Splitting
 
Hot Cold false
 

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 72 of file HotColdSplitting.cpp.

Referenced by getOutliningPenalty().

Typedef Documentation

◆ BlockTy

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

A pair of (basic block, score).

Definition at line 385 of file HotColdSplitting.cpp.

Function Documentation

◆ getOutliningBenefit()

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

◆ getOutliningPenalty()

static int getOutliningPenalty ( ArrayRef< BasicBlock *>  Region,
unsigned  NumInputs,
unsigned  NumOutputs 
)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( HotColdSplittingLegacyPass  ,
"hotcoldsplit"  ,
"Hot Cold Splitting ,
false  ,
false   
)

◆ STATISTIC() [1/2]

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

◆ STATISTIC() [2/2]

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

Variable Documentation

◆ EnableStaticAnalyis

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

◆ false

Hot Cold false

Definition at line 758 of file HotColdSplitting.cpp.

◆ hotcoldsplit

hotcoldsplit

Definition at line 758 of file HotColdSplitting.cpp.

◆ Splitting

Hot Cold Splitting

Definition at line 758 of file HotColdSplitting.cpp.

◆ 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)"))
static

Referenced by getOutliningPenalty().