| Index: src/compiler/greedy-allocator.cc
|
| diff --git a/src/compiler/greedy-allocator.cc b/src/compiler/greedy-allocator.cc
|
| index a0fede65f532dba5fdf27a2c2ba9fb15141d8255..a1128e416e1db0ea6c665afe37fe42928bb10a18 100644
|
| --- a/src/compiler/greedy-allocator.cc
|
| +++ b/src/compiler/greedy-allocator.cc
|
| @@ -338,12 +338,14 @@ void GreedyAllocator::TryAllocateLiveRange(LiveRange* range) {
|
| int hinted_reg = -1;
|
|
|
| EnsureValidRangeWeight(range);
|
| - DCHECK(range->weight() != LiveRange::kInvalidWeight);
|
| + float competing_weight = range->weight();
|
| + DCHECK(competing_weight != LiveRange::kInvalidWeight);
|
|
|
| // Can we allocate at the hinted register?
|
| if (range->FirstHintPosition(&hinted_reg) != nullptr) {
|
| DCHECK(hinted_reg >= 0);
|
| - float max_conflict_weight = GetMaximumConflictingWeight(hinted_reg, range);
|
| + float max_conflict_weight =
|
| + GetMaximumConflictingWeight(hinted_reg, range, competing_weight);
|
| if (max_conflict_weight == LiveRange::kInvalidWeight) {
|
| free_reg = hinted_reg;
|
| } else if (max_conflict_weight < range->weight()) {
|
| @@ -361,7 +363,8 @@ void GreedyAllocator::TryAllocateLiveRange(LiveRange* range) {
|
| for (int i = 0; i < num_registers(); i++) {
|
| // Skip unnecessarily re-visiting the hinted register, if any.
|
| if (i == hinted_reg) continue;
|
| - float max_conflict_weight = GetMaximumConflictingWeight(i, range);
|
| + float max_conflict_weight =
|
| + GetMaximumConflictingWeight(i, range, competing_weight);
|
| if (max_conflict_weight == LiveRange::kInvalidWeight) {
|
| free_reg = i;
|
| break;
|
| @@ -482,15 +485,16 @@ void GreedyAllocator::AllocateRegisters() {
|
|
|
|
|
| float GreedyAllocator::GetMaximumConflictingWeight(
|
| - unsigned reg_id, const LiveRange* range) const {
|
| + unsigned reg_id, const LiveRange* range, float competing_weight) const {
|
| float ret = LiveRange::kInvalidWeight;
|
|
|
| auto conflicts = current_allocations(reg_id)->GetConflicts(range);
|
| for (LiveRange* conflict = conflicts.Current(); conflict != nullptr;
|
| conflict = conflicts.GetNext()) {
|
| DCHECK_NE(conflict->weight(), LiveRange::kInvalidWeight);
|
| + if (competing_weight <= conflict->weight()) return LiveRange::kMaxWeight;
|
| ret = Max(ret, conflict->weight());
|
| - if (ret == LiveRange::kMaxWeight) return ret;
|
| + DCHECK(ret < LiveRange::kMaxWeight);
|
| }
|
|
|
| return ret;
|
| @@ -503,7 +507,8 @@ float GreedyAllocator::GetMaximumConflictingWeight(unsigned reg_id,
|
| float ret = LiveRange::kInvalidWeight;
|
|
|
| for (LiveRange* member : group->ranges()) {
|
| - float member_conflict_weight = GetMaximumConflictingWeight(reg_id, member);
|
| + float member_conflict_weight =
|
| + GetMaximumConflictingWeight(reg_id, member, group_weight);
|
| if (member_conflict_weight == LiveRange::kMaxWeight) {
|
| return LiveRange::kMaxWeight;
|
| }
|
|
|