diff options
Diffstat (limited to 'deps/v8/src/compiler/dead-code-elimination.cc')
-rw-r--r-- | deps/v8/src/compiler/dead-code-elimination.cc | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/deps/v8/src/compiler/dead-code-elimination.cc b/deps/v8/src/compiler/dead-code-elimination.cc index 523d37fe29..6c54f2b036 100644 --- a/deps/v8/src/compiler/dead-code-elimination.cc +++ b/deps/v8/src/compiler/dead-code-elimination.cc @@ -139,18 +139,26 @@ Reduction DeadCodeElimination::ReduceLoopOrMerge(Node* node) { if (live_input_count == 0) { return Replace(dead()); } else if (live_input_count == 1) { + NodeVector loop_exits(zone_); // Due to compaction above, the live input is at offset 0. for (Node* const use : node->uses()) { if (NodeProperties::IsPhi(use)) { Replace(use, use->InputAt(0)); } else if (use->opcode() == IrOpcode::kLoopExit && use->InputAt(1) == node) { - RemoveLoopExit(use); + // Remember the loop exits so that we can mark their loop input dead. + // This has to be done after the use list iteration so that we do + // not mutate the use list while it is being iterated. + loop_exits.push_back(use); } else if (use->opcode() == IrOpcode::kTerminate) { DCHECK_EQ(IrOpcode::kLoop, node->opcode()); Replace(use, dead()); } } + for (Node* loop_exit : loop_exits) { + loop_exit->ReplaceInput(1, dead()); + Revisit(loop_exit); + } return Replace(node->InputAt(0)); } DCHECK_LE(2, live_input_count); |