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);
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
const TargetInstrInfo & TII
This file defines the DenseMap class.
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.
std::optional< DestSourcePair > isCopyInstr(const MachineInstr &MI) const
If the specific machine instruction is a instruction that moves/copies value from one register to ano...
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