| Index: src/IceOperand.h
|
| diff --git a/src/IceOperand.h b/src/IceOperand.h
|
| index 041adfd1556716e6e2b1acd4a7122782fa0eb0fd..1905a1726938fe553c062258ef3e9e795c015a50 100644
|
| --- a/src/IceOperand.h
|
| +++ b/src/IceOperand.h
|
| @@ -603,6 +603,9 @@ bool operator==(const RegWeight &A, const RegWeight &B);
|
| /// interval.
|
| class LiveRange {
|
| public:
|
| + using RangeElementType = std::pair<InstNumberT, InstNumberT>;
|
| + /// RangeType is arena-allocated from the Cfg's allocator.
|
| + using RangeType = CfgVector<RangeElementType>;
|
| LiveRange() = default;
|
| /// Special constructor for building a kill set. The advantage is that we can
|
| /// reserve the right amount of space in advance.
|
| @@ -618,7 +621,10 @@ public:
|
| Range.clear();
|
| untrim();
|
| }
|
| - void addSegment(InstNumberT Start, InstNumberT End);
|
| + void addSegment(InstNumberT Start, InstNumberT End, CfgNode *Node = nullptr);
|
| + void addSegment(RangeElementType Segment, CfgNode *Node = nullptr) {
|
| + addSegment(Segment.first, Segment.second, Node);
|
| + }
|
|
|
| bool endsBefore(const LiveRange &Other) const;
|
| bool overlaps(const LiveRange &Other, bool UseTrimmed = false) const;
|
| @@ -637,11 +643,18 @@ public:
|
|
|
| void dump(Ostream &Str) const;
|
|
|
| + SizeT getNumSegments() const { return Range.size(); }
|
| +
|
| + const RangeType &getSegments() const { return Range; }
|
| + CfgNode *getNodeForSegment(InstNumberT Begin) {
|
| + auto Iter = NodeMap.find(Begin);
|
| + assert(Iter != NodeMap.end());
|
| + return Iter->second;
|
| + }
|
| +
|
| private:
|
| - using RangeElementType = std::pair<InstNumberT, InstNumberT>;
|
| - /// RangeType is arena-allocated from the Cfg's allocator.
|
| - using RangeType = CfgVector<RangeElementType>;
|
| RangeType Range;
|
| + CfgUnorderedMap<InstNumberT, CfgNode *> NodeMap;
|
| /// TrimmedBegin is an optimization for the overlaps() computation. Since the
|
| /// linear-scan algorithm always calls it as overlaps(Cur) and Cur advances
|
| /// monotonically according to live range start, we can optimize overlaps() by
|
| @@ -744,9 +757,10 @@ public:
|
| const LiveRange &getLiveRange() const { return Live; }
|
| void setLiveRange(const LiveRange &Range) { Live = Range; }
|
| void resetLiveRange() { Live.reset(); }
|
| - void addLiveRange(InstNumberT Start, InstNumberT End) {
|
| + void addLiveRange(InstNumberT Start, InstNumberT End,
|
| + CfgNode *Node = nullptr) {
|
| assert(!getIgnoreLiveness());
|
| - Live.addSegment(Start, End);
|
| + Live.addSegment(Start, End, Node);
|
| }
|
| void trimLiveRange(InstNumberT Start) { Live.trim(Start); }
|
| void untrimLiveRange() { Live.untrim(); }
|
|
|