mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Switch all register list clients to the new MC*Iterator interface.
No functional change intended. Sorry for the churn. The iterator classes are supposed to help avoid giant commits like this one in the future. The TableGen-produced register lists are getting quite large, and it may be necessary to change the table representation. This makes it possible to do so without changing all clients (again). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157854 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4a8fefaf83
commit
396618b43a
@ -336,7 +336,7 @@ public:
|
||||
bool isPhysRegOrOverlapUsed(unsigned Reg) const {
|
||||
if (UsedPhysRegMask.test(Reg))
|
||||
return true;
|
||||
for (const uint16_t *AI = TRI->getOverlaps(Reg); *AI; ++AI)
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
if (UsedPhysRegs.test(*AI))
|
||||
return true;
|
||||
return false;
|
||||
|
@ -361,12 +361,7 @@ public:
|
||||
/// getMatchingSuperReg - Return a super-register of the specified register
|
||||
/// Reg so its sub-register of index SubIdx is Reg.
|
||||
unsigned getMatchingSuperReg(unsigned Reg, unsigned SubIdx,
|
||||
const MCRegisterClass *RC) const {
|
||||
for (const uint16_t *SRs = getSuperRegisters(Reg); unsigned SR = *SRs;++SRs)
|
||||
if (Reg == getSubReg(SR, SubIdx) && RC->contains(SR))
|
||||
return SR;
|
||||
return 0;
|
||||
}
|
||||
const MCRegisterClass *RC) const;
|
||||
|
||||
/// getSubRegIndex - For a given register pair, return the sub-register index
|
||||
/// if the second register is a sub-register of the first. Return zero
|
||||
@ -494,6 +489,15 @@ public:
|
||||
{}
|
||||
};
|
||||
|
||||
inline
|
||||
unsigned MCRegisterInfo::getMatchingSuperReg(unsigned Reg, unsigned SubIdx,
|
||||
const MCRegisterClass *RC) const {
|
||||
for (MCSuperRegIterator Supers(Reg, this); Supers.isValid(); ++Supers)
|
||||
if (Reg == getSubReg(*Supers, SubIdx) && RC->contains(*Supers))
|
||||
return *Supers;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Register Units
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -157,8 +157,8 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
// In a return block, examine the function live-out regs.
|
||||
for (MachineRegisterInfo::liveout_iterator I = MRI.liveout_begin(),
|
||||
E = MRI.liveout_end(); I != E; ++I) {
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(*I);
|
||||
unsigned Reg = *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) {
|
||||
unsigned Reg = *AI;
|
||||
State->UnionGroups(Reg, 0);
|
||||
KillIndices[Reg] = BB->size();
|
||||
DefIndices[Reg] = ~0u;
|
||||
@ -173,8 +173,8 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
SE = BB->succ_end(); SI != SE; ++SI)
|
||||
for (MachineBasicBlock::livein_iterator I = (*SI)->livein_begin(),
|
||||
E = (*SI)->livein_end(); I != E; ++I) {
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(*I);
|
||||
unsigned Reg = *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) {
|
||||
unsigned Reg = *AI;
|
||||
State->UnionGroups(Reg, 0);
|
||||
KillIndices[Reg] = BB->size();
|
||||
DefIndices[Reg] = ~0u;
|
||||
@ -189,8 +189,8 @@ void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
for (const uint16_t *I = TRI->getCalleeSavedRegs(&MF); *I; ++I) {
|
||||
unsigned Reg = *I;
|
||||
if (!IsReturnBlock && !Pristine.test(Reg)) continue;
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(Reg);
|
||||
unsigned AliasReg = *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
|
||||
unsigned AliasReg = *AI;
|
||||
State->UnionGroups(AliasReg, 0);
|
||||
KillIndices[AliasReg] = BB->size();
|
||||
DefIndices[AliasReg] = ~0u;
|
||||
@ -265,10 +265,8 @@ void AggressiveAntiDepBreaker::GetPassthruRegs(MachineInstr *MI,
|
||||
IsImplicitDefUse(MI, MO)) {
|
||||
const unsigned Reg = MO.getReg();
|
||||
PassthruRegs.insert(Reg);
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg) {
|
||||
PassthruRegs.insert(*Subreg);
|
||||
}
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
PassthruRegs.insert(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -333,9 +331,8 @@ void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,
|
||||
DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << tag);
|
||||
}
|
||||
// Repeat for subregisters.
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg) {
|
||||
unsigned SubregReg = *Subreg;
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubregReg = *SubRegs;
|
||||
if (!State->IsLive(SubregReg)) {
|
||||
KillIndices[SubregReg] = KillIdx;
|
||||
DefIndices[SubregReg] = ~0u;
|
||||
@ -392,8 +389,8 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,
|
||||
|
||||
// Any aliased that are live at this point are completely or
|
||||
// partially defined here, so group those aliases with Reg.
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
for (MCRegAliasIterator AI(Reg, TRI, false); AI.isValid(); ++AI) {
|
||||
unsigned AliasReg = *AI;
|
||||
if (State->IsLive(AliasReg)) {
|
||||
State->UnionGroups(Reg, AliasReg);
|
||||
DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << "(via " <<
|
||||
@ -423,9 +420,8 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,
|
||||
continue;
|
||||
|
||||
// Update def for Reg and aliases.
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(Reg);
|
||||
unsigned AliasReg = *Alias; ++Alias)
|
||||
DefIndices[AliasReg] = Count;
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
DefIndices[*AI] = Count;
|
||||
}
|
||||
}
|
||||
|
||||
@ -678,9 +674,8 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
|
||||
goto next_super_reg;
|
||||
} else {
|
||||
bool found = false;
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(NewReg);
|
||||
*Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
for (MCRegAliasIterator AI(NewReg, TRI, false); AI.isValid(); ++AI) {
|
||||
unsigned AliasReg = *AI;
|
||||
if (State->IsLive(AliasReg) ||
|
||||
(KillIndices[Reg] > DefIndices[AliasReg])) {
|
||||
DEBUG(dbgs() << "(alias " << TRI->getName(AliasReg) << " live)");
|
||||
|
@ -796,8 +796,8 @@ void AsmPrinter::EmitDwarfRegOp(const MachineLocation &MLoc) const {
|
||||
const TargetRegisterInfo *TRI = TM.getRegisterInfo();
|
||||
int Reg = TRI->getDwarfRegNum(MLoc.getReg(), false);
|
||||
|
||||
for (const uint16_t *SR = TRI->getSuperRegisters(MLoc.getReg());
|
||||
*SR && Reg < 0; ++SR) {
|
||||
for (MCSuperRegIterator SR(MLoc.getReg(), TRI); SR.isValid() && Reg < 0;
|
||||
++SR) {
|
||||
Reg = TRI->getDwarfRegNum(*SR, false);
|
||||
// FIXME: Get the bit range this register uses of the superregister
|
||||
// so that we can produce a DW_OP_bit_piece
|
||||
|
@ -1309,8 +1309,9 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
||||
MOE = MI->operands_end(); MOI != MOE; ++MOI) {
|
||||
if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
|
||||
continue;
|
||||
for (const uint16_t *AI = TRI->getOverlaps(MOI->getReg());
|
||||
unsigned Reg = *AI; ++AI) {
|
||||
for (MCRegAliasIterator AI(MOI->getReg(), TRI, true);
|
||||
AI.isValid(); ++AI) {
|
||||
unsigned Reg = *AI;
|
||||
const MDNode *Var = LiveUserVar[Reg];
|
||||
if (!Var)
|
||||
continue;
|
||||
|
@ -137,9 +137,8 @@ bool BranchFolder::OptimizeImpDefsBlock(MachineBasicBlock *MBB) {
|
||||
break;
|
||||
unsigned Reg = I->getOperand(0).getReg();
|
||||
ImpDefRegs.insert(Reg);
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs)
|
||||
ImpDefRegs.insert(SubReg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
ImpDefRegs.insert(*SubRegs);
|
||||
++I;
|
||||
}
|
||||
if (ImpDefRegs.empty())
|
||||
@ -1557,8 +1556,8 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
|
||||
} else {
|
||||
if (Uses.count(Reg)) {
|
||||
Uses.erase(Reg);
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(Reg); *SR; ++SR)
|
||||
Uses.erase(*SR); // Use getSubRegisters to be conservative
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
Uses.erase(*SubRegs); // Use sub-registers to be conservative
|
||||
}
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
Defs.insert(*AI);
|
||||
@ -1688,8 +1687,8 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) {
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!Reg || !LocalDefsSet.count(Reg))
|
||||
continue;
|
||||
for (const uint16_t *OR = TRI->getOverlaps(Reg); *OR; ++OR)
|
||||
LocalDefsSet.erase(*OR);
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
LocalDefsSet.erase(*AI);
|
||||
}
|
||||
|
||||
// Track local defs so we can update liveins.
|
||||
@ -1701,8 +1700,8 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) {
|
||||
if (!Reg)
|
||||
continue;
|
||||
LocalDefs.push_back(Reg);
|
||||
for (const uint16_t *OR = TRI->getOverlaps(Reg); *OR; ++OR)
|
||||
LocalDefsSet.insert(*OR);
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
LocalDefsSet.insert(*AI);
|
||||
}
|
||||
|
||||
HasDups = true;
|
||||
|
@ -58,9 +58,8 @@ void CCState::HandleByVal(unsigned ValNo, MVT ValVT,
|
||||
|
||||
/// MarkAllocated - Mark a register and all of its aliases as allocated.
|
||||
void CCState::MarkAllocated(unsigned Reg) {
|
||||
for (const uint16_t *Alias = TRI.getOverlaps(Reg);
|
||||
unsigned Reg = *Alias; ++Alias)
|
||||
UsedRegs[Reg/32] |= 1 << (Reg&31);
|
||||
for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI)
|
||||
UsedRegs[*AI/32] |= 1 << (*AI&31);
|
||||
}
|
||||
|
||||
/// AnalyzeFormalArguments - Analyze an array of argument values,
|
||||
|
@ -200,11 +200,11 @@ void CriticalAntiDepBreaker::PrescanInstruction(MachineInstr *MI) {
|
||||
Classes[Reg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
|
||||
// Now check for aliases.
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator AI(Reg, TRI, false); AI.isValid(); ++AI) {
|
||||
// If an alias of the reg is used during the live range, give up.
|
||||
// Note that this allows us to skip checking if AntiDepReg
|
||||
// overlaps with any of the aliases, among other things.
|
||||
unsigned AliasReg = *Alias;
|
||||
unsigned AliasReg = *AI;
|
||||
if (Classes[AliasReg]) {
|
||||
Classes[AliasReg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
Classes[Reg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
@ -218,9 +218,8 @@ void CriticalAntiDepBreaker::PrescanInstruction(MachineInstr *MI) {
|
||||
if (MO.isUse() && Special) {
|
||||
if (!KeepRegs.test(Reg)) {
|
||||
KeepRegs.set(Reg);
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
KeepRegs.set(*Subreg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
KeepRegs.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -264,9 +263,8 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI,
|
||||
Classes[Reg] = 0;
|
||||
RegRefs.erase(Reg);
|
||||
// Repeat, for all subregs.
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg) {
|
||||
unsigned SubregReg = *Subreg;
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubregReg = *SubRegs;
|
||||
DefIndices[SubregReg] = Count;
|
||||
KillIndices[SubregReg] = ~0u;
|
||||
KeepRegs.reset(SubregReg);
|
||||
@ -274,11 +272,8 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI,
|
||||
RegRefs.erase(SubregReg);
|
||||
}
|
||||
// Conservatively mark super-registers as unusable.
|
||||
for (const uint16_t *Super = TRI->getSuperRegisters(Reg);
|
||||
*Super; ++Super) {
|
||||
unsigned SuperReg = *Super;
|
||||
Classes[SuperReg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
}
|
||||
for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR)
|
||||
Classes[*SR] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
@ -310,8 +305,8 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI,
|
||||
"Kill and Def maps aren't consistent for Reg!");
|
||||
}
|
||||
// Repeat, for all aliases.
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
for (MCRegAliasIterator AI(Reg, TRI, false); AI.isValid(); ++AI) {
|
||||
unsigned AliasReg = *AI;
|
||||
if (KillIndices[AliasReg] == ~0u) {
|
||||
KillIndices[AliasReg] = Count;
|
||||
DefIndices[AliasReg] = ~0u;
|
||||
|
@ -171,9 +171,8 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
|
||||
// Check the subreg set, not the alias set, because a def
|
||||
// of a super-register may still be partially live after
|
||||
// this def.
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
*SubRegs; ++SubRegs)
|
||||
LivePhysRegs.reset(*SubRegs);
|
||||
for (MCSubRegIterator SR(Reg, TRI); SR.isValid(); ++SR)
|
||||
LivePhysRegs.reset(*SR);
|
||||
}
|
||||
} else if (MO.isRegMask()) {
|
||||
// Register mask of preserved registers. All clobbers are dead.
|
||||
|
@ -666,7 +666,8 @@ bool ExeDepsFix::runOnMachineFunction(MachineFunction &mf) {
|
||||
// or -1.
|
||||
AliasMap.resize(TRI->getNumRegs(), -1);
|
||||
for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i)
|
||||
for (const uint16_t *AI = TRI->getOverlaps(RC->getRegister(i)); *AI; ++AI)
|
||||
for (MCRegAliasIterator AI(RC->getRegister(i), TRI, true);
|
||||
AI.isValid(); ++AI)
|
||||
AliasMap[*AI] = i;
|
||||
}
|
||||
|
||||
|
@ -962,9 +962,8 @@ static void InitPredRedefs(MachineBasicBlock *BB, SmallSet<unsigned,4> &Redefs,
|
||||
E = BB->livein_end(); I != E; ++I) {
|
||||
unsigned Reg = *I;
|
||||
Redefs.insert(Reg);
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
Redefs.insert(*Subreg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
Redefs.insert(*SubRegs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -983,8 +982,8 @@ static void UpdatePredRedefs(MachineInstr *MI, SmallSet<unsigned,4> &Redefs,
|
||||
Defs.push_back(Reg);
|
||||
else if (MO.isKill()) {
|
||||
Redefs.erase(Reg);
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(Reg); *SR; ++SR)
|
||||
Redefs.erase(*SR);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
Redefs.erase(*SubRegs);
|
||||
}
|
||||
}
|
||||
for (unsigned i = 0, e = Defs.size(); i != e; ++i) {
|
||||
@ -997,8 +996,8 @@ static void UpdatePredRedefs(MachineInstr *MI, SmallSet<unsigned,4> &Redefs,
|
||||
false/*IsDead*/,true/*IsUndef*/));
|
||||
} else {
|
||||
Redefs.insert(Reg);
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(Reg); *SR; ++SR)
|
||||
Redefs.insert(*SR);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
Redefs.insert(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1336,8 +1335,8 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
|
||||
// These are defined before ctrl flow reach the 'false' instructions.
|
||||
// They cannot be modified by the 'true' instructions.
|
||||
ExtUses.insert(Reg);
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(Reg); *SR; ++SR)
|
||||
ExtUses.insert(*SR);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
ExtUses.insert(*SubRegs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1345,8 +1344,8 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
|
||||
unsigned Reg = Defs[i];
|
||||
if (!ExtUses.count(Reg)) {
|
||||
RedefsByFalse.insert(Reg);
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(Reg); *SR; ++SR)
|
||||
RedefsByFalse.insert(*SR);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
RedefsByFalse.insert(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -80,8 +80,8 @@ void InterferenceCache::Entry::reset(unsigned physReg,
|
||||
PhysReg = physReg;
|
||||
Blocks.resize(MF->getNumBlockIDs());
|
||||
Aliases.clear();
|
||||
for (const uint16_t *AS = TRI->getOverlaps(PhysReg); *AS; ++AS) {
|
||||
LiveIntervalUnion *LIU = LIUArray + *AS;
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI) {
|
||||
LiveIntervalUnion *LIU = LIUArray + *AI;
|
||||
Aliases.push_back(std::make_pair(LIU, LIU->getTag()));
|
||||
}
|
||||
|
||||
@ -96,8 +96,8 @@ void InterferenceCache::Entry::reset(unsigned physReg,
|
||||
bool InterferenceCache::Entry::valid(LiveIntervalUnion *LIUArray,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
unsigned i = 0, e = Aliases.size();
|
||||
for (const uint16_t *AS = TRI->getOverlaps(PhysReg); *AS; ++AS, ++i) {
|
||||
LiveIntervalUnion *LIU = LIUArray + *AS;
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI, ++i) {
|
||||
LiveIntervalUnion *LIU = LIUArray + *AI;
|
||||
if (i == e || Aliases[i].first != LIU)
|
||||
return false;
|
||||
if (LIU->changedSince(Aliases[i].second))
|
||||
|
@ -192,8 +192,8 @@ MachineInstr *LiveVariables::FindLastPartialDef(unsigned Reg,
|
||||
unsigned LastDefReg = 0;
|
||||
unsigned LastDefDist = 0;
|
||||
MachineInstr *LastDef = NULL;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
MachineInstr *Def = PhysRegDef[SubReg];
|
||||
if (!Def)
|
||||
continue;
|
||||
@ -216,9 +216,8 @@ MachineInstr *LiveVariables::FindLastPartialDef(unsigned Reg,
|
||||
unsigned DefReg = MO.getReg();
|
||||
if (TRI->isSubRegister(Reg, DefReg)) {
|
||||
PartDefRegs.insert(DefReg);
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(DefReg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs)
|
||||
PartDefRegs.insert(SubReg);
|
||||
for (MCSubRegIterator SubRegs(DefReg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
PartDefRegs.insert(*SubRegs);
|
||||
}
|
||||
}
|
||||
return LastDef;
|
||||
@ -247,8 +246,8 @@ void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
|
||||
true/*IsImp*/));
|
||||
PhysRegDef[Reg] = LastPartialDef;
|
||||
SmallSet<unsigned, 8> Processed;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
if (Processed.count(SubReg))
|
||||
continue;
|
||||
if (PartDefRegs.count(SubReg))
|
||||
@ -259,7 +258,7 @@ void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
|
||||
false/*IsDef*/,
|
||||
true/*IsImp*/));
|
||||
PhysRegDef[SubReg] = LastPartialDef;
|
||||
for (const uint16_t *SS = TRI->getSubRegisters(SubReg); *SS; ++SS)
|
||||
for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
|
||||
Processed.insert(*SS);
|
||||
}
|
||||
}
|
||||
@ -271,9 +270,8 @@ void LiveVariables::HandlePhysRegUse(unsigned Reg, MachineInstr *MI) {
|
||||
|
||||
// Remember this use.
|
||||
PhysRegUse[Reg] = MI;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs)
|
||||
PhysRegUse[SubReg] = MI;
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
PhysRegUse[*SubRegs] = MI;
|
||||
}
|
||||
|
||||
/// FindLastRefOrPartRef - Return the last reference or partial reference of
|
||||
@ -287,8 +285,8 @@ MachineInstr *LiveVariables::FindLastRefOrPartRef(unsigned Reg) {
|
||||
MachineInstr *LastRefOrPartRef = LastUse ? LastUse : LastDef;
|
||||
unsigned LastRefOrPartRefDist = DistanceMap[LastRefOrPartRef];
|
||||
unsigned LastPartDefDist = 0;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
MachineInstr *Def = PhysRegDef[SubReg];
|
||||
if (Def && Def != LastDef) {
|
||||
// There was a def of this sub-register in between. This is a partial
|
||||
@ -336,8 +334,8 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
||||
MachineInstr *LastPartDef = 0;
|
||||
unsigned LastPartDefDist = 0;
|
||||
SmallSet<unsigned, 8> PartUses;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
MachineInstr *Def = PhysRegDef[SubReg];
|
||||
if (Def && Def != LastDef) {
|
||||
// There was a def of this sub-register in between. This is a partial
|
||||
@ -351,7 +349,7 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
||||
}
|
||||
if (MachineInstr *Use = PhysRegUse[SubReg]) {
|
||||
PartUses.insert(SubReg);
|
||||
for (const uint16_t *SS = TRI->getSubRegisters(SubReg); *SS; ++SS)
|
||||
for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
|
||||
PartUses.insert(*SS);
|
||||
unsigned Dist = DistanceMap[Use];
|
||||
if (Dist > LastRefOrPartRefDist) {
|
||||
@ -367,8 +365,8 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
||||
// EAX<dead> = op AL<imp-def>
|
||||
// That is, EAX def is dead but AL def extends pass it.
|
||||
PhysRegDef[Reg]->addRegisterDead(Reg, TRI, true);
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
if (!PartUses.count(SubReg))
|
||||
continue;
|
||||
bool NeedDef = true;
|
||||
@ -388,11 +386,10 @@ bool LiveVariables::HandlePhysRegKill(unsigned Reg, MachineInstr *MI) {
|
||||
else {
|
||||
LastRefOrPartRef->addRegisterKilled(SubReg, TRI, true);
|
||||
PhysRegUse[SubReg] = LastRefOrPartRef;
|
||||
for (const uint16_t *SSRegs = TRI->getSubRegisters(SubReg);
|
||||
unsigned SSReg = *SSRegs; ++SSRegs)
|
||||
PhysRegUse[SSReg] = LastRefOrPartRef;
|
||||
for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
|
||||
PhysRegUse[*SS] = LastRefOrPartRef;
|
||||
}
|
||||
for (const uint16_t *SS = TRI->getSubRegisters(SubReg); *SS; ++SS)
|
||||
for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
|
||||
PartUses.erase(*SS);
|
||||
}
|
||||
} else if (LastRefOrPartRef == PhysRegDef[Reg] && LastRefOrPartRef != MI) {
|
||||
@ -434,7 +431,7 @@ void LiveVariables::HandleRegMask(const MachineOperand &MO) {
|
||||
// Kill the largest clobbered super-register.
|
||||
// This avoids needless implicit operands.
|
||||
unsigned Super = Reg;
|
||||
for (const uint16_t *SR = TRI->getSuperRegisters(Reg); *SR; ++SR)
|
||||
for (MCSuperRegIterator SR(Reg, TRI); SR.isValid(); ++SR)
|
||||
if ((PhysRegDef[*SR] || PhysRegUse[*SR]) && MO.clobbersPhysReg(*SR))
|
||||
Super = *SR;
|
||||
HandlePhysRegKill(Super, 0);
|
||||
@ -447,11 +444,11 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI,
|
||||
SmallSet<unsigned, 32> Live;
|
||||
if (PhysRegDef[Reg] || PhysRegUse[Reg]) {
|
||||
Live.insert(Reg);
|
||||
for (const uint16_t *SS = TRI->getSubRegisters(Reg); *SS; ++SS)
|
||||
Live.insert(*SS);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
Live.insert(*SubRegs);
|
||||
} else {
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
// If a register isn't itself defined, but all parts that make up of it
|
||||
// are defined, then consider it also defined.
|
||||
// e.g.
|
||||
@ -462,7 +459,7 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI,
|
||||
continue;
|
||||
if (PhysRegDef[SubReg] || PhysRegUse[SubReg]) {
|
||||
Live.insert(SubReg);
|
||||
for (const uint16_t *SS = TRI->getSubRegisters(SubReg); *SS; ++SS)
|
||||
for (MCSubRegIterator SS(SubReg, TRI); SS.isValid(); ++SS)
|
||||
Live.insert(*SS);
|
||||
}
|
||||
}
|
||||
@ -472,8 +469,8 @@ void LiveVariables::HandlePhysRegDef(unsigned Reg, MachineInstr *MI,
|
||||
// is referenced.
|
||||
HandlePhysRegKill(Reg, MI);
|
||||
// Only some of the sub-registers are used.
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
if (!Live.count(SubReg))
|
||||
// Skip if this sub-register isn't defined.
|
||||
continue;
|
||||
@ -491,8 +488,8 @@ void LiveVariables::UpdatePhysRegDefs(MachineInstr *MI,
|
||||
Defs.pop_back();
|
||||
PhysRegDef[Reg] = MI;
|
||||
PhysRegUse[Reg] = NULL;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
PhysRegDef[SubReg] = MI;
|
||||
PhysRegUse[SubReg] = NULL;
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ MachineCopyPropagation::SourceNoLongerAvailable(unsigned Reg,
|
||||
unsigned MappedDef = *I;
|
||||
// Source of copy is no longer available for propagation.
|
||||
if (AvailCopyMap.erase(MappedDef)) {
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(MappedDef); *SR; ++SR)
|
||||
for (MCSubRegIterator SR(MappedDef, TRI); SR.isValid(); ++SR)
|
||||
AvailCopyMap.erase(*SR);
|
||||
}
|
||||
}
|
||||
@ -196,13 +196,13 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
|
||||
// Remember Def is defined by the copy.
|
||||
// ... Make sure to clear the def maps of aliases first.
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Def); *AS; ++AS) {
|
||||
CopyMap.erase(*AS);
|
||||
AvailCopyMap.erase(*AS);
|
||||
for (MCRegAliasIterator AI(Def, TRI, false); AI.isValid(); ++AI) {
|
||||
CopyMap.erase(*AI);
|
||||
AvailCopyMap.erase(*AI);
|
||||
}
|
||||
CopyMap[Def] = MI;
|
||||
AvailCopyMap[Def] = MI;
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(Def); *SR; ++SR) {
|
||||
for (MCSubRegIterator SR(Def, TRI); SR.isValid(); ++SR) {
|
||||
CopyMap[*SR] = MI;
|
||||
AvailCopyMap[*SR] = MI;
|
||||
}
|
||||
|
@ -1538,12 +1538,14 @@ void MachineInstr::print(raw_ostream &OS, const TargetMachine *TM) const {
|
||||
const MachineRegisterInfo &MRI = MF->getRegInfo();
|
||||
if (MRI.use_empty(Reg) && !MRI.isLiveOut(Reg)) {
|
||||
bool HasAliasLive = false;
|
||||
for (const uint16_t *Alias = TM->getRegisterInfo()->getAliasSet(Reg);
|
||||
unsigned AliasReg = *Alias; ++Alias)
|
||||
for (MCRegAliasIterator AI(Reg, TM->getRegisterInfo(), true);
|
||||
AI.isValid(); ++AI) {
|
||||
unsigned AliasReg = *AI;
|
||||
if (!MRI.use_empty(AliasReg) || MRI.isLiveOut(AliasReg)) {
|
||||
HasAliasLive = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!HasAliasLive) {
|
||||
OmittedAnyCallClobbers = true;
|
||||
continue;
|
||||
@ -1675,7 +1677,8 @@ bool MachineInstr::addRegisterKilled(unsigned IncomingReg,
|
||||
const TargetRegisterInfo *RegInfo,
|
||||
bool AddIfNotFound) {
|
||||
bool isPhysReg = TargetRegisterInfo::isPhysicalRegister(IncomingReg);
|
||||
bool hasAliases = isPhysReg && RegInfo->getAliasSet(IncomingReg);
|
||||
bool hasAliases = isPhysReg &&
|
||||
MCRegAliasIterator(IncomingReg, RegInfo, false).isValid();
|
||||
bool Found = false;
|
||||
SmallVector<unsigned,4> DeadOps;
|
||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
||||
@ -1747,7 +1750,8 @@ bool MachineInstr::addRegisterDead(unsigned IncomingReg,
|
||||
const TargetRegisterInfo *RegInfo,
|
||||
bool AddIfNotFound) {
|
||||
bool isPhysReg = TargetRegisterInfo::isPhysicalRegister(IncomingReg);
|
||||
bool hasAliases = isPhysReg && RegInfo->getAliasSet(IncomingReg);
|
||||
bool hasAliases = isPhysReg &&
|
||||
MCRegAliasIterator(IncomingReg, RegInfo, false).isValid();
|
||||
bool Found = false;
|
||||
SmallVector<unsigned,4> DeadOps;
|
||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
||||
|
@ -169,8 +169,8 @@ void llvm::finalizeBundle(MachineBasicBlock &MBB,
|
||||
}
|
||||
|
||||
if (!MO.isDead()) {
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
unsigned SubReg = *SubRegs;
|
||||
if (LocalDefSet.insert(SubReg))
|
||||
LocalDefs.push_back(SubReg);
|
||||
}
|
||||
|
@ -445,8 +445,8 @@ void MachineLICM::ProcessMI(MachineInstr *MI,
|
||||
}
|
||||
|
||||
if (MO.isImplicit()) {
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
PhysRegClobbers.set(*AS);
|
||||
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;
|
||||
@ -465,7 +465,7 @@ void MachineLICM::ProcessMI(MachineInstr *MI,
|
||||
// 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 (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS) {
|
||||
for (MCRegAliasIterator AS(Reg, TRI, true); AS.isValid(); ++AS) {
|
||||
if (PhysRegDefs.test(*AS))
|
||||
PhysRegClobbers.set(*AS);
|
||||
if (PhysRegClobbers.test(*AS))
|
||||
@ -517,8 +517,8 @@ void MachineLICM::HoistRegionPostRA() {
|
||||
for (MachineBasicBlock::livein_iterator I = BB->livein_begin(),
|
||||
E = BB->livein_end(); I != E; ++I) {
|
||||
unsigned Reg = *I;
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
PhysRegDefs.set(*AS);
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
PhysRegDefs.set(*AI);
|
||||
}
|
||||
|
||||
SpeculationState = SpeculateUnknown;
|
||||
@ -540,8 +540,8 @@ void MachineLICM::HoistRegionPostRA() {
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!Reg)
|
||||
continue;
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
TermRegs.set(*AS);
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
TermRegs.set(*AI);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -268,15 +268,15 @@ bool MachineRegisterInfo::isConstantPhysReg(unsigned PhysReg,
|
||||
assert(TargetRegisterInfo::isPhysicalRegister(PhysReg));
|
||||
|
||||
// Check if any overlapping register is modified.
|
||||
for (const uint16_t *R = TRI->getOverlaps(PhysReg); *R; ++R)
|
||||
if (!def_empty(*R))
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI)
|
||||
if (!def_empty(*AI))
|
||||
return false;
|
||||
|
||||
// Check if any overlapping register is allocatable so it may be used later.
|
||||
if (AllocatableRegs.empty())
|
||||
AllocatableRegs = TRI->getAllocatableSet(MF);
|
||||
for (const uint16_t *R = TRI->getOverlaps(PhysReg); *R; ++R)
|
||||
if (AllocatableRegs.test(*R))
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI)
|
||||
if (AllocatableRegs.test(*AI))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -89,8 +89,8 @@ namespace {
|
||||
void addRegWithSubRegs(RegVector &RV, unsigned Reg) {
|
||||
RV.push_back(Reg);
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Reg))
|
||||
for (const uint16_t *R = TRI->getSubRegisters(Reg); *R; R++)
|
||||
RV.push_back(*R);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
RV.push_back(*SubRegs);
|
||||
}
|
||||
|
||||
struct BBInfo {
|
||||
@ -384,10 +384,10 @@ void MachineVerifier::visitMachineFunctionBefore() {
|
||||
// A sub-register of a reserved register is also reserved
|
||||
for (int Reg = regsReserved.find_first(); Reg>=0;
|
||||
Reg = regsReserved.find_next(Reg)) {
|
||||
for (const uint16_t *Sub = TRI->getSubRegisters(Reg); *Sub; ++Sub) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
// FIXME: This should probably be:
|
||||
// assert(regsReserved.test(*Sub) && "Non-reserved sub-register");
|
||||
regsReserved.set(*Sub);
|
||||
// assert(regsReserved.test(*SubRegs) && "Non-reserved sub-register");
|
||||
regsReserved.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -554,8 +554,8 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
|
||||
continue;
|
||||
}
|
||||
regsLive.insert(*I);
|
||||
for (const uint16_t *R = TRI->getSubRegisters(*I); *R; R++)
|
||||
regsLive.insert(*R);
|
||||
for (MCSubRegIterator SubRegs(*I, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
regsLive.insert(*SubRegs);
|
||||
}
|
||||
regsLiveInButUnused = regsLive;
|
||||
|
||||
@ -564,8 +564,8 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
|
||||
BitVector PR = MFI->getPristineRegs(MBB);
|
||||
for (int I = PR.find_first(); I>0; I = PR.find_next(I)) {
|
||||
regsLive.insert(I);
|
||||
for (const uint16_t *R = TRI->getSubRegisters(I); *R; R++)
|
||||
regsLive.insert(*R);
|
||||
for (MCSubRegIterator SubRegs(I, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
regsLive.insert(*SubRegs);
|
||||
}
|
||||
|
||||
regsKilled.clear();
|
||||
|
@ -427,9 +427,8 @@ void SchedulePostRATDList::StartBlockForKills(MachineBasicBlock *BB) {
|
||||
unsigned Reg = *I;
|
||||
LiveRegs.set(Reg);
|
||||
// Repeat, for all subregs.
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
LiveRegs.set(*Subreg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
LiveRegs.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@ -441,9 +440,8 @@ void SchedulePostRATDList::StartBlockForKills(MachineBasicBlock *BB) {
|
||||
unsigned Reg = *I;
|
||||
LiveRegs.set(Reg);
|
||||
// Repeat, for all subregs.
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
LiveRegs.set(*Subreg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
LiveRegs.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -468,10 +466,9 @@ bool SchedulePostRATDList::ToggleKillFlag(MachineInstr *MI,
|
||||
MO.setIsKill(false);
|
||||
bool AllDead = true;
|
||||
const unsigned SuperReg = MO.getReg();
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(SuperReg);
|
||||
*Subreg; ++Subreg) {
|
||||
if (LiveRegs.test(*Subreg)) {
|
||||
MI->addOperand(MachineOperand::CreateReg(*Subreg,
|
||||
for (MCSubRegIterator SubRegs(SuperReg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
if (LiveRegs.test(*SubRegs)) {
|
||||
MI->addOperand(MachineOperand::CreateReg(*SubRegs,
|
||||
true /*IsDef*/,
|
||||
true /*IsImp*/,
|
||||
false /*IsKill*/,
|
||||
@ -521,9 +518,8 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
|
||||
LiveRegs.reset(Reg);
|
||||
|
||||
// Repeat for all subregs.
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
LiveRegs.reset(*Subreg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
LiveRegs.reset(*SubRegs);
|
||||
}
|
||||
|
||||
// Examine all used registers and set/clear kill flag. When a
|
||||
@ -540,9 +536,8 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
|
||||
if (!killedRegs.test(Reg)) {
|
||||
kill = true;
|
||||
// A register is not killed if any subregs are live...
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg) {
|
||||
if (LiveRegs.test(*Subreg)) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
|
||||
if (LiveRegs.test(*SubRegs)) {
|
||||
kill = false;
|
||||
break;
|
||||
}
|
||||
@ -574,9 +569,8 @@ void SchedulePostRATDList::FixupKills(MachineBasicBlock *MBB) {
|
||||
|
||||
LiveRegs.set(Reg);
|
||||
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
LiveRegs.set(*Subreg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
LiveRegs.set(*SubRegs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -113,8 +113,8 @@ bool ProcessImplicitDefs::runOnMachineFunction(MachineFunction &fn) {
|
||||
unsigned Reg = MI->getOperand(0).getReg();
|
||||
ImpDefRegs.insert(Reg);
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
|
||||
for (const uint16_t *SS = TRI->getSubRegisters(Reg); *SS; ++SS)
|
||||
ImpDefRegs.insert(*SS);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
ImpDefRegs.insert(*SubRegs);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
@ -239,9 +239,9 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
// physical register. Return the interfering register.
|
||||
unsigned RegAllocBase::checkPhysRegInterference(LiveInterval &VirtReg,
|
||||
unsigned PhysReg) {
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI)
|
||||
if (query(VirtReg, *AliasI).checkInterference())
|
||||
return *AliasI;
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI)
|
||||
if (query(VirtReg, *AI).checkInterference())
|
||||
return *AI;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -204,8 +204,8 @@ bool RABasic::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
// either the union or live intervals.
|
||||
unsigned NumInterferences = 0;
|
||||
// Collect interferences assigned to any alias of the physical register.
|
||||
for (const uint16_t *asI = TRI->getOverlaps(PhysReg); *asI; ++asI) {
|
||||
LiveIntervalUnion::Query &QAlias = query(VirtReg, *asI);
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI) {
|
||||
LiveIntervalUnion::Query &QAlias = query(VirtReg, *AI);
|
||||
NumInterferences += QAlias.collectInterferingVRegs();
|
||||
if (QAlias.seenUnspillableVReg()) {
|
||||
return false;
|
||||
@ -216,8 +216,8 @@ bool RABasic::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
assert(NumInterferences > 0 && "expect interference");
|
||||
|
||||
// Spill each interfering vreg allocated to PhysReg or an alias.
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI)
|
||||
spillReg(VirtReg, *AliasI, SplitVRegs);
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI)
|
||||
spillReg(VirtReg, *AI, SplitVRegs);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -354,8 +354,8 @@ void RAFast::usePhysReg(MachineOperand &MO) {
|
||||
}
|
||||
|
||||
// Maybe a superregister is reserved?
|
||||
for (const uint16_t *AS = TRI->getAliasSet(PhysReg);
|
||||
unsigned Alias = *AS; ++AS) {
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, false); AI.isValid(); ++AI) {
|
||||
unsigned Alias = *AI;
|
||||
switch (PhysRegState[Alias]) {
|
||||
case regDisabled:
|
||||
break;
|
||||
@ -408,8 +408,8 @@ void RAFast::definePhysReg(MachineInstr *MI, unsigned PhysReg,
|
||||
|
||||
// This is a disabled register, disable all aliases.
|
||||
PhysRegState[PhysReg] = NewState;
|
||||
for (const uint16_t *AS = TRI->getAliasSet(PhysReg);
|
||||
unsigned Alias = *AS; ++AS) {
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, false); AI.isValid(); ++AI) {
|
||||
unsigned Alias = *AI;
|
||||
switch (unsigned VirtReg = PhysRegState[Alias]) {
|
||||
case regDisabled:
|
||||
break;
|
||||
@ -456,8 +456,8 @@ unsigned RAFast::calcSpillCost(unsigned PhysReg) const {
|
||||
// This is a disabled register, add up cost of aliases.
|
||||
DEBUG(dbgs() << PrintReg(PhysReg, TRI) << " is disabled.\n");
|
||||
unsigned Cost = 0;
|
||||
for (const uint16_t *AS = TRI->getAliasSet(PhysReg);
|
||||
unsigned Alias = *AS; ++AS) {
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, false); AI.isValid(); ++AI) {
|
||||
unsigned Alias = *AI;
|
||||
if (UsedInInstr.test(Alias))
|
||||
return spillImpossible;
|
||||
switch (unsigned VirtReg = PhysRegState[Alias]) {
|
||||
|
@ -541,8 +541,8 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
Cascade = NextCascade;
|
||||
|
||||
EvictionCost Cost;
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
|
||||
LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI) {
|
||||
LiveIntervalUnion::Query &Q = query(VirtReg, *AI);
|
||||
// If there is 10 or more interferences, chances are one is heavier.
|
||||
if (Q.collectInterferingVRegs(10) >= 10)
|
||||
return false;
|
||||
@ -605,8 +605,8 @@ void RAGreedy::evictInterference(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
|
||||
DEBUG(dbgs() << "evicting " << PrintReg(PhysReg, TRI)
|
||||
<< " interference: Cascade " << Cascade << '\n');
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
|
||||
LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI) {
|
||||
LiveIntervalUnion::Query &Q = query(VirtReg, *AI);
|
||||
assert(Q.seenAllInterferences() && "Didn't check all interfererences.");
|
||||
for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) {
|
||||
LiveInterval *Intf = Q.interferingVRegs()[i];
|
||||
@ -1358,7 +1358,7 @@ void RAGreedy::calcGapWeights(unsigned PhysReg,
|
||||
GapWeight.assign(NumGaps, 0.0f);
|
||||
|
||||
// Add interference from each overlapping register.
|
||||
for (const uint16_t *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) {
|
||||
for (MCRegAliasIterator AI(PhysReg, TRI, true); AI.isValid(); ++AI) {
|
||||
if (!query(const_cast<LiveInterval&>(SA->getParent()), *AI)
|
||||
.checkInterference())
|
||||
continue;
|
||||
|
@ -291,15 +291,11 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
|
||||
}
|
||||
|
||||
// Also remove any aliases.
|
||||
const uint16_t *aliasItr = tri->getAliasSet(preg);
|
||||
if (aliasItr != 0) {
|
||||
for (; *aliasItr != 0; ++aliasItr) {
|
||||
VRAllowed::iterator eraseItr =
|
||||
std::find(vrAllowed.begin(), vrAllowed.end(), *aliasItr);
|
||||
|
||||
if (eraseItr != vrAllowed.end()) {
|
||||
vrAllowed.erase(eraseItr);
|
||||
}
|
||||
for (MCRegAliasIterator AI(preg, tri, false); AI.isValid(); ++AI) {
|
||||
VRAllowed::iterator eraseItr =
|
||||
std::find(vrAllowed.begin(), vrAllowed.end(), *AI);
|
||||
if (eraseItr != vrAllowed.end()) {
|
||||
vrAllowed.erase(eraseItr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -50,9 +50,8 @@ void RegisterClassInfo::runOnMachineFunction(const MachineFunction &mf) {
|
||||
CSRNum.clear();
|
||||
CSRNum.resize(TRI->getNumRegs(), 0);
|
||||
for (unsigned N = 0; unsigned Reg = CSR[N]; ++N)
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg);
|
||||
unsigned Alias = *AS; ++AS)
|
||||
CSRNum[Alias] = N + 1; // 0 means no CSR, 1 means CalleeSaved[0], ...
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
CSRNum[*AI] = N + 1; // 0 means no CSR, 1 means CalleeSaved[0], ...
|
||||
Update = true;
|
||||
}
|
||||
CalleeSaved = CSR;
|
||||
|
@ -470,7 +470,7 @@ bool RegisterCoalescer::adjustCopiesBackFrom(const CoalescerPair &CP,
|
||||
// If the IntB live range is assigned to a physical register, and if that
|
||||
// physreg has sub-registers, update their live intervals as well.
|
||||
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
|
||||
for (const uint16_t *SR = TRI->getSubRegisters(IntB.reg); *SR; ++SR) {
|
||||
for (MCSubRegIterator SR(IntB.reg, TRI); SR.isValid(); ++SR) {
|
||||
if (!LIS->hasInterval(*SR))
|
||||
continue;
|
||||
LiveInterval &SRLI = LIS->getInterval(*SR);
|
||||
@ -1112,7 +1112,7 @@ bool RegisterCoalescer::joinReservedPhysReg(CoalescerPair &CP) {
|
||||
|
||||
// Deny any overlapping intervals. This depends on all the reserved
|
||||
// register live ranges to look like dead defs.
|
||||
for (const uint16_t *AS = TRI->getOverlaps(CP.getDstReg()); *AS; ++AS) {
|
||||
for (MCRegAliasIterator AS(CP.getDstReg(), TRI, true); AS.isValid(); ++AS) {
|
||||
if (!LIS->hasInterval(*AS)) {
|
||||
// Make sure at least DstReg itself exists before attempting a join.
|
||||
if (*AS == CP.getDstReg())
|
||||
|
@ -271,10 +271,9 @@ void RegPressureTracker::closeRegion() {
|
||||
static bool hasRegAlias(unsigned Reg, SparseSet<unsigned> &Regs,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
assert(!TargetRegisterInfo::isVirtualRegister(Reg) && "only for physregs");
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) {
|
||||
if (Regs.count(*Alias))
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
|
||||
if (Regs.count(*AI))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -283,9 +282,9 @@ static bool hasRegAlias(unsigned Reg, SparseSet<unsigned> &Regs,
|
||||
static SmallVectorImpl<unsigned>::iterator
|
||||
findRegAlias(unsigned Reg, SmallVectorImpl<unsigned> &Regs,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(Reg); *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
|
||||
SmallVectorImpl<unsigned>::iterator I =
|
||||
std::find(Regs.begin(), Regs.end(), *Alias);
|
||||
std::find(Regs.begin(), Regs.end(), *AI);
|
||||
if (I != Regs.end())
|
||||
return I;
|
||||
}
|
||||
|
@ -37,9 +37,8 @@ using namespace llvm;
|
||||
void RegScavenger::setUsed(unsigned Reg) {
|
||||
RegsAvailable.reset(Reg);
|
||||
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs)
|
||||
RegsAvailable.reset(SubReg);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
RegsAvailable.reset(*SubRegs);
|
||||
}
|
||||
|
||||
bool RegScavenger::isAliasUsed(unsigned Reg) const {
|
||||
@ -112,8 +111,8 @@ void RegScavenger::enterBasicBlock(MachineBasicBlock *mbb) {
|
||||
|
||||
void RegScavenger::addRegWithSubRegs(BitVector &BV, unsigned Reg) {
|
||||
BV.set(Reg);
|
||||
for (const uint16_t *R = TRI->getSubRegisters(Reg); *R; R++)
|
||||
BV.set(*R);
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
BV.set(*SubRegs);
|
||||
}
|
||||
|
||||
void RegScavenger::forward() {
|
||||
@ -193,9 +192,8 @@ void RegScavenger::forward() {
|
||||
// Ideally we would like a way to model this, but leaving the
|
||||
// insert_subreg around causes both correctness and performance issues.
|
||||
bool SubUsed = false;
|
||||
for (const uint16_t *SubRegs = TRI->getSubRegisters(Reg);
|
||||
unsigned SubReg = *SubRegs; ++SubRegs)
|
||||
if (isUsed(SubReg)) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs)
|
||||
if (isUsed(*SubRegs)) {
|
||||
SubUsed = true;
|
||||
break;
|
||||
}
|
||||
|
@ -241,7 +241,8 @@ void ScheduleDAGInstrs::addPhysRegDataDeps(SUnit *SU,
|
||||
unsigned SpecialAddressLatency = ST.getSpecialAddressLatency();
|
||||
unsigned DataLatency = SU->Latency;
|
||||
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(MO.getReg()); *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator Alias(MO.getReg(), TRI, true);
|
||||
Alias.isValid(); ++Alias) {
|
||||
if (!Uses.contains(*Alias))
|
||||
continue;
|
||||
std::vector<SUnit*> &UseList = Uses[*Alias];
|
||||
@ -294,7 +295,8 @@ void ScheduleDAGInstrs::addPhysRegDeps(SUnit *SU, unsigned OperIdx) {
|
||||
// TODO: Using a latency of 1 here for output dependencies assumes
|
||||
// there's no cost for reusing registers.
|
||||
SDep::Kind Kind = MO.isUse() ? SDep::Anti : SDep::Output;
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(MO.getReg()); *Alias; ++Alias) {
|
||||
for (MCRegAliasIterator Alias(MO.getReg(), TRI, true);
|
||||
Alias.isValid(); ++Alias) {
|
||||
if (!Defs.contains(*Alias))
|
||||
continue;
|
||||
std::vector<SUnit *> &DefList = Defs[*Alias];
|
||||
|
@ -1182,7 +1182,7 @@ static void CheckForLiveRegDef(SUnit *SU, unsigned Reg,
|
||||
SmallSet<unsigned, 4> &RegAdded,
|
||||
SmallVector<unsigned, 4> &LRegs,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(Reg); *AliasI; ++AliasI) {
|
||||
for (MCRegAliasIterator AliasI(Reg, TRI, true); AliasI.isValid(); ++AliasI) {
|
||||
|
||||
// Check if Ref is live.
|
||||
if (!LiveRegDefs[*AliasI]) continue;
|
||||
|
@ -76,16 +76,14 @@ static void TrackDefUses(MachineInstr *MI,
|
||||
for (unsigned i = 0, e = LocalUses.size(); i != e; ++i) {
|
||||
unsigned Reg = LocalUses[i];
|
||||
Uses.insert(Reg);
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
for (MCSubRegIterator Subreg(Reg, TRI); Subreg.isValid(); ++Subreg)
|
||||
Uses.insert(*Subreg);
|
||||
}
|
||||
|
||||
for (unsigned i = 0, e = LocalDefs.size(); i != e; ++i) {
|
||||
unsigned Reg = LocalDefs[i];
|
||||
Defs.insert(Reg);
|
||||
for (const uint16_t *Subreg = TRI->getSubRegisters(Reg);
|
||||
*Subreg; ++Subreg)
|
||||
for (MCSubRegIterator Subreg(Reg, TRI); Subreg.isValid(); ++Subreg)
|
||||
Defs.insert(*Subreg);
|
||||
if (Reg == ARM::CPSR)
|
||||
continue;
|
||||
|
@ -125,8 +125,8 @@ static unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB,
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!Reg)
|
||||
continue;
|
||||
for (const uint16_t *AsI = TRI.getOverlaps(Reg); *AsI; ++AsI)
|
||||
Uses.insert(*AsI);
|
||||
for (MCRegAliasIterator AI(Reg, &TRI, true); AI.isValid(); ++AI)
|
||||
Uses.insert(*AI);
|
||||
}
|
||||
|
||||
const uint16_t *CS = Is64Bit ? CallerSavedRegs64Bit : CallerSavedRegs32Bit;
|
||||
|
@ -323,14 +323,13 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
X86::R8, X86::R9, X86::R10, X86::R11,
|
||||
X86::R12, X86::R13, X86::R14, X86::R15
|
||||
};
|
||||
for (const uint16_t *AI = getOverlaps(GPR64[n]); unsigned Reg = *AI; ++AI)
|
||||
Reserved.set(Reg);
|
||||
for (MCRegAliasIterator AI(GPR64[n], this, true); AI.isValid(); ++AI)
|
||||
Reserved.set(*AI);
|
||||
|
||||
// XMM8, XMM9, ...
|
||||
assert(X86::XMM15 == X86::XMM8+7);
|
||||
for (const uint16_t *AI = getOverlaps(X86::XMM8 + n); unsigned Reg = *AI;
|
||||
++AI)
|
||||
Reserved.set(Reg);
|
||||
for (MCRegAliasIterator AI(X86::XMM8 + n, this, true); AI.isValid(); ++AI)
|
||||
Reserved.set(*AI);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user