LLVM 20.0.0git
Macros | Enumerations | Functions | Variables
MachineLICM.cpp File Reference
#include "llvm/CodeGen/MachineLICM.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineDomTreeUpdater.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSchedule.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/InitializePasses.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCRegister.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <limits>
#include <vector>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "machinelicm"
 
#define GET_RESULT(RESULT, GETTER, INFIX)
 

Enumerations

enum class  UseBFI { None , PGO , All }
 

Functions

 STATISTIC (NumHoisted, "Number of machine instructions hoisted out of loops")
 
 STATISTIC (NumLowRP, "Number of instructions hoisted in low reg pressure situation")
 
 STATISTIC (NumHighLatency, "Number of high latency instructions hoisted")
 
 STATISTIC (NumCSEed, "Number of hoisted machine instructions CSEed")
 
 STATISTIC (NumPostRAHoisted, "Number of machine instructions hoisted out of loops post regalloc")
 
 STATISTIC (NumStoreConst, "Number of stores of const phys reg hoisted out of loops")
 
 STATISTIC (NumNotHoistedDueToHotness, "Number of instructions not hoisted due to block frequency")
 
 INITIALIZE_PASS_BEGIN (MachineLICM, DEBUG_TYPE, "Machine Loop Invariant Code Motion", false, false) INITIALIZE_PASS_END(MachineLICM
 
Machine Loop Invariant Code false INITIALIZE_PASS_BEGIN (EarlyMachineLICM, "early-machinelicm", "Early Machine Loop Invariant Code Motion", false, false) INITIALIZE_PASS_END(EarlyMachineLICM
 
static bool InstructionStoresToFI (const MachineInstr *MI, int FI)
 Return true if instruction stores to the specified frame.
 
static void applyBitsNotInRegMaskToRegUnitsMask (const TargetRegisterInfo &TRI, BitVector &RUs, const uint32_t *Mask)
 
static bool isOperandKill (const MachineOperand &MO, MachineRegisterInfo *MRI)
 
static bool mayLoadFromGOTOrConstantPool (MachineInstr &MI)
 Return true if this machine instruction loads from global offset table or constant pool.
 
static bool isInvariantStore (const MachineInstr &MI, const TargetRegisterInfo *TRI, const MachineRegisterInfo *MRI)
 
static bool isCopyFeedingInvariantStore (const MachineInstr &MI, const MachineRegisterInfo *MRI, const TargetRegisterInfo *TRI)
 

Variables

static cl::opt< boolAvoidSpeculation ("avoid-speculation", cl::desc("MachineLICM should avoid speculation"), cl::init(true), cl::Hidden)
 
static cl::opt< boolHoistCheapInsts ("hoist-cheap-insts", cl::desc("MachineLICM should hoist even cheap instructions"), cl::init(false), cl::Hidden)
 
static cl::opt< boolHoistConstStores ("hoist-const-stores", cl::desc("Hoist invariant stores"), cl::init(true), cl::Hidden)
 
static cl::opt< boolHoistConstLoads ("hoist-const-loads", cl::desc("Hoist invariant loads"), cl::init(true), cl::Hidden)
 
static cl::opt< unsignedBlockFrequencyRatioThreshold ("block-freq-ratio-threshold", cl::desc("Do not hoist instructions if target" "block is N times hotter than the source."), cl::init(100), cl::Hidden)
 
static cl::opt< UseBFIDisableHoistingToHotterBlocks ("disable-hoisting-to-hotter-blocks", cl::desc("Disable hoisting instructions to" " hotter blocks"), cl::init(UseBFI::PGO), cl::Hidden, cl::values(clEnumValN(UseBFI::None, "none", "disable the feature"), clEnumValN(UseBFI::PGO, "pgo", "enable the feature when using profile data"), clEnumValN(UseBFI::All, "all", "enable the feature with/wo profile data")))
 
 DEBUG_TYPE
 
Machine Loop Invariant Code Motion
 
Machine Loop Invariant Code false
 
Machine Loop Invariant Code false early machinelicm
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "machinelicm"

Definition at line 60 of file MachineLICM.cpp.

◆ GET_RESULT

#define GET_RESULT (   RESULT,
  GETTER,
  INFIX 
)
Value:
((LegacyPass) \
? &LegacyPass->getAnalysis<RESULT##INFIX##WrapperPass>().GETTER() \
: &MFAM->getResult<RESULT##Analysis>(MF))
block Block Frequency Analysis

Definition at line 368 of file MachineLICM.cpp.

Enumeration Type Documentation

◆ UseBFI

enum class UseBFI
strong
Enumerator
None 
PGO 
All 

Definition at line 89 of file MachineLICM.cpp.

Function Documentation

◆ applyBitsNotInRegMaskToRegUnitsMask()

static void applyBitsNotInRegMaskToRegUnitsMask ( const TargetRegisterInfo TRI,
BitVector RUs,
const uint32_t Mask 
)
static

Definition at line 459 of file MachineLICM.cpp.

References llvm::MCRegUnitIterator::isValid(), llvm::BitVector::set(), and TRI.

◆ INITIALIZE_PASS_BEGIN() [1/2]

Machine Loop Invariant Code false INITIALIZE_PASS_BEGIN ( EarlyMachineLICM  ,
"early-machinelicm"  ,
"Early Machine Loop Invariant Code Motion"  ,
false  ,
false   
)

◆ INITIALIZE_PASS_BEGIN() [2/2]

INITIALIZE_PASS_BEGIN ( MachineLICM  ,
DEBUG_TYPE  ,
"Machine Loop Invariant Code Motion"  ,
false  ,
false   
)

◆ InstructionStoresToFI()

static bool InstructionStoresToFI ( const MachineInstr MI,
int  FI 
)
static

Return true if instruction stores to the specified frame.

Definition at line 438 of file MachineLICM.cpp.

References MI.

◆ isCopyFeedingInvariantStore()

static bool isCopyFeedingInvariantStore ( const MachineInstr MI,
const MachineRegisterInfo MRI,
const TargetRegisterInfo TRI 
)
static

◆ isInvariantStore()

static bool isInvariantStore ( const MachineInstr MI,
const TargetRegisterInfo TRI,
const MachineRegisterInfo MRI 
)
static

◆ isOperandKill()

static bool isOperandKill ( const MachineOperand MO,
MachineRegisterInfo MRI 
)
static

◆ mayLoadFromGOTOrConstantPool()

static bool mayLoadFromGOTOrConstantPool ( MachineInstr MI)
static

Return true if this machine instruction loads from global offset table or constant pool.

Definition at line 1017 of file MachineLICM.cpp.

References assert(), and MI.

◆ STATISTIC() [1/7]

STATISTIC ( NumCSEed  ,
"Number of hoisted machine instructions CSEed"   
)

◆ STATISTIC() [2/7]

STATISTIC ( NumHighLatency  ,
"Number of high latency instructions hoisted"   
)

◆ STATISTIC() [3/7]

STATISTIC ( NumHoisted  ,
"Number of machine instructions hoisted out of loops"   
)

◆ STATISTIC() [4/7]

STATISTIC ( NumLowRP  ,
"Number of instructions hoisted in low reg pressure situation"   
)

◆ STATISTIC() [5/7]

STATISTIC ( NumNotHoistedDueToHotness  ,
"Number of instructions not hoisted due to block frequency"   
)

◆ STATISTIC() [6/7]

STATISTIC ( NumPostRAHoisted  ,
"Number of machine instructions hoisted out of loops post regalloc"   
)

◆ STATISTIC() [7/7]

STATISTIC ( NumStoreConst  ,
"Number of stores of const phys reg hoisted out of loops"   
)

Variable Documentation

◆ AvoidSpeculation

cl::opt< bool > AvoidSpeculation("avoid-speculation", cl::desc("MachineLICM should avoid speculation"), cl::init(true), cl::Hidden) ( "avoid-speculation"  ,
cl::desc("MachineLICM should avoid speculation")  ,
cl::init(true ,
cl::Hidden   
)
static

◆ BlockFrequencyRatioThreshold

cl::opt< unsigned > BlockFrequencyRatioThreshold("block-freq-ratio-threshold", cl::desc("Do not hoist instructions if target" "block is N times hotter than the source."), cl::init(100), cl::Hidden) ( "block-freq-ratio-threshold"  ,
cl::desc("Do not hoist instructions if target" "block is N times hotter than the source.")  ,
cl::init(100)  ,
cl::Hidden   
)
static

◆ DEBUG_TYPE

DEBUG_TYPE

Definition at line 348 of file MachineLICM.cpp.

◆ DisableHoistingToHotterBlocks

cl::opt< UseBFI > DisableHoistingToHotterBlocks("disable-hoisting-to-hotter-blocks", cl::desc("Disable hoisting instructions to" " hotter blocks"), cl::init(UseBFI::PGO), cl::Hidden, cl::values(clEnumValN(UseBFI::None, "none", "disable the feature"), clEnumValN(UseBFI::PGO, "pgo", "enable the feature when using profile data"), clEnumValN(UseBFI::All, "all", "enable the feature with/wo profile data"))) ( "disable-hoisting-to-hotter-blocks"  ,
cl::desc("Disable hoisting instructions to" " hotter blocks")  ,
cl::init(UseBFI::PGO ,
cl::Hidden  ,
cl::values(clEnumValN(UseBFI::None, "none", "disable the feature"), clEnumValN(UseBFI::PGO, "pgo", "enable the feature when using profile data"), clEnumValN(UseBFI::All, "all", "enable the feature with/wo profile data"))   
)
static

◆ false

Machine Loop Invariant Code false early Early Machine Loop Invariant Code false

Definition at line 349 of file MachineLICM.cpp.

◆ HoistCheapInsts

cl::opt< bool > HoistCheapInsts("hoist-cheap-insts", cl::desc("MachineLICM should hoist even cheap instructions"), cl::init(false), cl::Hidden) ( "hoist-cheap-insts"  ,
cl::desc("MachineLICM should hoist even cheap instructions")  ,
cl::init(false)  ,
cl::Hidden   
)
static

◆ HoistConstLoads

cl::opt< bool > HoistConstLoads("hoist-const-loads", cl::desc("Hoist invariant loads"), cl::init(true), cl::Hidden) ( "hoist-const-loads"  ,
cl::desc("Hoist invariant loads")  ,
cl::init(true ,
cl::Hidden   
)
static

◆ HoistConstStores

cl::opt< bool > HoistConstStores("hoist-const-stores", cl::desc("Hoist invariant stores"), cl::init(true), cl::Hidden) ( "hoist-const-stores"  ,
cl::desc("Hoist invariant stores")  ,
cl::init(true ,
cl::Hidden   
)
static

◆ machinelicm

Machine Loop Invariant Code false early machinelicm

Definition at line 357 of file MachineLICM.cpp.

◆ Motion

Machine Loop Invariant Code false early Early Machine Loop Invariant Code Motion

Definition at line 349 of file MachineLICM.cpp.