| Index: src/lithium.cc
|
| diff --git a/src/lithium.cc b/src/lithium.cc
|
| index a65b091e762ba55e43185c36fa929b031ede03cd..7a7518cf61e1ecb6cc3fef71900e973feb7194fa 100644
|
| --- a/src/lithium.cc
|
| +++ b/src/lithium.cc
|
| @@ -60,23 +60,29 @@ class LGapNode: public ZoneObject {
|
| };
|
|
|
|
|
| -LGapResolver::LGapResolver(const ZoneList<LMoveOperands>* moves,
|
| - LOperand* marker_operand)
|
| - : nodes_(4),
|
| +LGapResolver::LGapResolver()
|
| + : nodes_(32),
|
| identified_cycles_(4),
|
| - result_(4),
|
| - marker_operand_(marker_operand),
|
| + result_(16),
|
| next_visited_id_(0) {
|
| +}
|
| +
|
| +
|
| +const ZoneList<LMoveOperands>* LGapResolver::Resolve(
|
| + const ZoneList<LMoveOperands>* moves,
|
| + LOperand* marker_operand) {
|
| + nodes_.Rewind(0);
|
| + identified_cycles_.Rewind(0);
|
| + result_.Rewind(0);
|
| + next_visited_id_ = 0;
|
| +
|
| for (int i = 0; i < moves->length(); ++i) {
|
| LMoveOperands move = moves->at(i);
|
| if (!move.IsRedundant()) RegisterMove(move);
|
| }
|
| -}
|
| -
|
|
|
| -const ZoneList<LMoveOperands>* LGapResolver::ResolveInReverseOrder() {
|
| for (int i = 0; i < identified_cycles_.length(); ++i) {
|
| - ResolveCycle(identified_cycles_[i]);
|
| + ResolveCycle(identified_cycles_[i], marker_operand);
|
| }
|
|
|
| int unresolved_nodes;
|
| @@ -105,20 +111,20 @@ void LGapResolver::AddResultMove(LOperand* from, LOperand* to) {
|
| }
|
|
|
|
|
| -void LGapResolver::ResolveCycle(LGapNode* start) {
|
| - ZoneList<LOperand*> circle_operands(8);
|
| - circle_operands.Add(marker_operand_);
|
| +void LGapResolver::ResolveCycle(LGapNode* start, LOperand* marker_operand) {
|
| + ZoneList<LOperand*> cycle_operands(8);
|
| + cycle_operands.Add(marker_operand);
|
| LGapNode* cur = start;
|
| do {
|
| cur->MarkResolved();
|
| - circle_operands.Add(cur->operand());
|
| + cycle_operands.Add(cur->operand());
|
| cur = cur->assigned_from();
|
| } while (cur != start);
|
| - circle_operands.Add(marker_operand_);
|
| + cycle_operands.Add(marker_operand);
|
|
|
| - for (int i = circle_operands.length() - 1; i > 0; --i) {
|
| - LOperand* from = circle_operands[i];
|
| - LOperand* to = circle_operands[i - 1];
|
| + for (int i = cycle_operands.length() - 1; i > 0; --i) {
|
| + LOperand* from = cycle_operands[i];
|
| + LOperand* to = cycle_operands[i - 1];
|
| AddResultMove(from, to);
|
| }
|
| }
|
| @@ -156,7 +162,7 @@ void LGapResolver::RegisterMove(LMoveOperands move) {
|
| }
|
| ASSERT(!to->IsAssigned());
|
| if (CanReach(from, to)) {
|
| - // This introduces a circle. Save.
|
| + // This introduces a cycle. Save.
|
| identified_cycles_.Add(from);
|
| }
|
| to->set_assigned_from(from);
|
|
|