TableGen'd regpressure: register unit set pruning.
authorAndrew Trick <atrick@apple.com>
Wed, 11 Apr 2012 17:35:26 +0000 (17:35 +0000)
committerAndrew Trick <atrick@apple.com>
Wed, 11 Apr 2012 17:35:26 +0000 (17:35 +0000)
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

utils/TableGen/CodeGenRegisters.cpp

index b59a45e2a6503900c8f9a2ce9dc9eaf65eb2493c..33d0f806ac85e67b375566265dfff25ac7aac829 100644 (file)
@@ -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);
 }