Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Unified Diff: src/IceOperand.h

Issue 627203002: Subzero: Optimize live range overlaps() computation through trimming. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Remove the variable definitions trimming to simplify Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/IceOperand.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceOperand.h
diff --git a/src/IceOperand.h b/src/IceOperand.h
index 798da0b5b10bfd47e9272864b8ee538581d61ce0..cbe0095805e16d5d049bf993942016c707d3344f 100644
--- a/src/IceOperand.h
+++ b/src/IceOperand.h
@@ -303,19 +303,24 @@ public:
void reset() {
Range.clear();
Weight.setWeight(0);
+ untrim();
IsNonpoints = false;
}
void addSegment(InstNumberT Start, InstNumberT End);
bool endsBefore(const LiveRange &Other) const;
- bool overlaps(const LiveRange &Other) const;
- bool overlaps(InstNumberT OtherBegin) const;
+ bool overlaps(const LiveRange &Other, bool UseTrimmed = false) const;
+ bool overlapsInst(InstNumberT OtherBegin, bool UseTrimmed = false) const;
bool containsValue(InstNumberT Value) const;
bool isEmpty() const { return Range.empty(); }
+ bool isNonpoints() const { return IsNonpoints; }
InstNumberT getStart() const {
return Range.empty() ? -1 : Range.begin()->first;
}
+ void untrim() { TrimmedBegin = Range.begin(); }
+ void trim(InstNumberT Lower);
+
RegWeight getWeight() const { return Weight; }
void setWeight(const RegWeight &NewWeight) { Weight = NewWeight; }
void addWeight(uint32_t Delta) { Weight.addWeight(Delta); }
@@ -336,6 +341,15 @@ private:
#endif
RangeType Range;
RegWeight Weight;
+ // 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 ignoring all segments that end before
+ // the start of Cur's range. The linear-scan code enables this by
+ // calling trim() on the ranges of interest as Cur advances. Note
+ // that linear-scan also has to initialize TrimmedBegin at the
+ // beginning by calling untrim().
+ RangeType::const_iterator TrimmedBegin;
// IsNonpoints keeps track of whether the live range contains at
// least one interval where Start!=End. If it is empty or has the
// form [x,x),[y,y),...,[z,z), then overlaps(InstNumberT) is
@@ -404,6 +418,8 @@ public:
Live.addWeight(WeightDelta * Weight.getWeight());
}
void setLiveRangeInfiniteWeight() { Live.setWeight(RegWeight::Inf); }
+ void trimLiveRange(InstNumberT Start) { Live.trim(Start); }
+ void untrimLiveRange() { Live.untrim(); }
Variable *getLo() const { return LoVar; }
Variable *getHi() const { return HiVar; }
@@ -509,10 +525,8 @@ private:
MultiBlockState MultiBlock;
const CfgNode *SingleUseNode;
const CfgNode *SingleDefNode;
- // All definitions of the variable are collected here, in the order
- // encountered. Definitions in the same basic block are in
- // instruction order, but there's no guarantee for the basic block
- // order.
+ // All definitions of the variable are collected here, in increasing
+ // order of instruction number.
InstDefList Definitions;
};
« no previous file with comments | « no previous file | src/IceOperand.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698