LLVM  8.0.1
Macros | Enumerations | Functions | Variables
MipsDelaySlotFiller.cpp File Reference
#include "MCTargetDesc/MipsMCNaCl.h"
#include "Mips.h"
#include "MipsInstrInfo.h"
#include "MipsRegisterInfo.h"
#include "MipsSubtarget.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/PointerUnion.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
#include <algorithm>
#include <cassert>
#include <iterator>
#include <memory>
#include <utility>
Include dependency graph for MipsDelaySlotFiller.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "mips-delay-slot-filler"
 

Enumerations

enum  CompactBranchPolicy { CB_Never, CB_Optimal, CB_Always }
 

Functions

 STATISTIC (FilledSlots, "Number of delay slots filled")
 
 STATISTIC (UsefulSlots, "Number of delay slots filled with instructions that" " are not NOP.")
 
static bool hasUnoccupiedSlot (const MachineInstr *MI)
 
 INITIALIZE_PASS (MipsDelaySlotFiller, DEBUG_TYPE, "Fill delay slot for MIPS", false, false) static void insertDelayFiller(Iter Filler
 This function inserts clones of Filler into predecessor blocks. More...
 
 for (BB2BrMap::const_iterator I=BrMap.begin();I !=BrMap.end();++I)
 
static void addLiveInRegs (Iter Filler, MachineBasicBlock &MBB)
 This function adds registers Filler defines to MBB's live-in register list. More...
 
static int getEquivalentCallShort (int Opcode)
 

Variables

static cl::opt< boolDisableDelaySlotFiller ("disable-mips-delay-filler", cl::init(false), cl::desc("Fill all delay slots with NOPs."), cl::Hidden)
 
static cl::opt< boolDisableForwardSearch ("disable-mips-df-forward-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search forward."), cl::Hidden)
 
static cl::opt< boolDisableSuccBBSearch ("disable-mips-df-succbb-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search successor basic blocks."), cl::Hidden)
 
static cl::opt< boolDisableBackwardSearch ("disable-mips-df-backward-search", cl::init(false), cl::desc("Disallow MIPS delay filler to search backward."), cl::Hidden)
 
static cl::opt< CompactBranchPolicyMipsCompactBranchPolicy ("mips-compact-branches", cl::Optional, cl::init(CB_Optimal), cl::desc("MIPS Specific: Compact branch policy."), cl::values(clEnumValN(CB_Never, "never", "Do not use compact branches if possible."), clEnumValN(CB_Optimal, "optimal", "Use compact branches where appropiate (default)."), clEnumValN(CB_Always, "always", "Always use compact branches if possible.")))
 
const BB2BrMap & BrMap
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "mips-delay-slot-filler"

Definition at line 54 of file MipsDelaySlotFiller.cpp.

Referenced by hasUnoccupiedSlot().

Enumeration Type Documentation

◆ CompactBranchPolicy

Enumerator
CB_Never 

The policy 'never' may in some circumstances or for some ISAs not be absolutely adhered to.

CB_Optimal 

Optimal is the default and will produce compact branches when delay slots cannot be filled.

CB_Always 

'always' may in some circumstances may not be absolutely adhered to there may not be a corresponding compact form of a branch.

Definition at line 84 of file MipsDelaySlotFiller.cpp.

Function Documentation

◆ addLiveInRegs()

static void addLiveInRegs ( Iter  Filler,
MachineBasicBlock MBB 
)
static

◆ for()

for ( BB2BrMap::const_iterator  I = BrMap.begin(); I != BrMap.end(); ++I)

◆ getEquivalentCallShort()

static int getEquivalentCallShort ( int  Opcode)
static

◆ hasUnoccupiedSlot()

static bool hasUnoccupiedSlot ( const MachineInstr MI)
static

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( MipsDelaySlotFiller  ,
DEBUG_TYPE  ,
"Fill delay slot for MIPS"  ,
false  ,
false   
)

This function inserts clones of Filler into predecessor blocks.

Referenced by hasUnoccupiedSlot().

◆ STATISTIC() [1/2]

STATISTIC ( FilledSlots  ,
"Number of delay slots filled"   
)

◆ STATISTIC() [2/2]

STATISTIC ( UsefulSlots  ,
"Number of delay slots filled with instructions that" " are not NOP."   
)

Variable Documentation

◆ BrMap

const BB2BrMap& BrMap
Initial value:
{
MachineFunction *MF = Filler->getParent()->getParent()

Definition at line 313 of file MipsDelaySlotFiller.cpp.

◆ DisableBackwardSearch

cl::opt<bool> DisableBackwardSearch("disable-mips-df-backward-search", cl::init(false), cl::desc("Disallow MIPS delay filler to search backward."), cl::Hidden)
static

◆ DisableDelaySlotFiller

cl::opt<bool> DisableDelaySlotFiller("disable-mips-delay-filler", cl::init(false), cl::desc("Fill all delay slots with NOPs."), cl::Hidden)
static

Referenced by getEquivalentCallShort().

◆ DisableForwardSearch

cl::opt<bool> DisableForwardSearch("disable-mips-df-forward-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search forward."), cl::Hidden)
static

◆ DisableSuccBBSearch

cl::opt<bool> DisableSuccBBSearch("disable-mips-df-succbb-search", cl::init(true), cl::desc("Disallow MIPS delay filler to search successor basic blocks."), cl::Hidden)
static

◆ MipsCompactBranchPolicy

cl::opt<CompactBranchPolicy> MipsCompactBranchPolicy("mips-compact-branches", cl::Optional, cl::init(CB_Optimal), cl::desc("MIPS Specific: Compact branch policy."), cl::values( clEnumValN(CB_Never, "never", "Do not use compact branches if possible."), clEnumValN(CB_Optimal, "optimal", "Use compact branches where appropiate (default)."), clEnumValN(CB_Always, "always", "Always use compact branches if possible.")))
static

Referenced by getEquivalentCallShort().