diff options
author | Chris Lattner <sabre@nondot.org> | 2004-07-23 08:24:23 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-07-23 08:24:23 +0000 |
commit | ec2bc645053e9051ada01fac6a555df17a85c91d (patch) | |
tree | 03fd93fa7edc2b0a29a91c261d1e6e4f82a504ec /lib/CodeGen/LiveIntervalAnalysis.h | |
parent | 5c2e282865821ba65795a2d14bd95e5a82a6be41 (diff) |
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);
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15130 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/LiveIntervalAnalysis.h')
-rw-r--r-- | lib/CodeGen/LiveIntervalAnalysis.h | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/lib/CodeGen/LiveIntervalAnalysis.h b/lib/CodeGen/LiveIntervalAnalysis.h index a78aed186f..a70deffdc1 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.h +++ b/lib/CodeGen/LiveIntervalAnalysis.h @@ -29,9 +29,29 @@ namespace llvm { 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 @@ namespace llvm { 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 @@ namespace llvm { bool overlaps(const LiveInterval& other) const; - void addRange(unsigned start, unsigned end); + void addRange(LiveRange R); void join(const LiveInterval& other); |