[llvm-commits] CVS: llvm/lib/CodeGen/LiveIntervals.cpp

Alkis Evlogimenos alkis at cs.uiuc.edu
Sat Jan 31 10:56:04 PST 2004


Changes in directory llvm/lib/CodeGen:

LiveIntervals.cpp updated: 1.34 -> 1.35

---
Log message:

Optimize liveAt() and overlaps(). We now use a binary search instead
of a linear search to find the first range for comparisons. This cuts
down the linear scan register allocator running time by a factor of 3
in 254.perlbmk and by a factor of 2.2 in 176.gcc.


---
Diffs of the changes:  (+30 -20)

Index: llvm/lib/CodeGen/LiveIntervals.cpp
diff -u llvm/lib/CodeGen/LiveIntervals.cpp:1.34 llvm/lib/CodeGen/LiveIntervals.cpp:1.35
--- llvm/lib/CodeGen/LiveIntervals.cpp:1.34	Sat Jan 31 08:37:41 2004
+++ llvm/lib/CodeGen/LiveIntervals.cpp	Sat Jan 31 10:54:54 2004
@@ -463,39 +463,49 @@
 
 bool LiveIntervals::Interval::liveAt(unsigned index) const
 {
-    Ranges::const_iterator r = ranges.begin();
-    while (r != ranges.end() && index < (r->second - 1)) {
-        if (index >= r->first)
-            return true;
-        ++r;
-    }
-    return false;
+    Range dummy(index, index+1);
+    Ranges::const_iterator r = std::upper_bound(ranges.begin(),
+                                                ranges.end(),
+                                                dummy);
+    if (r == ranges.begin())
+        return false;
+
+    --r;
+    return index >= r->first && index < (r->second - 1);
 }
 
 bool LiveIntervals::Interval::overlaps(const Interval& other) const
 {
     Ranges::const_iterator i = ranges.begin();
+    Ranges::const_iterator ie = ranges.end();
     Ranges::const_iterator j = other.ranges.begin();
+    Ranges::const_iterator je = other.ranges.end();
+    if (i->first < j->first) {
+        i = std::upper_bound(i, ie, *j);
+        if (i != ranges.begin()) --i;
+    }
+    else if (j->first < i->first) {
+        j = std::upper_bound(j, je, *i);
+        if (j != other.ranges.begin()) --j;
+    }
+
+    while (i != ie && j != je) {
+        if (i->first == j->first) {
+            return true;
+        }
+        else {
+            if (i->first > j->first) {
+                swap(i, j);
+                swap(ie, je);
+            }
+            assert(i->first < j->first);
 
-    while (i != ranges.end() && j != other.ranges.end()) {
-        if (i->first < j->first) {
             if ((i->second - 1) > j->first) {
                 return true;
             }
             else {
                 ++i;
             }
-        }
-        else if (j->first < i->first) {
-            if ((j->second - 1) > i->first) {
-                return true;
-            }
-            else {
-                ++j;
-            }
-        }
-        else {
-            return true;
         }
     }
 





More information about the llvm-commits mailing list