mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 23:51:56 +00:00
Use uint16_t to store register overlaps to reduce static data.
llvm-svn: 152001
This commit is contained in:
parent
dc2cada889
commit
1d32658877
@ -314,7 +314,7 @@ public:
|
||||
bool isPhysRegOrOverlapUsed(unsigned Reg) const {
|
||||
if (UsedPhysRegMask.test(Reg))
|
||||
return true;
|
||||
for (const unsigned *AI = TRI->getOverlaps(Reg); *AI; ++AI)
|
||||
for (const uint16_t *AI = TRI->getOverlaps(Reg); *AI; ++AI)
|
||||
if (UsedPhysRegs.test(*AI))
|
||||
return true;
|
||||
return false;
|
||||
|
@ -133,7 +133,7 @@ private:
|
||||
unsigned RAReg; // Return address register
|
||||
const MCRegisterClass *Classes; // Pointer to the regclass array
|
||||
unsigned NumClasses; // Number of entries in the array
|
||||
const unsigned *Overlaps; // Pointer to the overlaps array
|
||||
const uint16_t *Overlaps; // Pointer to the overlaps array
|
||||
const unsigned *SubRegs; // Pointer to the subregs array
|
||||
const unsigned *SuperRegs; // Pointer to the superregs array
|
||||
const uint16_t *SubRegIndices; // Pointer to the subreg lookup
|
||||
@ -150,7 +150,7 @@ public:
|
||||
/// auto-generated routines. *DO NOT USE*.
|
||||
void InitMCRegisterInfo(const MCRegisterDesc *D, unsigned NR, unsigned RA,
|
||||
const MCRegisterClass *C, unsigned NC,
|
||||
const unsigned *O, const unsigned *Sub,
|
||||
const uint16_t *O, const unsigned *Sub,
|
||||
const unsigned *Super,
|
||||
const uint16_t *SubIndices,
|
||||
unsigned NumIndices) {
|
||||
@ -218,7 +218,7 @@ public:
|
||||
/// register, or a null list of there are none. The list returned is zero
|
||||
/// terminated.
|
||||
///
|
||||
const unsigned *getAliasSet(unsigned RegNo) const {
|
||||
const uint16_t *getAliasSet(unsigned RegNo) const {
|
||||
// The Overlaps set always begins with Reg itself.
|
||||
return Overlaps + get(RegNo).Overlaps + 1;
|
||||
}
|
||||
@ -228,7 +228,7 @@ public:
|
||||
/// list.
|
||||
/// These are exactly the registers in { x | regsOverlap(x, Reg) }.
|
||||
///
|
||||
const unsigned *getOverlaps(unsigned RegNo) const {
|
||||
const uint16_t *getOverlaps(unsigned RegNo) const {
|
||||
return Overlaps + get(RegNo).Overlaps;
|
||||
}
|
||||
|
||||
|
@ -325,7 +325,7 @@ public:
|
||||
if (regA == regB) return true;
|
||||
if (isVirtualRegister(regA) || isVirtualRegister(regB))
|
||||
return false;
|
||||
for (const unsigned *regList = getOverlaps(regA)+1; *regList; ++regList) {
|
||||
for (const uint16_t *regList = getOverlaps(regA)+1; *regList; ++regList) {
|
||||
if (*regList == regB) return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -157,7 +157,7 @@ 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 unsigned *Alias = TRI->getOverlaps(*I);
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(*I);
|
||||
unsigned Reg = *Alias; ++Alias) {
|
||||
State->UnionGroups(Reg, 0);
|
||||
KillIndices[Reg] = BB->size();
|
||||
@ -173,7 +173,7 @@ 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 unsigned *Alias = TRI->getOverlaps(*I);
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(*I);
|
||||
unsigned Reg = *Alias; ++Alias) {
|
||||
State->UnionGroups(Reg, 0);
|
||||
KillIndices[Reg] = BB->size();
|
||||
@ -189,7 +189,7 @@ 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 unsigned *Alias = TRI->getOverlaps(Reg);
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(Reg);
|
||||
unsigned AliasReg = *Alias; ++Alias) {
|
||||
State->UnionGroups(AliasReg, 0);
|
||||
KillIndices[AliasReg] = BB->size();
|
||||
@ -392,7 +392,7 @@ 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 unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
if (State->IsLive(AliasReg)) {
|
||||
State->UnionGroups(Reg, AliasReg);
|
||||
@ -423,7 +423,7 @@ void AggressiveAntiDepBreaker::PrescanInstruction(MachineInstr *MI,
|
||||
continue;
|
||||
|
||||
// Update def for Reg and aliases.
|
||||
for (const unsigned *Alias = TRI->getOverlaps(Reg);
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(Reg);
|
||||
unsigned AliasReg = *Alias; ++Alias)
|
||||
DefIndices[AliasReg] = Count;
|
||||
}
|
||||
@ -678,7 +678,7 @@ bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
|
||||
goto next_super_reg;
|
||||
} else {
|
||||
bool found = false;
|
||||
for (const unsigned *Alias = TRI->getAliasSet(NewReg);
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(NewReg);
|
||||
*Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
if (State->IsLive(AliasReg) ||
|
||||
|
@ -1294,7 +1294,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
|
||||
MOE = MI->operands_end(); MOI != MOE; ++MOI) {
|
||||
if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
|
||||
continue;
|
||||
for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
|
||||
for (const uint16_t *AI = TRI->getOverlaps(MOI->getReg());
|
||||
unsigned Reg = *AI; ++AI) {
|
||||
const MDNode *Var = LiveUserVar[Reg];
|
||||
if (!Var)
|
||||
|
@ -1454,7 +1454,7 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
|
||||
continue;
|
||||
if (MO.isUse()) {
|
||||
Uses.insert(Reg);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
Uses.insert(*AS);
|
||||
} else if (!MO.isDead())
|
||||
// Don't try to hoist code in the rare case the terminator defines a
|
||||
@ -1516,7 +1516,7 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
|
||||
continue;
|
||||
if (MO.isUse()) {
|
||||
Uses.insert(Reg);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
Uses.insert(*AS);
|
||||
} else {
|
||||
if (Uses.count(Reg)) {
|
||||
@ -1525,7 +1525,7 @@ MachineBasicBlock::iterator findHoistingInsertPosAndDeps(MachineBasicBlock *MBB,
|
||||
Uses.erase(*SR); // Use getSubRegisters to be conservative
|
||||
}
|
||||
Defs.insert(Reg);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
Defs.insert(*AS);
|
||||
}
|
||||
}
|
||||
@ -1653,7 +1653,7 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) {
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!Reg || !LocalDefsSet.count(Reg))
|
||||
continue;
|
||||
for (const unsigned *OR = TRI->getOverlaps(Reg); *OR; ++OR)
|
||||
for (const uint16_t *OR = TRI->getOverlaps(Reg); *OR; ++OR)
|
||||
LocalDefsSet.erase(*OR);
|
||||
}
|
||||
|
||||
@ -1666,7 +1666,7 @@ bool BranchFolder::HoistCommonCodeInSuccs(MachineBasicBlock *MBB) {
|
||||
if (!Reg)
|
||||
continue;
|
||||
LocalDefs.push_back(Reg);
|
||||
for (const unsigned *OR = TRI->getOverlaps(Reg); *OR; ++OR)
|
||||
for (const uint16_t *OR = TRI->getOverlaps(Reg); *OR; ++OR)
|
||||
LocalDefsSet.insert(*OR);
|
||||
}
|
||||
|
||||
|
@ -58,7 +58,7 @@ 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 unsigned *Alias = TRI.getOverlaps(Reg);
|
||||
for (const uint16_t *Alias = TRI.getOverlaps(Reg);
|
||||
unsigned Reg = *Alias; ++Alias)
|
||||
UsedRegs[Reg/32] |= 1 << (Reg&31);
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ void CriticalAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
DefIndices[Reg] = ~0u;
|
||||
|
||||
// Repeat, for all aliases.
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
Classes[AliasReg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
KillIndices[AliasReg] = BB->size();
|
||||
@ -89,7 +89,7 @@ void CriticalAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
DefIndices[Reg] = ~0u;
|
||||
|
||||
// Repeat, for all aliases.
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
Classes[AliasReg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
KillIndices[AliasReg] = BB->size();
|
||||
@ -110,7 +110,7 @@ void CriticalAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
|
||||
DefIndices[Reg] = ~0u;
|
||||
|
||||
// Repeat, for all aliases.
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
Classes[AliasReg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
KillIndices[AliasReg] = BB->size();
|
||||
@ -217,7 +217,7 @@ void CriticalAntiDepBreaker::PrescanInstruction(MachineInstr *MI) {
|
||||
Classes[Reg] = reinterpret_cast<TargetRegisterClass *>(-1);
|
||||
|
||||
// Now check for aliases.
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
// 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.
|
||||
@ -326,7 +326,7 @@ void CriticalAntiDepBreaker::ScanInstruction(MachineInstr *MI,
|
||||
"Kill and Def maps aren't consistent for Reg!");
|
||||
}
|
||||
// Repeat, for all aliases.
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias) {
|
||||
unsigned AliasReg = *Alias;
|
||||
if (KillIndices[AliasReg] == ~0u) {
|
||||
KillIndices[AliasReg] = Count;
|
||||
|
@ -188,7 +188,7 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
|
||||
unsigned Reg = MO.getReg();
|
||||
if (TargetRegisterInfo::isPhysicalRegister(Reg)) {
|
||||
LivePhysRegs.set(Reg);
|
||||
for (const unsigned *AliasSet = TRI->getAliasSet(Reg);
|
||||
for (const uint16_t *AliasSet = TRI->getAliasSet(Reg);
|
||||
*AliasSet; ++AliasSet)
|
||||
LivePhysRegs.set(*AliasSet);
|
||||
}
|
||||
|
@ -666,7 +666,7 @@ bool ExeDepsFix::runOnMachineFunction(MachineFunction &mf) {
|
||||
// or -1.
|
||||
AliasMap.resize(TRI->getNumRegs(), -1);
|
||||
for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i)
|
||||
for (const unsigned *AI = TRI->getOverlaps(RC->getRegister(i)); *AI; ++AI)
|
||||
for (const uint16_t *AI = TRI->getOverlaps(RC->getRegister(i)); *AI; ++AI)
|
||||
AliasMap[*AI] = i;
|
||||
}
|
||||
|
||||
|
@ -80,7 +80,7 @@ void InterferenceCache::Entry::reset(unsigned physReg,
|
||||
PhysReg = physReg;
|
||||
Blocks.resize(MF->getNumBlockIDs());
|
||||
Aliases.clear();
|
||||
for (const unsigned *AS = TRI->getOverlaps(PhysReg); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getOverlaps(PhysReg); *AS; ++AS) {
|
||||
LiveIntervalUnion *LIU = LIUArray + *AS;
|
||||
Aliases.push_back(std::make_pair(LIU, LIU->getTag()));
|
||||
}
|
||||
@ -96,7 +96,7 @@ void InterferenceCache::Entry::reset(unsigned physReg,
|
||||
bool InterferenceCache::Entry::valid(LiveIntervalUnion *LIUArray,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
unsigned i = 0, e = Aliases.size();
|
||||
for (const unsigned *AS = TRI->getOverlaps(PhysReg); *AS; ++AS, ++i) {
|
||||
for (const uint16_t *AS = TRI->getOverlaps(PhysReg); *AS; ++AS, ++i) {
|
||||
LiveIntervalUnion *LIU = LIUArray + *AS;
|
||||
if (i == e || Aliases[i].first != LIU)
|
||||
return false;
|
||||
|
@ -219,7 +219,7 @@ bool MachineCSE::hasLivePhysRegDefUses(const MachineInstr *MI,
|
||||
PhysRefs.insert(Reg);
|
||||
if (MO.isDef())
|
||||
PhysDefs.push_back(Reg);
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias)
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias)
|
||||
PhysRefs.insert(*Alias);
|
||||
}
|
||||
|
||||
|
@ -68,7 +68,7 @@ MachineCopyPropagation::SourceNoLongerAvailable(unsigned Reg,
|
||||
AvailCopyMap.erase(*SR);
|
||||
}
|
||||
}
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
SI = SrcMap.find(*AS);
|
||||
if (SI != SrcMap.end()) {
|
||||
unsigned MappedDef = SI->second;
|
||||
@ -180,7 +180,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
CI = CopyMap.find(Src);
|
||||
if (CI != CopyMap.end())
|
||||
MaybeDeadCopies.remove(CI->second);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Src); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Src); *AS; ++AS) {
|
||||
CI = CopyMap.find(*AS);
|
||||
if (CI != CopyMap.end())
|
||||
MaybeDeadCopies.remove(CI->second);
|
||||
@ -200,7 +200,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
|
||||
// Remember Def is defined by the copy.
|
||||
// ... Make sure to clear the def maps of aliases first.
|
||||
for (const unsigned *AS = TRI->getAliasSet(Def); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Def); *AS; ++AS) {
|
||||
CopyMap.erase(*AS);
|
||||
AvailCopyMap.erase(*AS);
|
||||
}
|
||||
@ -245,7 +245,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
DenseMap<unsigned, MachineInstr*>::iterator CI = CopyMap.find(Reg);
|
||||
if (CI != CopyMap.end())
|
||||
MaybeDeadCopies.remove(CI->second);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
CI = CopyMap.find(*AS);
|
||||
if (CI != CopyMap.end())
|
||||
MaybeDeadCopies.remove(CI->second);
|
||||
@ -284,7 +284,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
|
||||
// No longer defined by a copy.
|
||||
CopyMap.erase(Reg);
|
||||
AvailCopyMap.erase(Reg);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
CopyMap.erase(*AS);
|
||||
AvailCopyMap.erase(*AS);
|
||||
}
|
||||
|
@ -1533,7 +1533,7 @@ 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 unsigned *Alias = TM->getRegisterInfo()->getAliasSet(Reg);
|
||||
for (const uint16_t *Alias = TM->getRegisterInfo()->getAliasSet(Reg);
|
||||
unsigned AliasReg = *Alias; ++Alias)
|
||||
if (!MRI.use_empty(AliasReg) || MRI.isLiveOut(AliasReg)) {
|
||||
HasAliasLive = true;
|
||||
|
@ -434,7 +434,7 @@ void MachineLICM::ProcessMI(MachineInstr *MI,
|
||||
}
|
||||
|
||||
if (MO.isImplicit()) {
|
||||
for (const unsigned *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
PhysRegClobbers.set(*AS);
|
||||
if (!MO.isDead())
|
||||
// Non-dead implicit def? This cannot be hoisted.
|
||||
@ -454,7 +454,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 unsigned *AS = TRI->getOverlaps(Reg); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS) {
|
||||
if (PhysRegDefs.test(*AS))
|
||||
PhysRegClobbers.set(*AS);
|
||||
if (PhysRegClobbers.test(*AS))
|
||||
@ -502,7 +502,7 @@ void MachineLICM::HoistRegionPostRA() {
|
||||
for (MachineBasicBlock::livein_iterator I = BB->livein_begin(),
|
||||
E = BB->livein_end(); I != E; ++I) {
|
||||
unsigned Reg = *I;
|
||||
for (const unsigned *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg); *AS; ++AS)
|
||||
PhysRegDefs.set(*AS);
|
||||
}
|
||||
|
||||
|
@ -269,14 +269,14 @@ bool MachineRegisterInfo::isConstantPhysReg(unsigned PhysReg,
|
||||
assert(TargetRegisterInfo::isPhysicalRegister(PhysReg));
|
||||
|
||||
// Check if any overlapping register is modified.
|
||||
for (const unsigned *R = TRI->getOverlaps(PhysReg); *R; ++R)
|
||||
for (const uint16_t *R = TRI->getOverlaps(PhysReg); *R; ++R)
|
||||
if (!def_empty(*R))
|
||||
return false;
|
||||
|
||||
// Check if any overlapping register is allocatable so it may be used later.
|
||||
if (AllocatableRegs.empty())
|
||||
AllocatableRegs = TRI->getAllocatableSet(MF);
|
||||
for (const unsigned *R = TRI->getOverlaps(PhysReg); *R; ++R)
|
||||
for (const uint16_t *R = TRI->getOverlaps(PhysReg); *R; ++R)
|
||||
if (AllocatableRegs.test(*R))
|
||||
return false;
|
||||
return true;
|
||||
|
@ -236,7 +236,7 @@ void RegAllocBase::allocatePhysRegs() {
|
||||
// physical register. Return the interfering register.
|
||||
unsigned RegAllocBase::checkPhysRegInterference(LiveInterval &VirtReg,
|
||||
unsigned PhysReg) {
|
||||
for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI)
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI)
|
||||
if (query(VirtReg, *AliasI).checkInterference())
|
||||
return *AliasI;
|
||||
return 0;
|
||||
|
@ -204,7 +204,7 @@ 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 unsigned *asI = TRI->getOverlaps(PhysReg); *asI; ++asI) {
|
||||
for (const uint16_t *asI = TRI->getOverlaps(PhysReg); *asI; ++asI) {
|
||||
LiveIntervalUnion::Query &QAlias = query(VirtReg, *asI);
|
||||
NumInterferences += QAlias.collectInterferingVRegs();
|
||||
if (QAlias.seenUnspillableVReg()) {
|
||||
@ -216,7 +216,7 @@ bool RABasic::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
assert(NumInterferences > 0 && "expect interference");
|
||||
|
||||
// Spill each interfering vreg allocated to PhysReg or an alias.
|
||||
for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI)
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI)
|
||||
spillReg(VirtReg, *AliasI, SplitVRegs);
|
||||
return true;
|
||||
}
|
||||
|
@ -354,7 +354,7 @@ void RAFast::usePhysReg(MachineOperand &MO) {
|
||||
}
|
||||
|
||||
// Maybe a superregister is reserved?
|
||||
for (const unsigned *AS = TRI->getAliasSet(PhysReg);
|
||||
for (const uint16_t *AS = TRI->getAliasSet(PhysReg);
|
||||
unsigned Alias = *AS; ++AS) {
|
||||
switch (PhysRegState[Alias]) {
|
||||
case regDisabled:
|
||||
@ -408,7 +408,7 @@ void RAFast::definePhysReg(MachineInstr *MI, unsigned PhysReg,
|
||||
|
||||
// This is a disabled register, disable all aliases.
|
||||
PhysRegState[PhysReg] = NewState;
|
||||
for (const unsigned *AS = TRI->getAliasSet(PhysReg);
|
||||
for (const uint16_t *AS = TRI->getAliasSet(PhysReg);
|
||||
unsigned Alias = *AS; ++AS) {
|
||||
switch (unsigned VirtReg = PhysRegState[Alias]) {
|
||||
case regDisabled:
|
||||
@ -456,7 +456,7 @@ 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 unsigned *AS = TRI->getAliasSet(PhysReg);
|
||||
for (const uint16_t *AS = TRI->getAliasSet(PhysReg);
|
||||
unsigned Alias = *AS; ++AS) {
|
||||
if (UsedInInstr.test(Alias))
|
||||
return spillImpossible;
|
||||
@ -707,7 +707,7 @@ void RAFast::handleThroughOperands(MachineInstr *MI,
|
||||
UsedInInstr.set(Reg);
|
||||
if (ThroughRegs.count(PhysRegState[Reg]))
|
||||
definePhysReg(MI, Reg, regFree);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
|
||||
UsedInInstr.set(*AS);
|
||||
if (ThroughRegs.count(PhysRegState[*AS]))
|
||||
definePhysReg(MI, *AS, regFree);
|
||||
@ -1030,7 +1030,7 @@ void RAFast::AllocateBasicBlock() {
|
||||
// Look for physreg defs and tied uses.
|
||||
if (!MO.isDef() && !MI->isRegTiedToDefOperand(i)) continue;
|
||||
UsedInInstr.set(Reg);
|
||||
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getAliasSet(Reg); *AS; ++AS)
|
||||
UsedInInstr.set(*AS);
|
||||
}
|
||||
}
|
||||
|
@ -539,7 +539,7 @@ bool RAGreedy::canEvictInterference(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
Cascade = NextCascade;
|
||||
|
||||
EvictionCost Cost;
|
||||
for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
|
||||
LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
|
||||
// If there is 10 or more interferences, chances are one is heavier.
|
||||
if (Q.collectInterferingVRegs(10) >= 10)
|
||||
@ -597,7 +597,7 @@ void RAGreedy::evictInterference(LiveInterval &VirtReg, unsigned PhysReg,
|
||||
|
||||
DEBUG(dbgs() << "evicting " << PrintReg(PhysReg, TRI)
|
||||
<< " interference: Cascade " << Cascade << '\n');
|
||||
for (const unsigned *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(PhysReg); *AliasI; ++AliasI) {
|
||||
LiveIntervalUnion::Query &Q = query(VirtReg, *AliasI);
|
||||
assert(Q.seenAllInterferences() && "Didn't check all interfererences.");
|
||||
for (unsigned i = 0, e = Q.interferingVRegs().size(); i != e; ++i) {
|
||||
@ -1291,7 +1291,7 @@ void RAGreedy::calcGapWeights(unsigned PhysReg,
|
||||
GapWeight.assign(NumGaps, 0.0f);
|
||||
|
||||
// Add interference from each overlapping register.
|
||||
for (const unsigned *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) {
|
||||
for (const uint16_t *AI = TRI->getOverlaps(PhysReg); *AI; ++AI) {
|
||||
if (!query(const_cast<LiveInterval&>(SA->getParent()), *AI)
|
||||
.checkInterference())
|
||||
continue;
|
||||
|
@ -248,7 +248,7 @@ std::auto_ptr<PBQPRAProblem> PBQPBuilder::build(MachineFunction *mf,
|
||||
}
|
||||
|
||||
// Also remove any aliases.
|
||||
const unsigned *aliasItr = tri->getAliasSet(preg);
|
||||
const uint16_t *aliasItr = tri->getAliasSet(preg);
|
||||
if (aliasItr != 0) {
|
||||
for (; *aliasItr != 0; ++aliasItr) {
|
||||
VRAllowed::iterator eraseItr =
|
||||
|
@ -50,7 +50,7 @@ void RegisterClassInfo::runOnMachineFunction(const MachineFunction &mf) {
|
||||
CSRNum.clear();
|
||||
CSRNum.resize(TRI->getNumRegs(), 0);
|
||||
for (unsigned N = 0; unsigned Reg = CSR[N]; ++N)
|
||||
for (const unsigned *AS = TRI->getOverlaps(Reg);
|
||||
for (const uint16_t *AS = TRI->getOverlaps(Reg);
|
||||
unsigned Alias = *AS; ++AS)
|
||||
CSRNum[Alias] = N + 1; // 0 means no CSR, 1 means CalleeSaved[0], ...
|
||||
Update = true;
|
||||
|
@ -461,7 +461,7 @@ bool RegisterCoalescer::AdjustCopiesBackFrom(const CoalescerPair &CP,
|
||||
// of its aliases is overlapping the live interval of the virtual register.
|
||||
// If so, do not coalesce.
|
||||
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
|
||||
for (const unsigned *AS = TRI->getAliasSet(IntB.reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getAliasSet(IntB.reg); *AS; ++AS)
|
||||
if (LIS->hasInterval(*AS) && IntA.overlaps(LIS->getInterval(*AS))) {
|
||||
DEBUG({
|
||||
dbgs() << "\t\tInterfere with alias ";
|
||||
@ -653,7 +653,7 @@ bool RegisterCoalescer::RemoveCopyByCommutingDef(const CoalescerPair &CP,
|
||||
// Abort if the aliases of IntB.reg have values that are not simply the
|
||||
// clobbers from the superreg.
|
||||
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg))
|
||||
for (const unsigned *AS = TRI->getAliasSet(IntB.reg); *AS; ++AS)
|
||||
for (const uint16_t *AS = TRI->getAliasSet(IntB.reg); *AS; ++AS)
|
||||
if (LIS->hasInterval(*AS) &&
|
||||
HasOtherReachingDefs(IntA, LIS->getInterval(*AS), AValNo, 0))
|
||||
return false;
|
||||
@ -1412,7 +1412,7 @@ bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
|
||||
"Invalid join with reserved register");
|
||||
// Deny any overlapping intervals. This depends on all the reserved
|
||||
// register live ranges to look like dead defs.
|
||||
for (const unsigned *AS = TRI->getOverlaps(CP.getDstReg()); *AS; ++AS) {
|
||||
for (const uint16_t *AS = TRI->getOverlaps(CP.getDstReg()); *AS; ++AS) {
|
||||
if (!LIS->hasInterval(*AS)) {
|
||||
// Make sure at least DstReg itself exists before attempting a join.
|
||||
if (*AS == CP.getDstReg())
|
||||
@ -1439,7 +1439,7 @@ bool RegisterCoalescer::JoinIntervals(CoalescerPair &CP) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const unsigned *AS = TRI->getAliasSet(CP.getDstReg()); *AS; ++AS){
|
||||
for (const uint16_t *AS = TRI->getAliasSet(CP.getDstReg()); *AS; ++AS){
|
||||
if (!LIS->hasInterval(*AS))
|
||||
continue;
|
||||
const LiveInterval &LHS = LIS->getInterval(*AS);
|
||||
|
@ -45,7 +45,7 @@ void RegScavenger::setUsed(unsigned Reg) {
|
||||
bool RegScavenger::isAliasUsed(unsigned Reg) const {
|
||||
if (isUsed(Reg))
|
||||
return true;
|
||||
for (const unsigned *R = TRI->getAliasSet(Reg); *R; ++R)
|
||||
for (const uint16_t *R = TRI->getAliasSet(Reg); *R; ++R)
|
||||
if (isUsed(*R))
|
||||
return true;
|
||||
return false;
|
||||
@ -292,7 +292,7 @@ unsigned RegScavenger::findSurvivorReg(MachineBasicBlock::iterator StartMI,
|
||||
continue;
|
||||
}
|
||||
Candidates.reset(MO.getReg());
|
||||
for (const unsigned *R = TRI->getAliasSet(MO.getReg()); *R; R++)
|
||||
for (const uint16_t *R = TRI->getAliasSet(MO.getReg()); *R; R++)
|
||||
Candidates.reset(*R);
|
||||
}
|
||||
// If we're not in a virtual reg's live range, this is a valid
|
||||
|
@ -215,7 +215,7 @@ void ScheduleDAGInstrs::addPhysRegDataDeps(SUnit *SU,
|
||||
unsigned SpecialAddressLatency = ST.getSpecialAddressLatency();
|
||||
unsigned DataLatency = SU->Latency;
|
||||
|
||||
for (const unsigned *Alias = TRI->getOverlaps(MO.getReg()); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(MO.getReg()); *Alias; ++Alias) {
|
||||
if (!Uses.contains(*Alias))
|
||||
continue;
|
||||
std::vector<SUnit*> &UseList = Uses[*Alias];
|
||||
@ -268,7 +268,7 @@ 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 unsigned *Alias = TRI->getOverlaps(MO.getReg()); *Alias; ++Alias) {
|
||||
for (const uint16_t *Alias = TRI->getOverlaps(MO.getReg()); *Alias; ++Alias) {
|
||||
if (!Defs.contains(*Alias))
|
||||
continue;
|
||||
std::vector<SUnit *> &DefList = Defs[*Alias];
|
||||
|
@ -447,7 +447,7 @@ static bool CheckForLiveRegDef(SUnit *SU, unsigned Reg,
|
||||
Added = true;
|
||||
}
|
||||
}
|
||||
for (const unsigned *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias)
|
||||
for (const uint16_t *Alias = TRI->getAliasSet(Reg); *Alias; ++Alias)
|
||||
if (LiveRegDefs[*Alias] && LiveRegDefs[*Alias] != SU) {
|
||||
if (RegAdded.insert(*Alias)) {
|
||||
LRegs.push_back(*Alias);
|
||||
|
@ -1175,7 +1175,7 @@ static void CheckForLiveRegDef(SUnit *SU, unsigned Reg,
|
||||
SmallSet<unsigned, 4> &RegAdded,
|
||||
SmallVector<unsigned, 4> &LRegs,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
for (const unsigned *AliasI = TRI->getOverlaps(Reg); *AliasI; ++AliasI) {
|
||||
for (const uint16_t *AliasI = TRI->getOverlaps(Reg); *AliasI; ++AliasI) {
|
||||
|
||||
// Check if Ref is live.
|
||||
if (!LiveRegDefs[*AliasI]) continue;
|
||||
|
@ -58,7 +58,7 @@ void Hexagon_CCState::HandleByVal(unsigned ValNo, EVT ValVT,
|
||||
void Hexagon_CCState::MarkAllocated(unsigned Reg) {
|
||||
UsedRegs[Reg/32] |= 1 << (Reg&31);
|
||||
|
||||
if (const unsigned *RegAliases = TRI.getAliasSet(Reg))
|
||||
if (const uint16_t *RegAliases = TRI.getAliasSet(Reg))
|
||||
for (; (Reg = *RegAliases); ++RegAliases)
|
||||
UsedRegs[Reg/32] |= 1 << (Reg&31);
|
||||
}
|
||||
|
@ -244,7 +244,7 @@ bool Filler::IsRegInSet(SmallSet<unsigned, 32>& RegSet, unsigned Reg) {
|
||||
if (RegSet.count(Reg))
|
||||
return true;
|
||||
// check Aliased Registers
|
||||
for (const unsigned *Alias = TM.getRegisterInfo()->getAliasSet(Reg);
|
||||
for (const uint16_t *Alias = TM.getRegisterInfo()->getAliasSet(Reg);
|
||||
*Alias; ++Alias)
|
||||
if (RegSet.count(*Alias))
|
||||
return true;
|
||||
|
@ -282,7 +282,7 @@ bool Filler::IsRegInSet(SmallSet<unsigned, 32>& RegSet, unsigned Reg)
|
||||
if (RegSet.count(Reg))
|
||||
return true;
|
||||
// check Aliased Registers
|
||||
for (const unsigned *Alias = TM.getRegisterInfo()->getAliasSet(Reg);
|
||||
for (const uint16_t *Alias = TM.getRegisterInfo()->getAliasSet(Reg);
|
||||
*Alias; ++ Alias)
|
||||
if (RegSet.count(*Alias))
|
||||
return true;
|
||||
|
@ -95,11 +95,11 @@ static unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB,
|
||||
if (!F || MF->getMMI().callsEHReturn())
|
||||
return 0;
|
||||
|
||||
static const unsigned CallerSavedRegs32Bit[] = {
|
||||
static const uint16_t CallerSavedRegs32Bit[] = {
|
||||
X86::EAX, X86::EDX, X86::ECX, 0
|
||||
};
|
||||
|
||||
static const unsigned CallerSavedRegs64Bit[] = {
|
||||
static const uint16_t CallerSavedRegs64Bit[] = {
|
||||
X86::RAX, X86::RDX, X86::RCX, X86::RSI, X86::RDI,
|
||||
X86::R8, X86::R9, X86::R10, X86::R11, 0
|
||||
};
|
||||
@ -117,7 +117,7 @@ static unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB,
|
||||
case X86::TCRETURNmi64:
|
||||
case X86::EH_RETURN:
|
||||
case X86::EH_RETURN64: {
|
||||
SmallSet<unsigned, 8> Uses;
|
||||
SmallSet<uint16_t, 8> Uses;
|
||||
for (unsigned i = 0, e = MBBI->getNumOperands(); i != e; ++i) {
|
||||
MachineOperand &MO = MBBI->getOperand(i);
|
||||
if (!MO.isReg() || MO.isDef())
|
||||
@ -125,11 +125,11 @@ static unsigned findDeadCallerSavedReg(MachineBasicBlock &MBB,
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!Reg)
|
||||
continue;
|
||||
for (const unsigned *AsI = TRI.getOverlaps(Reg); *AsI; ++AsI)
|
||||
for (const uint16_t *AsI = TRI.getOverlaps(Reg); *AsI; ++AsI)
|
||||
Uses.insert(*AsI);
|
||||
}
|
||||
|
||||
const unsigned *CS = Is64Bit ? CallerSavedRegs64Bit : CallerSavedRegs32Bit;
|
||||
const uint16_t *CS = Is64Bit ? CallerSavedRegs64Bit : CallerSavedRegs32Bit;
|
||||
for (; *CS; ++CS)
|
||||
if (!Uses.count(*CS))
|
||||
return *CS;
|
||||
|
@ -304,16 +304,16 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
|
||||
|
||||
for (unsigned n = 0; n != 8; ++n) {
|
||||
// R8, R9, ...
|
||||
const unsigned GPR64[] = {
|
||||
static const uint16_t GPR64[] = {
|
||||
X86::R8, X86::R9, X86::R10, X86::R11,
|
||||
X86::R12, X86::R13, X86::R14, X86::R15
|
||||
};
|
||||
for (const unsigned *AI = getOverlaps(GPR64[n]); unsigned Reg = *AI; ++AI)
|
||||
for (const uint16_t *AI = getOverlaps(GPR64[n]); unsigned Reg = *AI; ++AI)
|
||||
Reserved.set(Reg);
|
||||
|
||||
// XMM8, XMM9, ...
|
||||
assert(X86::XMM15 == X86::XMM8+7);
|
||||
for (const unsigned *AI = getOverlaps(X86::XMM8 + n); unsigned Reg = *AI;
|
||||
for (const uint16_t *AI = getOverlaps(X86::XMM8 + n); unsigned Reg = *AI;
|
||||
++AI)
|
||||
Reserved.set(Reg);
|
||||
}
|
||||
|
@ -271,7 +271,7 @@ RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
|
||||
const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters();
|
||||
|
||||
OS << "extern const unsigned " << TargetName << "RegOverlaps[] = {\n";
|
||||
OS << "extern const uint16_t " << TargetName << "RegOverlaps[] = {\n";
|
||||
|
||||
// Emit an overlap list for all registers.
|
||||
for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
|
||||
@ -874,7 +874,7 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||
|
||||
// Emit the constructor of the class...
|
||||
OS << "extern const MCRegisterDesc " << TargetName << "RegDesc[];\n";
|
||||
OS << "extern const unsigned " << TargetName << "RegOverlaps[];\n";
|
||||
OS << "extern const uint16_t " << TargetName << "RegOverlaps[];\n";
|
||||
OS << "extern const unsigned " << TargetName << "SubRegsSet[];\n";
|
||||
OS << "extern const unsigned " << TargetName << "SuperRegsSet[];\n";
|
||||
if (SubRegIndices.size() != 0)
|
||||
|
Loading…
Reference in New Issue
Block a user