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

Chris Lattner lattner at cs.uiuc.edu
Fri Jul 23 01:24:34 PDT 2004



Changes in directory llvm/lib/CodeGen:

LiveIntervals.h updated: 1.30 -> 1.31

---
Log message:

Improve comments a bit

Use an explicit LiveRange class to represent ranges instead of an std::pair.
This is a minor cleanup, but is really intended to make a future patch simpler
and less invasive.

Alkis, could you please take a look at LiveInterval::liveAt?  I suspect that
you can add an operator<(unsigned) to LiveRange, allowing us to speed up the
upper_bound call by quite a bit (this would also apply to other callers of
upper/lower_bound).  I would do it myself, but I still don't understand that
crazy liveAt function, despite the comment. :)

Basically I would like to see this:
    LiveRange dummy(index, index+1);
    Ranges::const_iterator r = std::upper_bound(ranges.begin(),
                                                ranges.end(),
                                                dummy);

Turn into:
    Ranges::const_iterator r = std::upper_bound(ranges.begin(),
                                                ranges.end(),
                                                index);


---
Diffs of the changes:  (+28 -5)

Index: llvm/lib/CodeGen/LiveIntervals.h
diff -u llvm/lib/CodeGen/LiveIntervals.h:1.30 llvm/lib/CodeGen/LiveIntervals.h:1.31
--- llvm/lib/CodeGen/LiveIntervals.h:1.30	Fri Jul 23 00:26:05 2004
+++ llvm/lib/CodeGen/LiveIntervals.h	Fri Jul 23 03:24:23 2004
@@ -29,9 +29,29 @@
     class MRegisterInfo;
     class VirtRegMap;
 
+    /// LiveRange structure - This represents a simple register range in the
+    /// program, with an inclusive start point and an exclusive end point.
+    /// These ranges are rendered as [start,end).
+    struct LiveRange {
+      unsigned start;  // Start point of the interval (inclusive)
+      unsigned end;  // End point of the interval (exclusive)
+      LiveRange(unsigned S, unsigned E) : start(S), end(E) {
+        assert(S < E && "Cannot create empty or backwards range");
+      }
+
+      bool operator<(const LiveRange &LR) const {
+        return start < LR.start || (start == LR.start && end < LR.end);
+      }
+      bool operator==(const LiveRange &LR) const {
+        return start == LR.start && end == LR.end;
+      }
+    private:
+      LiveRange(); // DO NOT IMPLEMENT
+    };
+    std::ostream& operator<<(std::ostream& os, const LiveRange &LR);
+
     struct LiveInterval {
-        typedef std::pair<unsigned, unsigned> Range;
-        typedef std::vector<Range> Ranges;
+        typedef std::vector<LiveRange> Ranges;
         unsigned reg;   // the register of this interval
         float weight;   // weight of this interval:
                         //     (number of uses *10^loopDepth)
@@ -44,14 +64,17 @@
 
         bool spilled() const;
 
+        /// start - Return the lowest numbered slot covered by interval.
         unsigned start() const {
             assert(!empty() && "empty interval for register");
-            return ranges.front().first;
+            return ranges.front().start;
         }
 
+        /// end - return the maximum point of the interval of the whole,
+        /// exclusive.
         unsigned end() const {
             assert(!empty() && "empty interval for register");
-            return ranges.back().second;
+            return ranges.back().end;
         }
 
         bool expiredAt(unsigned index) const {
@@ -62,7 +85,7 @@
 
         bool overlaps(const LiveInterval& other) const;
 
-        void addRange(unsigned start, unsigned end);
+        void addRange(LiveRange R);
 
         void join(const LiveInterval& other);
 





More information about the llvm-commits mailing list