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

Unified Diff: src/compiler/greedy-allocator.h

Issue 1312473018: [turbofan] Greedy: live range grouping. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 3 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/compiler/greedy-allocator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/greedy-allocator.h
diff --git a/src/compiler/greedy-allocator.h b/src/compiler/greedy-allocator.h
index 8ac0bf138a28a611e14e88c31922271d977474a7..514c88d3b29eb9ae5bbb26069fdccbdc4c49d88b 100644
--- a/src/compiler/greedy-allocator.h
+++ b/src/compiler/greedy-allocator.h
@@ -18,21 +18,45 @@ namespace compiler {
// we may extend this to groups of LiveRanges. It has to be comparable.
class AllocationCandidate {
public:
- explicit AllocationCandidate(LiveRange* range) : range_(range) {}
+ explicit AllocationCandidate(LiveRange* range)
+ : is_group_(false), size_(range->GetSize()) {
+ candidate_.range_ = range;
+ }
+
+ explicit AllocationCandidate(LiveRangeGroup* ranges)
+ : is_group_(true), size_(CalculateGroupSize(ranges)) {
+ candidate_.group_ = ranges;
+ }
// Strict ordering operators
bool operator<(const AllocationCandidate& other) const {
- return range_->GetSize() < other.range_->GetSize();
+ return size() < other.size();
}
bool operator>(const AllocationCandidate& other) const {
- return range_->GetSize() > other.range_->GetSize();
+ return size() > other.size();
}
- LiveRange* live_range() const { return range_; }
+ bool is_group() const { return is_group_; }
+ LiveRange* live_range() const { return candidate_.range_; }
+ LiveRangeGroup* group() const { return candidate_.group_; }
private:
- LiveRange* range_;
+ unsigned CalculateGroupSize(LiveRangeGroup* group) {
+ unsigned ret = 0;
+ for (LiveRange* range : group->ranges()) {
+ ret += range->GetSize();
+ }
+ return ret;
+ }
+
+ unsigned size() const { return size_; }
+ bool is_group_;
+ unsigned size_;
+ union {
+ LiveRange* range_;
+ LiveRangeGroup* group_;
+ } candidate_;
};
@@ -41,6 +65,7 @@ class AllocationScheduler final : ZoneObject {
public:
explicit AllocationScheduler(Zone* zone) : queue_(zone) {}
void Schedule(LiveRange* range);
+ void Schedule(LiveRangeGroup* group);
AllocationCandidate GetNext();
bool empty() const { return queue_.empty(); }
@@ -85,12 +110,15 @@ class GreedyAllocator final : public RegisterAllocator {
}
Zone* local_zone() const { return local_zone_; }
+ ZoneVector<LiveRangeGroup*>& groups() { return groups_; }
+ const ZoneVector<LiveRangeGroup*>& groups() const { return groups_; }
// Insert fixed ranges.
void PreallocateFixedRanges();
+ void GroupLiveRanges();
+
// Schedule unassigned live ranges for allocation.
- // TODO(mtrofin): groups.
void ScheduleAllocationCandidates();
void AllocateRegisterToRange(unsigned reg_id, LiveRange* range) {
@@ -106,6 +134,7 @@ class GreedyAllocator final : public RegisterAllocator {
void TryAllocateCandidate(const AllocationCandidate& candidate);
void TryAllocateLiveRange(LiveRange* range);
+ void TryAllocateGroup(LiveRangeGroup* group);
bool CanProcessRange(LiveRange* range) const {
return range != nullptr && !range->IsEmpty() && range->kind() == mode();
@@ -122,6 +151,12 @@ class GreedyAllocator final : public RegisterAllocator {
float GetMaximumConflictingWeight(unsigned reg_id,
const LiveRange* range) const;
+ // Returns kInvalidWeight if there are no conflicts, or the largest weight of
+ // a range conflicting with the given range, at the given register.
+ float GetMaximumConflictingWeight(unsigned reg_id,
+ const LiveRangeGroup* group,
+ float group_weight) const;
+
// This is the extension point for splitting heuristics.
void SplitOrSpillBlockedRange(LiveRange* range);
@@ -152,6 +187,8 @@ class GreedyAllocator final : public RegisterAllocator {
Zone* local_zone_;
ZoneVector<CoalescedLiveRanges*> allocations_;
AllocationScheduler scheduler_;
+ ZoneVector<LiveRangeGroup*> groups_;
+
DISALLOW_COPY_AND_ASSIGN(GreedyAllocator);
};
} // namespace compiler
« no previous file with comments | « no previous file | src/compiler/greedy-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698