static bool clobbersAllYmmRegs(const MachineOperand &MO) { for (unsigned reg = X86::YMM0; reg < X86::YMM31; ++reg) { if (!MO.clobbersPhysReg(reg)) return false; } for (unsigned reg = X86::ZMM0; reg < X86::ZMM31; ++reg) { if (!MO.clobbersPhysReg(reg)) return false; } return true; }
void AArch64A57FPLoadBalancing:: maybeKillChain(MachineOperand &MO, unsigned Idx, std::map<unsigned, Chain*> &ActiveChains) { // Given an operand and the set of active chains (keyed by register), // determine if a chain should be ended and remove from ActiveChains. MachineInstr *MI = MO.getParent(); if (MO.isReg()) { // If this is a KILL of a current chain, record it. if (MO.isKill() && ActiveChains.find(MO.getReg()) != ActiveChains.end()) { DEBUG(dbgs() << "Kill seen for chain " << TRI->getName(MO.getReg()) << "\n"); ActiveChains[MO.getReg()]->setKill(MI, Idx, /*Immutable=*/MO.isTied()); } ActiveChains.erase(MO.getReg()); } else if (MO.isRegMask()) { for (auto I = ActiveChains.begin(), E = ActiveChains.end(); I != E;) { if (MO.clobbersPhysReg(I->first)) { DEBUG(dbgs() << "Kill (regmask) seen for chain " << TRI->getName(I->first) << "\n"); I->second->setKill(MI, Idx, /*Immutable=*/true); ActiveChains.erase(I++); } else ++I; } } }
/// \brief Remove all registers from the set that get clobbered by the register /// mask. void LivePhysRegs::removeRegsInMask(const MachineOperand &MO) { SparseSet<unsigned>::iterator LRI = LiveRegs.begin(); while (LRI != LiveRegs.end()) { if (MO.clobbersPhysReg(*LRI)) LRI = LiveRegs.erase(LRI); else ++LRI; } }
/// Remove any entry in \p Map that is marked clobbered in \p RegMask. /// The map will typically have a lot fewer entries than the regmask clobbers, /// so this is more efficient than iterating the clobbered registers and calling /// ClobberRegister() on them. static void removeClobberedRegsFromMap(Reg2MIMap &Map, const MachineOperand &RegMask) { for (Reg2MIMap::iterator I = Map.begin(), E = Map.end(), Next; I != E; I = Next) { Next = std::next(I); unsigned Reg = I->first; if (RegMask.clobbersPhysReg(Reg)) Map.erase(I); } }
void LiveVariables::HandleRegMask(const MachineOperand &MO) { // Call HandlePhysRegKill() for all live registers clobbered by Mask. // Clobbered registers are always dead, sp there is no need to use // HandlePhysRegDef(). for (unsigned Reg = 1, NumRegs = TRI->getNumRegs(); Reg != NumRegs; ++Reg) { // Skip dead regs. if (!PhysRegDef[Reg] && !PhysRegUse[Reg]) continue; // Skip mask-preserved regs. if (!MO.clobbersPhysReg(Reg)) continue; // Kill the largest clobbered super-register. // This avoids needless implicit operands. unsigned Super = Reg; for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR) if ((PhysRegDef[*SR] || PhysRegUse[*SR]) && MO.clobbersPhysReg(*SR)) Super = *SR; HandlePhysRegKill(Super, nullptr); } }
/// \brief Remove all registers from the set that get clobbered by the register /// mask. /// The clobbers set will be the list of live registers clobbered /// by the regmask. void LivePhysRegs::removeRegsInMask(const MachineOperand &MO, SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> *Clobbers) { SparseSet<unsigned>::iterator LRI = LiveRegs.begin(); while (LRI != LiveRegs.end()) { if (MO.clobbersPhysReg(*LRI)) { if (Clobbers) Clobbers->push_back(std::make_pair(*LRI, &MO)); LRI = LiveRegs.erase(LRI); } else ++LRI; } }