36#define DEBUG_TYPE "lrshrink"
39 "Number of insructions hoisted to shrink live range.");
51 void getAnalysisUsage(AnalysisUsage &AU)
const override {
56 StringRef getPassName()
const override {
return "Live Range Shrink"; }
58 bool runOnMachineFunction(MachineFunction &MF)
override;
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();
133 DenseMap<Register, std::pair<unsigned, MachineInstr *>> UseMap;
135 for (MachineBasicBlock &
MBB : MF) {
151 bool SawStore =
false;
157 unsigned CurrentOrder = IOM[&
MI];
159 MachineInstr *BarrierMI =
nullptr;
160 for (
const MachineOperand &MO :
MI.operands()) {
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)) {
185 const MachineOperand *DefMO =
nullptr;
186 MachineInstr *
Insert =
nullptr;
190 unsigned NumEligibleUse = 0;
192 for (
const MachineOperand &MO :
MI.operands()) {
193 if (!MO.isReg() || MO.isDead() || MO.isDebug())
211 }
else if (
MRI.hasOneNonDBGUse(
Reg) &&
MRI.hasOneDef(
Reg) && DefMO &&
213 MRI.getRegClass(MO.getReg())) {
218 MachineInstr &DefInstr = *
MRI.def_instr_begin(
Reg);
219 if (!
TII.isCopyInstr(DefInstr))
230 for (MachineInstr *
I = Insert;
I && IOM[
I] ==
Barrier;
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.
Promote Memory to Register
#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)
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 '...
MachineInstrBundleIterator< MachineInstr > iterator
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.
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.
Register getReg() const
getReg - Returns the register number.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
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.
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 &)
FunctionAddr VTableAddr Next