Index: src/compiler/gap-resolver.cc |
diff --git a/src/compiler/gap-resolver.cc b/src/compiler/gap-resolver.cc |
index cdf80857f0e3260292e513a82b4f2b27e62942c8..d9b20b64886187e2e910817e88f594e34822dfc8 100644 |
--- a/src/compiler/gap-resolver.cc |
+++ b/src/compiler/gap-resolver.cc |
@@ -12,47 +12,30 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
-typedef ZoneList<MoveOperands>::iterator op_iterator; |
+namespace { |
-#ifdef ENABLE_SLOW_DCHECKS |
-struct InstructionOperandComparator { |
- bool operator()(const InstructionOperand* x, |
- const InstructionOperand* y) const { |
- return *x < *y; |
- } |
-}; |
-#endif |
- |
-// No operand should be the destination for more than one move. |
-static void VerifyMovesAreInjective(ZoneList<MoveOperands>* moves) { |
-#ifdef ENABLE_SLOW_DCHECKS |
- std::set<InstructionOperand*, InstructionOperandComparator> seen; |
- for (op_iterator i = moves->begin(); i != moves->end(); ++i) { |
- SLOW_DCHECK(seen.find(i->destination()) == seen.end()); |
- seen.insert(i->destination()); |
- } |
-#endif |
+inline bool Blocks(MoveOperands* move, InstructionOperand destination) { |
+ return move->Blocks(destination); |
} |
-void GapResolver::Resolve(ParallelMove* parallel_move) const { |
- ZoneList<MoveOperands>* moves = parallel_move->move_operands(); |
- // TODO(svenpanne) Use the member version of remove_if when we use real lists. |
- op_iterator end = |
- std::remove_if(moves->begin(), moves->end(), |
- std::mem_fun_ref(&MoveOperands::IsRedundant)); |
- moves->Rewind(static_cast<int>(end - moves->begin())); |
+inline bool IsRedundant(MoveOperands* move) { return move->IsRedundant(); } |
+ |
+} // namespace |
- VerifyMovesAreInjective(moves); |
- for (op_iterator move = moves->begin(); move != moves->end(); ++move) { |
- if (!move->IsEliminated()) PerformMove(moves, &*move); |
+void GapResolver::Resolve(ParallelMove* moves) const { |
+ // Clear redundant moves. |
+ auto it = |
+ std::remove_if(moves->begin(), moves->end(), std::ptr_fun(IsRedundant)); |
+ moves->erase(it, moves->end()); |
+ for (auto move : *moves) { |
+ if (!move->IsEliminated()) PerformMove(moves, move); |
} |
} |
-void GapResolver::PerformMove(ZoneList<MoveOperands>* moves, |
- MoveOperands* move) const { |
+void GapResolver::PerformMove(ParallelMove* moves, MoveOperands* move) const { |
// Each call to this function performs a move and deletes it from the move |
// graph. We first recursively perform any move blocking this one. We mark a |
// move as "pending" on entry to PerformMove in order to detect cycles in the |
@@ -63,14 +46,14 @@ void GapResolver::PerformMove(ZoneList<MoveOperands>* moves, |
// Clear this move's destination to indicate a pending move. The actual |
// destination is saved on the side. |
- DCHECK_NOT_NULL(move->source()); // Or else it will look eliminated. |
- InstructionOperand* destination = move->destination(); |
- move->set_destination(NULL); |
+ DCHECK(!move->source().IsInvalid()); // Or else it will look eliminated. |
+ InstructionOperand destination = move->destination(); |
+ move->SetPending(); |
// Perform a depth-first traversal of the move graph to resolve dependencies. |
// Any unperformed, unpending move with a source the same as this one's |
// destination blocks this one so recursively perform all such moves. |
- for (op_iterator other = moves->begin(); other != moves->end(); ++other) { |
+ for (auto other : *moves) { |
if (other->Blocks(destination) && !other->IsPending()) { |
// Though PerformMove can change any source operand in the move graph, |
// this call cannot create a blocking move via a swap (this loop does not |
@@ -91,8 +74,8 @@ void GapResolver::PerformMove(ZoneList<MoveOperands>* moves, |
// This move's source may have changed due to swaps to resolve cycles and so |
// it may now be the last move in the cycle. If so remove it. |
- InstructionOperand* source = move->source(); |
- if (source->Equals(destination)) { |
+ InstructionOperand source = move->source(); |
+ if (source == destination) { |
move->Eliminate(); |
return; |
} |
@@ -100,28 +83,27 @@ void GapResolver::PerformMove(ZoneList<MoveOperands>* moves, |
// The move may be blocked on a (at most one) pending move, in which case we |
// have a cycle. Search for such a blocking move and perform a swap to |
// resolve it. |
- op_iterator blocker = std::find_if( |
- moves->begin(), moves->end(), |
- std::bind2nd(std::mem_fun_ref(&MoveOperands::Blocks), destination)); |
+ auto blocker = std::find_if(moves->begin(), moves->end(), |
+ std::bind2nd(std::ptr_fun(&Blocks), destination)); |
if (blocker == moves->end()) { |
// The easy case: This move is not blocked. |
- assembler_->AssembleMove(source, destination); |
+ assembler_->AssembleMove(&source, &destination); |
move->Eliminate(); |
return; |
} |
- DCHECK(blocker->IsPending()); |
+ DCHECK((*blocker)->IsPending()); |
// Ensure source is a register or both are stack slots, to limit swap cases. |
- if (source->IsStackSlot() || source->IsDoubleStackSlot()) { |
+ if (source.IsStackSlot() || source.IsDoubleStackSlot()) { |
std::swap(source, destination); |
} |
- assembler_->AssembleSwap(source, destination); |
+ assembler_->AssembleSwap(&source, &destination); |
move->Eliminate(); |
// Any unperformed (including pending) move with a source of either this |
// move's source or destination needs to have their source changed to |
// reflect the state of affairs after the swap. |
- for (op_iterator other = moves->begin(); other != moves->end(); ++other) { |
+ for (auto other : *moves) { |
if (other->Blocks(source)) { |
other->set_source(destination); |
} else if (other->Blocks(destination)) { |