1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

Fix for register pressure tables.

Recent refactoring introduced a bug. Fix: added buildRegUnitSets.

llvm-svn: 154382
This commit is contained in:
Andrew Trick 2012-04-10 03:36:49 +00:00
parent d9ff163215
commit 360c19ad86

View File

@ -1118,6 +1118,17 @@ void CodeGenRegBank::computeRegUnitWeights() {
} }
} }
// Populate a unique sorted list of units from a register set.
static void buildRegUnitSet(const CodeGenRegister::Set &Regs,
std::vector<unsigned> &RegUnits) {
std::vector<unsigned> TmpUnits;
for (RegUnitIterator UnitI(Regs); UnitI.isValid(); ++UnitI)
TmpUnits.push_back(*UnitI);
std::sort(TmpUnits.begin(), TmpUnits.end());
std::unique_copy(TmpUnits.begin(), TmpUnits.end(),
std::back_inserter(RegUnits));
}
// Find a set in UniqueSets with the same elements as Set. // Find a set in UniqueSets with the same elements as Set.
// Return an iterator into UniqueSets. // Return an iterator into UniqueSets.
static std::vector<RegUnitSet>::const_iterator static std::vector<RegUnitSet>::const_iterator
@ -1185,18 +1196,12 @@ void CodeGenRegBank::computeRegUnitSets() {
unsigned NumRegClasses = RegClasses.size(); unsigned NumRegClasses = RegClasses.size();
for (unsigned RCIdx = 0, RCEnd = NumRegClasses; RCIdx != RCEnd; ++RCIdx) { for (unsigned RCIdx = 0, RCEnd = NumRegClasses; RCIdx != RCEnd; ++RCIdx) {
// Compute a sorted list of units in this class.
std::vector<unsigned> RegUnits;
const CodeGenRegister::Set &Regs = RegClasses[RCIdx]->getMembers();
for (RegUnitIterator UnitI(Regs); UnitI.isValid(); ++UnitI)
RegUnits.push_back(*UnitI);
std::sort(RegUnits.begin(), RegUnits.end());
// Speculatively grow the RegUnitSets to hold the new set. // Speculatively grow the RegUnitSets to hold the new set.
RegUnitSets.resize(RegUnitSets.size() + 1); RegUnitSets.resize(RegUnitSets.size() + 1);
RegUnitSets.back().Name = RegClasses[RCIdx]->getName(); RegUnitSets.back().Name = RegClasses[RCIdx]->getName();
std::unique_copy(RegUnits.begin(), RegUnits.end(),
std::back_inserter(RegUnitSets.back().Units)); // Compute a sorted list of units in this class.
buildRegUnitSet(RegClasses[RCIdx]->getMembers(), RegUnitSets.back().Units);
// Find an existing RegUnitSet. // Find an existing RegUnitSet.
std::vector<RegUnitSet>::const_iterator SetI = std::vector<RegUnitSet>::const_iterator SetI =
@ -1256,10 +1261,7 @@ void CodeGenRegBank::computeRegUnitSets() {
for (unsigned RCIdx = 0, RCEnd = NumRegClasses; RCIdx != RCEnd; ++RCIdx) { for (unsigned RCIdx = 0, RCEnd = NumRegClasses; RCIdx != RCEnd; ++RCIdx) {
// Recompute the sorted list of units in this class. // Recompute the sorted list of units in this class.
std::vector<unsigned> RegUnits; std::vector<unsigned> RegUnits;
const CodeGenRegister::Set &Regs = RegClasses[RCIdx]->getMembers(); buildRegUnitSet(RegClasses[RCIdx]->getMembers(), RegUnits);
for (RegUnitIterator UnitI(Regs); UnitI.isValid(); ++UnitI)
RegUnits.push_back(*UnitI);
std::sort(RegUnits.begin(), RegUnits.end());
// Don't increase pressure for unallocatable regclasses. // Don't increase pressure for unallocatable regclasses.
if (RegUnits.empty()) if (RegUnits.empty())