/// Examine the instruction for potentai LICM candidate. Also /// gather register def and frame object update information. void MachineLICM::ProcessMI(MachineInstr *MI, BitVector &PhysRegDefs, BitVector &PhysRegClobbers, SmallSet<int, 32> &StoredFIs, SmallVectorImpl<CandidateInfo> &Candidates) { bool RuledOut = false; bool HasNonInvariantUse = false; unsigned Def = 0; for (const MachineOperand &MO : MI->operands()) { if (MO.isFI()) { // Remember if the instruction stores to the frame index. int FI = MO.getIndex(); if (!StoredFIs.count(FI) && MFI->isSpillSlotObjectIndex(FI) && InstructionStoresToFI(MI, FI)) StoredFIs.insert(FI); HasNonInvariantUse = true; continue; } // We can't hoist an instruction defining a physreg that is clobbered in // the loop. if (MO.isRegMask()) { PhysRegClobbers.setBitsNotInMask(MO.getRegMask()); continue; } if (!MO.isReg()) continue; unsigned Reg = MO.getReg(); if (!Reg) continue; assert(TargetRegisterInfo::isPhysicalRegister(Reg) && "Not expecting virtual register!"); if (!MO.isDef()) { if (Reg && (PhysRegDefs.test(Reg) || PhysRegClobbers.test(Reg))) // If it's using a non-loop-invariant register, then it's obviously not // safe to hoist. HasNonInvariantUse = true; continue; } if (MO.isImplicit()) { for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) PhysRegClobbers.set(*AI); if (!MO.isDead()) // Non-dead implicit def? This cannot be hoisted. RuledOut = true; // No need to check if a dead implicit def is also defined by // another instruction. continue; } // FIXME: For now, avoid instructions with multiple defs, unless // it's a dead implicit def. if (Def) RuledOut = true; else Def = Reg; // If we have already seen another instruction that defines the same // register, then this is not safe. Two defs is indicated by setting a // PhysRegClobbers bit. for (MCRegAliasIterator AS(Reg, TRI, true); AS.isValid(); ++AS) { if (PhysRegDefs.test(*AS)) PhysRegClobbers.set(*AS); PhysRegDefs.set(*AS); } if (PhysRegClobbers.test(Reg)) // MI defined register is seen defined by another instruction in // the loop, it cannot be a LICM candidate. RuledOut = true; } // Only consider reloads for now and remats which do not have register // operands. FIXME: Consider unfold load folding instructions. if (Def && !RuledOut) { int FI = INT_MIN; if ((!HasNonInvariantUse && IsLICMCandidate(*MI)) || (TII->isLoadFromStackSlot(*MI, FI) && MFI->isSpillSlotObjectIndex(FI))) Candidates.push_back(CandidateInfo(MI, Def, FI)); } }
/// ProcessMI - Examine the instruction for potentai LICM candidate. Also /// gather register def and frame object update information. void MachineLICM::ProcessMI(MachineInstr *MI, unsigned *PhysRegDefs, SmallSet<int, 32> &StoredFIs, SmallVector<CandidateInfo, 32> &Candidates) { bool RuledOut = false; bool HasNonInvariantUse = false; unsigned Def = 0; for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { const MachineOperand &MO = MI->getOperand(i); if (MO.isFI()) { // Remember if the instruction stores to the frame index. int FI = MO.getIndex(); if (!StoredFIs.count(FI) && MFI->isSpillSlotObjectIndex(FI) && InstructionStoresToFI(MI, FI)) StoredFIs.insert(FI); HasNonInvariantUse = true; continue; } if (!MO.isReg()) continue; unsigned Reg = MO.getReg(); if (!Reg) continue; assert(TargetRegisterInfo::isPhysicalRegister(Reg) && "Not expecting virtual register!"); if (!MO.isDef()) { if (Reg && PhysRegDefs[Reg]) // If it's using a non-loop-invariant register, then it's obviously not // safe to hoist. HasNonInvariantUse = true; continue; } if (MO.isImplicit()) { ++PhysRegDefs[Reg]; for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) ++PhysRegDefs[*AS]; if (!MO.isDead()) // Non-dead implicit def? This cannot be hoisted. RuledOut = true; // No need to check if a dead implicit def is also defined by // another instruction. continue; } // FIXME: For now, avoid instructions with multiple defs, unless // it's a dead implicit def. if (Def) RuledOut = true; else Def = Reg; // If we have already seen another instruction that defines the same // register, then this is not safe. if (++PhysRegDefs[Reg] > 1) // MI defined register is seen defined by another instruction in // the loop, it cannot be a LICM candidate. RuledOut = true; for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) if (++PhysRegDefs[*AS] > 1) RuledOut = true; } // Only consider reloads for now and remats which do not have register // operands. FIXME: Consider unfold load folding instructions. if (Def && !RuledOut) { int FI = INT_MIN; if ((!HasNonInvariantUse && IsLICMCandidate(*MI)) || (TII->isLoadFromStackSlot(MI, FI) && MFI->isSpillSlotObjectIndex(FI))) Candidates.push_back(CandidateInfo(MI, Def, FI)); } }