diff options
| author | Andrew Trick <atrick@apple.com> | 2012-04-11 17:35:26 +0000 |
|---|---|---|
| committer | Andrew Trick <atrick@apple.com> | 2012-04-11 17:35:26 +0000 |
| commit | a5eee987e02c9ab1755c64287646d9f4f8f42273 (patch) | |
| tree | 2bf34127c960722911d69c2d3c9ae1d4ab6ca635 /llvm/utils/TableGen/CodeGenRegisters.cpp | |
| parent | cd42f9446bc94557ebf128e21d7a06ea69b9d7b7 (diff) | |
| download | bcm5719-llvm-a5eee987e02c9ab1755c64287646d9f4f8f42273.tar.gz bcm5719-llvm-a5eee987e02c9ab1755c64287646d9f4f8f42273.zip | |
TableGen'd regpressure: register unit set pruning.
The pruning is more complete if it is not done incrementally. The code
is also a tad less convluted.
llvm-svn: 154510
Diffstat (limited to 'llvm/utils/TableGen/CodeGenRegisters.cpp')
| -rw-r--r-- | llvm/utils/TableGen/CodeGenRegisters.cpp | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp index b59a45e2a65..33d0f806ac8 100644 --- a/llvm/utils/TableGen/CodeGenRegisters.cpp +++ b/llvm/utils/TableGen/CodeGenRegisters.cpp @@ -1167,8 +1167,7 @@ void CodeGenRegBank::pruneUnitSets() { assert(RegClassUnitSets.empty() && "this invalidates RegClassUnitSets"); // Form an equivalence class of UnitSets with no significant difference. - // Populate PrunedUnitSets with each equivalence class's superset. - std::vector<RegUnitSet> PrunedUnitSets; + std::vector<unsigned> SuperSetIDs; for (unsigned SubIdx = 0, EndIdx = RegUnitSets.size(); SubIdx != EndIdx; ++SubIdx) { const RegUnitSet &SubSet = RegUnitSets[SubIdx]; @@ -1176,25 +1175,22 @@ void CodeGenRegBank::pruneUnitSets() { for (; SuperIdx != EndIdx; ++SuperIdx) { if (SuperIdx == SubIdx) continue; - const RegUnitSet *SuperSet = 0; - if (SuperIdx > SubIdx) - SuperSet = &RegUnitSets[SuperIdx]; - else { - // Compare with already-pruned sets. - if (SuperIdx >= PrunedUnitSets.size()) - continue; - SuperSet = &PrunedUnitSets[SuperIdx]; - } - if (isRegUnitSubSet(SubSet.Units, SuperSet->Units) - && (SubSet.Units.size() + 3 > SuperSet->Units.size())) { + + const RegUnitSet &SuperSet = RegUnitSets[SuperIdx]; + if (isRegUnitSubSet(SubSet.Units, SuperSet.Units) + && (SubSet.Units.size() + 3 > SuperSet.Units.size())) { break; } } - if (SuperIdx != EndIdx) - continue; - PrunedUnitSets.resize(PrunedUnitSets.size()+1); - PrunedUnitSets.back().Name = RegUnitSets[SubIdx].Name; - PrunedUnitSets.back().Units.swap(RegUnitSets[SubIdx].Units); + if (SuperIdx == EndIdx) + SuperSetIDs.push_back(SubIdx); + } + // Populate PrunedUnitSets with each equivalence class's superset. + std::vector<RegUnitSet> PrunedUnitSets(SuperSetIDs.size()); + for (unsigned i = 0, e = SuperSetIDs.size(); i != e; ++i) { + unsigned SuperIdx = SuperSetIDs[i]; + PrunedUnitSets[i].Name = RegUnitSets[SuperIdx].Name; + PrunedUnitSets[i].Units.swap(RegUnitSets[SuperIdx].Units); } RegUnitSets.swap(PrunedUnitSets); } |

