Restore minor deletion.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70892 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mike Stump
2009-05-04 18:40:41 +00:00
parent 04fa35ab13
commit fe095f39e7
24 changed files with 369 additions and 223 deletions

View File

@ -232,61 +232,54 @@ StackSlotColoring::ColorSlotsWithFreeRegs(SmallVector<int, 16> &SlotMapping,
int SS = li->getStackSlotIndex();
if (!UsedColors[SS])
continue;
// Get the largest common sub- register class of all the stack slots that
// are colored to this stack slot.
const TargetRegisterClass *RC = 0;
for (unsigned j = 0, ee = RevMap[SS].size(); j != ee; ++j) {
int RSS = RevMap[SS][j];
const TargetRegisterClass *RRC = LS->getIntervalRegClass(RSS);
if (!RC)
RC = RRC;
else
RC = getCommonSubClass(RC, RRC);
}
// If it's not colored to another stack slot, try coloring it
// to a "free" register.
if (!RC)
continue;
unsigned Reg = VRM->getFirstUnusedRegister(RC);
if (!Reg)
continue;
bool IsSafe = true;
// These slots allow to share the same registers.
bool AllColored = true;
SmallVector<unsigned, 4> ColoredRegs;
for (unsigned j = 0, ee = RevMap[SS].size(); j != ee; ++j) {
int RSS = RevMap[SS][j];
const TargetRegisterClass *RC = LS->getIntervalRegClass(RSS);
// If it's not colored to another stack slot, try coloring it
// to a "free" register.
if (!RC) {
AllColored = false;
continue;
}
unsigned Reg = VRM->getFirstUnusedRegister(RC);
if (!Reg) {
AllColored = false;
continue;
}
if (!AllMemRefsCanBeUnfolded(RSS)) {
IsSafe = false;
break;
AllColored = false;
continue;
} else {
DOUT << "Assigning fi#" << RSS << " to " << TRI->getName(Reg) << '\n';
ColoredRegs.push_back(Reg);
SlotMapping[RSS] = Reg;
SlotIsReg.set(RSS);
Changed = true;
}
}
if (!IsSafe)
// Try color the next spill slot.
continue;
DOUT << "Assigning fi#" << SS << " to " << TRI->getName(Reg)
<< ", which in turn means...\n";
// Register and its sub-registers are no longer free.
VRM->setRegisterUsed(Reg);
// If reg is a callee-saved register, it will have to be spilled in
// the prologue.
MRI->setPhysRegUsed(Reg);
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
VRM->setRegisterUsed(*AS);
MRI->setPhysRegUsed(*AS);
while (!ColoredRegs.empty()) {
unsigned Reg = ColoredRegs.back();
ColoredRegs.pop_back();
VRM->setRegisterUsed(Reg);
// If reg is a callee-saved register, it will have to be spilled in
// the prologue.
MRI->setPhysRegUsed(Reg);
for (const unsigned *AS = TRI->getAliasSet(Reg); *AS; ++AS) {
VRM->setRegisterUsed(*AS);
MRI->setPhysRegUsed(*AS);
}
}
// This spill slot is dead after the rewrites
MFI->RemoveStackObject(SS);
// Remember all these FI references will have to be unfolded.
for (unsigned j = 0, ee = RevMap[SS].size(); j != ee; ++j) {
int RSS = RevMap[SS][j];
DOUT << " Assigning fi#" << RSS << " to " << TRI->getName(Reg) << '\n';
SlotMapping[RSS] = Reg;
SlotIsReg.set(RSS);
if (AllColored) {
MFI->RemoveStackObject(SS);
++NumEliminated;
}
++NumEliminated;
Changed = true;
}
DOUT << '\n';