LLVM API Documentation
#include "llvm/CodeGen/Passes.h"
#include "BranchFolding.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetSchedule.h"
#include "llvm/MC/MCInstrItineraries.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Target/TargetSubtargetInfo.h"
Go to the source code of this file.
Defines | |
#define | DEBUG_TYPE "ifcvt" |
Functions | |
STATISTIC (NumSimple,"Number of simple if-conversions performed") | |
STATISTIC (NumSimpleFalse,"Number of simple (F) if-conversions performed") | |
STATISTIC (NumTriangle,"Number of triangle if-conversions performed") | |
STATISTIC (NumTriangleRev,"Number of triangle (R) if-conversions performed") | |
STATISTIC (NumTriangleFalse,"Number of triangle (F) if-conversions performed") | |
STATISTIC (NumTriangleFRev,"Number of triangle (F/R) if-conversions performed") | |
STATISTIC (NumDiamonds,"Number of diamond if-conversions performed") | |
STATISTIC (NumIfConvBBs,"Number of if-converted blocks") | |
STATISTIC (NumDupBBs,"Number of duplicated blocks") | |
STATISTIC (NumUnpred,"Number of true blocks of diamonds unpredicated") | |
static MachineBasicBlock * | findFalseBlock (MachineBasicBlock *BB, MachineBasicBlock *TrueBB) |
static MachineBasicBlock * | getNextBlock (MachineBasicBlock *BB) |
static bool | canFallThroughTo (MachineBasicBlock *BB, MachineBasicBlock *ToBB) |
static void | InsertUncondBranch (MachineBasicBlock *BB, MachineBasicBlock *ToBB, const TargetInstrInfo *TII) |
static void | UpdatePredRedefs (MachineInstr *MI, LivePhysRegs &Redefs) |
static void | RemoveKills (MachineInstr &MI, const LivePhysRegs &DontKill) |
static void | RemoveKills (MachineBasicBlock::iterator I, MachineBasicBlock::iterator E, const LivePhysRegs &DontKill, const MCRegisterInfo &MCRI) |
static void | ScaleWeights (uint64_t NewTrue, uint64_t NewFalse, MachineBasicBlock *MBB, const MachineBasicBlock *TrueBB, const MachineBasicBlock *FalseBB, const MachineBranchProbabilityInfo *MBPI) |
static bool | MaySpeculate (const MachineInstr *MI, SmallSet< unsigned, 4 > &LaterRedefs, const TargetInstrInfo *TII) |
Variables | |
static cl::opt< int > | IfCvtFnStart ("ifcvt-fn-start", cl::init(-1), cl::Hidden) |
static cl::opt< int > | IfCvtFnStop ("ifcvt-fn-stop", cl::init(-1), cl::Hidden) |
static cl::opt< int > | IfCvtLimit ("ifcvt-limit", cl::init(-1), cl::Hidden) |
static cl::opt< bool > | DisableSimple ("disable-ifcvt-simple", cl::init(false), cl::Hidden) |
static cl::opt< bool > | DisableSimpleF ("disable-ifcvt-simple-false", cl::init(false), cl::Hidden) |
static cl::opt< bool > | DisableTriangle ("disable-ifcvt-triangle", cl::init(false), cl::Hidden) |
static cl::opt< bool > | DisableTriangleR ("disable-ifcvt-triangle-rev", cl::init(false), cl::Hidden) |
static cl::opt< bool > | DisableTriangleF ("disable-ifcvt-triangle-false", cl::init(false), cl::Hidden) |
static cl::opt< bool > | DisableTriangleFR ("disable-ifcvt-triangle-false-rev", cl::init(false), cl::Hidden) |
static cl::opt< bool > | DisableDiamond ("disable-ifcvt-diamond", cl::init(false), cl::Hidden) |
static cl::opt< bool > | IfCvtBranchFold ("ifcvt-branch-fold", cl::init(true), cl::Hidden) |
#define DEBUG_TYPE "ifcvt" |
Definition at line 40 of file IfConversion.cpp.
static bool canFallThroughTo | ( | MachineBasicBlock * | BB, |
MachineBasicBlock * | ToBB | ||
) | [static] |
canFallThroughTo - Returns true either if ToBB is the next block after BB or that all the intervening blocks are empty (given BB can fall through to its next block).
Definition at line 926 of file IfConversion.cpp.
References llvm::MachineFunction::end(), and llvm::MachineBasicBlock::getParent().
static MachineBasicBlock* findFalseBlock | ( | MachineBasicBlock * | BB, |
MachineBasicBlock * | TrueBB | ||
) | [static] |
findFalseBlock - BB has a fallthrough. Find its 'false' successor given its 'true' successor.
Definition at line 437 of file IfConversion.cpp.
References llvm::MachineBasicBlock::succ_begin(), and llvm::MachineBasicBlock::succ_end().
static MachineBasicBlock* getNextBlock | ( | MachineBasicBlock * | BB | ) | [inline, static] |
getNextBlock - Returns the next block in the function blocks ordering. If it is the end, returns NULL.
Definition at line 463 of file IfConversion.cpp.
References llvm::MachineFunction::end(), llvm::MachineBasicBlock::getParent(), and I.
static void InsertUncondBranch | ( | MachineBasicBlock * | BB, |
MachineBasicBlock * | ToBB, | ||
const TargetInstrInfo * | TII | ||
) | [static] |
InsertUncondBranch - Inserts an unconditional branch from BB to ToBB.
Definition at line 956 of file IfConversion.cpp.
References llvm::TargetInstrInfo::InsertBranch().
static bool MaySpeculate | ( | const MachineInstr * | MI, |
SmallSet< unsigned, 4 > & | LaterRedefs, | ||
const TargetInstrInfo * | TII | ||
) | [static] |
Definition at line 1507 of file IfConversion.cpp.
References llvm::SmallSet< T, N, C >::count(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isDef(), llvm::MachineOperand::isReg(), and llvm::MachineInstr::isSafeToMove().
static void RemoveKills | ( | MachineInstr & | MI, |
const LivePhysRegs & | DontKill | ||
) | [static] |
Remove kill flags from operands with a registers in the DontKill
set.
Definition at line 1001 of file IfConversion.cpp.
References llvm::LivePhysRegs::contains(), and llvm::MachineOperandIteratorBase::isValid().
Referenced by RemoveKills().
static void RemoveKills | ( | MachineBasicBlock::iterator | I, |
MachineBasicBlock::iterator | E, | ||
const LivePhysRegs & | DontKill, | ||
const MCRegisterInfo & | MCRI | ||
) | [static] |
Walks a range of machine instructions and removes kill flags for registers in the DontKill
set.
Definition at line 1014 of file IfConversion.cpp.
References I, and RemoveKills().
static void ScaleWeights | ( | uint64_t | NewTrue, |
uint64_t | NewFalse, | ||
MachineBasicBlock * | MBB, | ||
const MachineBasicBlock * | TrueBB, | ||
const MachineBasicBlock * | FalseBB, | ||
const MachineBranchProbabilityInfo * | MBPI | ||
) | [static] |
Scale down weights to fit into uint32_t. NewTrue is the new weight for successor TrueBB, and NewFalse is the new weight for successor FalseBB.
Definition at line 1111 of file IfConversion.cpp.
References llvm::MachineBranchProbabilityInfo::getEdgeWeight(), llvm::MachineBasicBlock::setSuccWeight(), llvm::MachineBasicBlock::succ_begin(), and llvm::MachineBasicBlock::succ_end().
STATISTIC | ( | NumDupBBs | , |
"Number of duplicated blocks" | |||
) |
static void UpdatePredRedefs | ( | MachineInstr * | MI, |
LivePhysRegs & | Redefs | ||
) | [static] |
Behaves like LiveRegUnits::StepForward() but also adds implicit uses to all values defined in MI which are not live/used by MI.
Definition at line 974 of file IfConversion.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::LivePhysRegs::addReg(), llvm::LivePhysRegs::contains(), llvm::MachineInstr::getParent(), llvm::MachineBasicBlock::getParent(), llvm::MachineOperand::getParent(), llvm::RegState::Implicit, llvm::MachineOperandIteratorBase::isValid(), llvm::AArch64CC::MI, llvm::LivePhysRegs::removeReg(), and llvm::RegState::Undef.
cl::opt<bool> DisableDiamond("disable-ifcvt-diamond", cl::init(false), cl::Hidden) [static] |
cl::opt<bool> DisableSimple("disable-ifcvt-simple", cl::init(false), cl::Hidden) [static] |
cl::opt<bool> DisableTriangle("disable-ifcvt-triangle", cl::init(false), cl::Hidden) [static] |
cl::opt<bool> DisableTriangleF("disable-ifcvt-triangle-false", cl::init(false), cl::Hidden) [static] |
cl::opt<bool> DisableTriangleFR("disable-ifcvt-triangle-false-rev", cl::init(false), cl::Hidden) [static] |
cl::opt<bool> DisableTriangleR("disable-ifcvt-triangle-rev", cl::init(false), cl::Hidden) [static] |
cl::opt<bool> IfCvtBranchFold("ifcvt-branch-fold", cl::init(true), cl::Hidden) [static] |
cl::opt<int> IfCvtFnStart("ifcvt-fn-start", cl::init(-1), cl::Hidden) [static] |
cl::opt<int> IfCvtFnStop("ifcvt-fn-stop", cl::init(-1), cl::Hidden) [static] |
cl::opt<int> IfCvtLimit("ifcvt-limit", cl::init(-1), cl::Hidden) [static] |