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

Unified Diff: src/compiler/gap-resolver.cc

Issue 1081373002: [turbofan] cleanup ParallelMove (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 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 | « src/compiler/gap-resolver.h ('k') | src/compiler/instruction.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)) {
« no previous file with comments | « src/compiler/gap-resolver.h ('k') | src/compiler/instruction.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698