Use MCRegUnitIterator to compute regsOverlap().
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 29 May 2012 23:40:02 +0000 (23:40 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 29 May 2012 23:40:02 +0000 (23:40 +0000)
The register unit lists are typically much shorter than the register
overlap lists, and the backing table for register units has better cache
locality because it is smaller.

This makes llc about 0.5% faster. The regsOverlap() function isn't that hot.

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

include/llvm/Target/TargetRegisterInfo.h

index 7e73db3a448df24dcbb2ad08398d29a051ae84f4..949fce846120ff151d2b358b961849383d698db4 100644 (file)
@@ -337,9 +337,15 @@ public:
     if (regA == regB) return true;
     if (isVirtualRegister(regA) || isVirtualRegister(regB))
       return false;
-    for (const uint16_t *regList = getOverlaps(regA)+1; *regList; ++regList) {
-      if (*regList == regB) return true;
-    }
+
+    // Regunits are numerically ordered. Find a common unit.
+    MCRegUnitIterator RUA(regA, this);
+    MCRegUnitIterator RUB(regB, this);
+    do {
+      if (*RUA == *RUB) return true;
+      if (*RUA < *RUB) ++RUA;
+      else             ++RUB;
+    } while (RUA.isValid() && RUB.isValid());
     return false;
   }