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 | 5c1761d486deb47648fa1b854692f4b64a35f0e2 (patch) | |
tree | 92b1a7e5080146954e5d9532a6f19b26e63b1daa /utils | |
parent | 6073b30b053da2c2ac6150dd67cecb304bc614f1 (diff) | |
download | llvm-5c1761d486deb47648fa1b854692f4b64a35f0e2.tar.gz llvm-5c1761d486deb47648fa1b854692f4b64a35f0e2.tar.bz2 llvm-5c1761d486deb47648fa1b854692f4b64a35f0e2.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154510 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/CodeGenRegisters.cpp | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/utils/TableGen/CodeGenRegisters.cpp b/utils/TableGen/CodeGenRegisters.cpp index b59a45e2a6..33d0f806ac 100644 --- a/utils/TableGen/CodeGenRegisters.cpp +++ b/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); } |