Use precomputed BitVector for CodeGenRegisterClass::hasSubClass().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 30 Sep 2011 23:47:05 +0000 (23:47 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 30 Sep 2011 23:47:05 +0000 (23:47 +0000)
All the sub-class bit vectors are computed when first creating the
register bank.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140905 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/CodeGenRegisters.cpp
utils/TableGen/CodeGenRegisters.h

index 35f247a2e38ded21dee0218e493700c917253036..6e98d0ca9110e1c138583a4e8202cbb353bf62e9 100644 (file)
@@ -342,11 +342,12 @@ bool CodeGenRegisterClass::contains(const CodeGenRegister *Reg) const {
 // 2. The RC spill size must not be smaller than our spill size.
 // 3. RC spill alignment must be compatible with ours.
 //
-bool CodeGenRegisterClass::hasSubClass(const CodeGenRegisterClass *RC) const {
-  return SpillAlignment && RC->SpillAlignment % SpillAlignment == 0 &&
-    SpillSize <= RC->SpillSize &&
-    std::includes(Members.begin(), Members.end(),
-                  RC->Members.begin(), RC->Members.end(),
+static bool testSubClass(const CodeGenRegisterClass *A,
+                         const CodeGenRegisterClass *B) {
+  return A->SpillAlignment && B->SpillAlignment % A->SpillAlignment == 0 &&
+    A->SpillSize <= B->SpillSize &&
+    std::includes(A->getMembers().begin(), A->getMembers().end(),
+                  B->getMembers().begin(), B->getMembers().end(),
                   CodeGenRegister::Less());
 }
 
@@ -403,7 +404,7 @@ computeSubClasses(ArrayRef<CodeGenRegisterClass*> RegClasses) {
       if (RC.SubClasses.test(s))
         continue;
       CodeGenRegisterClass *SubRC = RegClasses[s];
-      if (!RC.hasSubClass(SubRC))
+      if (!testSubClass(&RC, SubRC))
         continue;
       // SubRC is a sub-class. Grap all its sub-classes so we won't have to
       // check them again.
@@ -411,7 +412,7 @@ computeSubClasses(ArrayRef<CodeGenRegisterClass*> RegClasses) {
     }
 
     // Sweep up missed clique members.  They will be immediately preceeding RC.
-    for (unsigned s = rci - 1; s && RC.hasSubClass(RegClasses[s - 1]); --s)
+    for (unsigned s = rci - 1; s && testSubClass(&RC, RegClasses[s - 1]); --s)
       RC.SubClasses.set(s - 1);
   }
 
index 74cf4127a32d92f934fb5158d098ab2a52f72e9a..c3af5593c16aea78887f05efac4a3c66caf90160 100644 (file)
@@ -129,7 +129,9 @@ namespace llvm {
     // 2. The RC spill size must not be smaller than our spill size.
     // 3. RC spill alignment must be compatible with ours.
     //
-    bool hasSubClass(const CodeGenRegisterClass *RC) const;
+    bool hasSubClass(const CodeGenRegisterClass *RC) const {
+      return SubClasses.test(RC->EnumValue);
+    }
 
     // getSubClasses - Returns a constant BitVector of subclasses indexed by
     // EnumValue.
@@ -155,6 +157,10 @@ namespace llvm {
     // Return the total number of allocation orders available.
     unsigned getNumOrders() const { return 1 + AltOrders.size(); }
 
+    // Get the set of registers.  This set contains the same registers as
+    // getOrder(0).
+    const CodeGenRegister::Set &getMembers() const { return Members; }
+
     CodeGenRegisterClass(CodeGenRegBank&, Record *R);
 
     // Called by CodeGenRegBank::CodeGenRegBank().