summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-04-11 17:35:26 +0000
committerAndrew Trick <atrick@apple.com>2012-04-11 17:35:26 +0000
commit5c1761d486deb47648fa1b854692f4b64a35f0e2 (patch)
tree92b1a7e5080146954e5d9532a6f19b26e63b1daa /utils
parent6073b30b053da2c2ac6150dd67cecb304bc614f1 (diff)
downloadllvm-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.cpp32
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);
}