36#define DEBUG_TYPE "lrshrink"
39 "Number of insructions hoisted to shrink live range.");
63char LiveRangeShrink::ID = 0;
79 const InstOrderMap &M) {
80 auto NewIter = M.find(&New);
81 if (NewIter == M.end())
85 unsigned OrderOld = M.find(Old)->second;
86 unsigned OrderNew = NewIter->second;
87 if (OrderOld != OrderNew)
88 return OrderOld < OrderNew ? &New : Old;
91 for (
MachineInstr *
I = Old->getNextNode(); M.find(
I)->second == OrderNew;
103 return MI.hasUnmodeledSideEffects() && !
MI.isPseudoProbe();
151 bool SawStore =
false;
153 while (Next !=
MBB.
end()) {
157 unsigned CurrentOrder = IOM[&
MI];
161 if (!MO.isReg() || MO.isDebug())
164 UseMap[MO.getReg()] = std::make_pair(CurrentOrder, &
MI);
165 else if (MO.isDead()) {
168 auto It = UseMap.
find(MO.getReg());
169 if (It != UseMap.
end() && Barrier < It->second.first)
170 std::tie(Barrier, BarrierMI) = It->second;
174 if (!
MI.isSafeToMove(SawStore)) {
190 unsigned NumEligibleUse = 0;
193 if (!MO.isReg() || MO.isDead() || MO.isDebug())
198 if (!
Reg.isVirtual()) {
199 if (!Reg ||
MRI.isConstantPhysReg(Reg))
211 }
else if (
MRI.hasOneNonDBGUse(Reg) &&
MRI.hasOneDef(Reg) && DefMO &&
213 MRI.getRegClass(MO.getReg())) {
219 if (!
TII.isCopyInstr(DefInstr))
231 I =
I->getNextNode())
232 if (
I == BarrierMI) {
237 if (DefMO && Insert && NumEligibleUse > 1 && Barrier <= IOM[Insert]) {
240 while (
I !=
MBB.
end() && (
I->isPHI() ||
I->isDebugOrPseudoInstr()))
242 if (
I ==
MI.getIterator())
248 unsigned NewOrder = IOM[&*
I];
250 NumInstrsHoistedToShrinkLiveRange++;
254 if (
MI.getOperand(0).isReg())
255 for (; EndIter !=
MBB.
end() && EndIter->isDebugValue() &&
256 EndIter->hasDebugOperandForReg(
MI.getOperand(0).getReg());
258 IOM[&*EndIter] = NewOrder;
unsigned const MachineRegisterInfo * MRI
This file defines the DenseMap class.
const HexagonInstrInfo * TII
static bool isCodeMotionBarrier(MachineInstr &MI)
Returns whether this instruction is considered a code motion barrier by this pass.
static MachineInstr * FindDominatedInstruction(MachineInstr &New, MachineInstr *Old, const InstOrderMap &M)
Returns New if it's dominated by Old, otherwise return Old.
static void BuildInstOrderMap(MachineBasicBlock::iterator Start, InstOrderMap &M)
Builds Instruction to its dominating order number map M by traversing from instruction Start.
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Represent the analysis usage information of a pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
iterator find(const_arg_type_t< KeyT > Val)
bool isEHPad() const
Returns true if the block is a landing pad.
LLVM_ABI iterator SkipPHIsLabelsAndDebug(iterator I, Register Reg=Register(), bool SkipPseudoOp=true)
Return the first instruction in MBB after I that is not a PHI, label or debug.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
Wrapper class representing virtual and physical registers.
StringRef - Represent a constant reference to a string, i.e.
TargetInstrInfo - Interface to description of machine instruction set.
virtual const TargetInstrInfo * getInstrInfo() const
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI char & LiveRangeShrinkID
LiveRangeShrink pass.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void initializeLiveRangeShrinkPass(PassRegistry &)