LLVM  15.0.0git
Macros | Functions | Variables
SelectOptimize.cpp File Reference
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TargetSchedule.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Instruction.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/ScaledNumber.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Transforms/Utils/SizeOpts.h"
#include <algorithm>
#include <memory>
#include <queue>
#include <stack>
#include <string>
Include dependency graph for SelectOptimize.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "select-optimize"
 

Functions

 STATISTIC (NumSelectOptAnalyzed, "Number of select groups considered for conversion to branch")
 
 STATISTIC (NumSelectConvertedExpColdOperand, "Number of select groups converted due to expensive cold operand")
 
 STATISTIC (NumSelectConvertedHighPred, "Number of select groups converted due to high-predictability")
 
 STATISTIC (NumSelectUnPred, "Number of select groups not converted due to unpredictability")
 
 STATISTIC (NumSelectColdBB, "Number of select groups not converted due to cold basic block")
 
 STATISTIC (NumSelectConvertedLoop, "Number of select groups converted due to loop-level analysis")
 
 STATISTIC (NumSelectsConverted, "Number of selects converted")
 
 INITIALIZE_PASS_BEGIN (SelectOptimize, DEBUG_TYPE, "Optimize selects", false, false) INITIALIZE_PASS_END(SelectOptimize
 
static ValuegetTrueOrFalseValue (SelectInst *SI, bool isTrue, const SmallPtrSet< const Instruction *, 2 > &Selects)
 If isTrue is true, return the true value of SI, otherwise return false value of SI. More...
 
static InstructionCost divideNearest (InstructionCost Numerator, uint64_t Denominator)
 

Variables

static cl::opt< unsigned > ColdOperandThreshold ("cold-operand-threshold", cl::desc("Maximum frequency of path for an operand to be considered cold."), cl::init(20), cl::Hidden)
 
static cl::opt< unsigned > ColdOperandMaxCostMultiplier ("cold-operand-max-cost-multiplier", cl::desc("Maximum cost multiplier of TCC_expensive for the dependence " "slice of a cold operand to be considered inexpensive."), cl::init(1), cl::Hidden)
 
static cl::opt< unsigned > GainGradientThreshold ("select-opti-loop-gradient-gain-threshold", cl::desc("Gradient gain threshold (%)."), cl::init(25), cl::Hidden)
 
static cl::opt< unsigned > GainCycleThreshold ("select-opti-loop-cycle-gain-threshold", cl::desc("Minimum gain per loop (in cycles) threshold."), cl::init(4), cl::Hidden)
 
static cl::opt< unsigned > GainRelativeThreshold ("select-opti-loop-relative-gain-threshold", cl::desc("Minimum relative gain per loop threshold (1/X). Defaults to 12.5%"), cl::init(8), cl::Hidden)
 
static cl::opt< unsigned > MispredictDefaultRate ("mispredict-default-rate", cl::Hidden, cl::init(25), cl::desc("Default mispredict rate (initialized to 25%)."))
 
static cl::opt< bool > DisableLoopLevelHeuristics ("disable-loop-level-heuristics", cl::Hidden, cl::init(false), cl::desc("Disable loop-level heuristics."))
 
 DEBUG_TYPE
 
Optimize selects
 
Optimize false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "select-optimize"

Definition at line 45 of file SelectOptimize.cpp.

Function Documentation

◆ divideNearest()

static InstructionCost divideNearest ( InstructionCost  Numerator,
uint64_t  Denominator 
)
static

Definition at line 649 of file SelectOptimize.cpp.

◆ getTrueOrFalseValue()

static Value* getTrueOrFalseValue ( SelectInst SI,
bool  isTrue,
const SmallPtrSet< const Instruction *, 2 > &  Selects 
)
static

If isTrue is true, return the true value of SI, otherwise return false value of SI.

If the true/false value of SI is defined by any select instructions in Selects, look through the defining select instruction until the true/false value is not defined in Selects.

Definition at line 317 of file SelectOptimize.cpp.

References assert(), llvm::SmallPtrSetImpl< PtrType >::count(), and SI.

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( SelectOptimize  ,
DEBUG_TYPE  ,
"Optimize selects ,
false  ,
false   
)

◆ STATISTIC() [1/7]

STATISTIC ( NumSelectColdBB  ,
"Number of select groups not converted due to cold basic block  
)

◆ STATISTIC() [2/7]

STATISTIC ( NumSelectConvertedExpColdOperand  ,
"Number of select groups converted due to expensive cold operand"   
)

◆ STATISTIC() [3/7]

STATISTIC ( NumSelectConvertedHighPred  ,
"Number of select groups converted due to high-predictability"   
)

◆ STATISTIC() [4/7]

STATISTIC ( NumSelectConvertedLoop  ,
"Number of select groups converted due to loop-level analysis  
)

◆ STATISTIC() [5/7]

STATISTIC ( NumSelectOptAnalyzed  ,
"Number of select groups considered for conversion to branch"   
)

◆ STATISTIC() [6/7]

STATISTIC ( NumSelectsConverted  ,
"Number of selects converted"   
)

◆ STATISTIC() [7/7]

STATISTIC ( NumSelectUnPred  ,
"Number of select groups not converted due to unpredictability"   
)

Variable Documentation

◆ ColdOperandMaxCostMultiplier

cl::opt<unsigned> ColdOperandMaxCostMultiplier("cold-operand-max-cost-multiplier", cl::desc("Maximum cost multiplier of TCC_expensive for the dependence " "slice of a cold operand to be considered inexpensive."), cl::init(1), cl::Hidden)
static

◆ ColdOperandThreshold

cl::opt<unsigned> ColdOperandThreshold("cold-operand-threshold", cl::desc("Maximum frequency of path for an operand to be considered cold."), cl::init(20), cl::Hidden)
static

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 226 of file SelectOptimize.cpp.

◆ DisableLoopLevelHeuristics

cl::opt<bool> DisableLoopLevelHeuristics("disable-loop-level-heuristics", cl::Hidden, cl::init(false), cl::desc("Disable loop-level heuristics."))
static

◆ false

Optimize false

Definition at line 226 of file SelectOptimize.cpp.

◆ GainCycleThreshold

cl::opt<unsigned> GainCycleThreshold("select-opti-loop-cycle-gain-threshold", cl::desc("Minimum gain per loop (in cycles) threshold."), cl::init(4), cl::Hidden)
static

◆ GainGradientThreshold

cl::opt<unsigned> GainGradientThreshold("select-opti-loop-gradient-gain-threshold", cl::desc("Gradient gain threshold (%)."), cl::init(25), cl::Hidden)
static

◆ GainRelativeThreshold

cl::opt<unsigned> GainRelativeThreshold("select-opti-loop-relative-gain-threshold", cl::desc( "Minimum relative gain per loop threshold (1/X). Defaults to 12.5%"), cl::init(8), cl::Hidden)
static

◆ MispredictDefaultRate

cl::opt<unsigned> MispredictDefaultRate("mispredict-default-rate", cl::Hidden, cl::init(25), cl::desc("Default mispredict rate (initialized to 25%)."))
static

◆ selects

Optimize selects

Definition at line 226 of file SelectOptimize.cpp.