diff options
Diffstat (limited to 'deps/v8/src/compiler/escape-analysis-reducer.cc')
-rw-r--r-- | deps/v8/src/compiler/escape-analysis-reducer.cc | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/deps/v8/src/compiler/escape-analysis-reducer.cc b/deps/v8/src/compiler/escape-analysis-reducer.cc index f7708f85da..10b7f285a6 100644 --- a/deps/v8/src/compiler/escape-analysis-reducer.cc +++ b/deps/v8/src/compiler/escape-analysis-reducer.cc @@ -31,7 +31,7 @@ EscapeAnalysisReducer::EscapeAnalysisReducer(Editor* editor, JSGraph* jsgraph, fully_reduced_(static_cast<int>(jsgraph->graph()->NodeCount() * 2), zone), exists_virtual_allocate_(escape_analysis->ExistsVirtualAllocate()) {} -Reduction EscapeAnalysisReducer::Reduce(Node* node) { +Reduction EscapeAnalysisReducer::ReduceNode(Node* node) { if (node->id() < static_cast<NodeId>(fully_reduced_.length()) && fully_reduced_.Contains(node->id())) { return NoChange(); @@ -61,8 +61,7 @@ Reduction EscapeAnalysisReducer::Reduce(Node* node) { break; } bool depends_on_object_state = false; - for (int i = 0; i < node->InputCount(); i++) { - Node* input = node->InputAt(i); + for (Node* input : node->inputs()) { switch (input->opcode()) { case IrOpcode::kAllocate: case IrOpcode::kFinishRegion: @@ -97,9 +96,18 @@ Reduction EscapeAnalysisReducer::Reduce(Node* node) { return NoChange(); } +Reduction EscapeAnalysisReducer::Reduce(Node* node) { + Reduction reduction = ReduceNode(node); + if (reduction.Changed() && node != reduction.replacement()) { + escape_analysis()->SetReplacement(node, reduction.replacement()); + } + return reduction; +} + namespace { -Node* MaybeGuard(JSGraph* jsgraph, Node* original, Node* replacement) { +Node* MaybeGuard(JSGraph* jsgraph, Zone* zone, Node* original, + Node* replacement) { // We might need to guard the replacement if the type of the {replacement} // node is not in a sub-type relation to the type of the the {original} node. Type* const replacement_type = NodeProperties::GetType(replacement); @@ -108,10 +116,18 @@ Node* MaybeGuard(JSGraph* jsgraph, Node* original, Node* replacement) { Node* const control = NodeProperties::GetControlInput(original); replacement = jsgraph->graph()->NewNode( jsgraph->common()->TypeGuard(original_type), replacement, control); + NodeProperties::SetType(replacement, original_type); } return replacement; } +Node* SkipTypeGuards(Node* node) { + while (node->opcode() == IrOpcode::kTypeGuard) { + node = NodeProperties::GetValueInput(node, 0); + } + return node; +} + } // namespace Reduction EscapeAnalysisReducer::ReduceLoad(Node* node) { @@ -120,12 +136,13 @@ Reduction EscapeAnalysisReducer::ReduceLoad(Node* node) { if (node->id() < static_cast<NodeId>(fully_reduced_.length())) { fully_reduced_.Add(node->id()); } - if (escape_analysis()->IsVirtual(NodeProperties::GetValueInput(node, 0))) { + if (escape_analysis()->IsVirtual( + SkipTypeGuards(NodeProperties::GetValueInput(node, 0)))) { if (Node* rep = escape_analysis()->GetReplacement(node)) { isolate()->counters()->turbo_escape_loads_replaced()->Increment(); TRACE("Replaced #%d (%s) with #%d (%s)\n", node->id(), node->op()->mnemonic(), rep->id(), rep->op()->mnemonic()); - rep = MaybeGuard(jsgraph(), node, rep); + rep = MaybeGuard(jsgraph(), zone(), node, rep); ReplaceWithValue(node, rep); return Replace(rep); } @@ -140,7 +157,8 @@ Reduction EscapeAnalysisReducer::ReduceStore(Node* node) { if (node->id() < static_cast<NodeId>(fully_reduced_.length())) { fully_reduced_.Add(node->id()); } - if (escape_analysis()->IsVirtual(NodeProperties::GetValueInput(node, 0))) { + if (escape_analysis()->IsVirtual( + SkipTypeGuards(NodeProperties::GetValueInput(node, 0)))) { TRACE("Removed #%d (%s) from effect chain\n", node->id(), node->op()->mnemonic()); RelaxEffectsAndControls(node); @@ -195,14 +213,14 @@ Reduction EscapeAnalysisReducer::ReduceFinishRegion(Node* node) { Reduction EscapeAnalysisReducer::ReduceReferenceEqual(Node* node) { DCHECK_EQ(node->opcode(), IrOpcode::kReferenceEqual); - Node* left = NodeProperties::GetValueInput(node, 0); - Node* right = NodeProperties::GetValueInput(node, 1); + Node* left = SkipTypeGuards(NodeProperties::GetValueInput(node, 0)); + Node* right = SkipTypeGuards(NodeProperties::GetValueInput(node, 1)); if (escape_analysis()->IsVirtual(left)) { if (escape_analysis()->IsVirtual(right) && escape_analysis()->CompareVirtualObjects(left, right)) { ReplaceWithValue(node, jsgraph()->TrueConstant()); TRACE("Replaced ref eq #%d with true\n", node->id()); - Replace(jsgraph()->TrueConstant()); + return Replace(jsgraph()->TrueConstant()); } // Right-hand side is not a virtual object, or a different one. ReplaceWithValue(node, jsgraph()->FalseConstant()); @@ -220,7 +238,7 @@ Reduction EscapeAnalysisReducer::ReduceReferenceEqual(Node* node) { Reduction EscapeAnalysisReducer::ReduceObjectIsSmi(Node* node) { DCHECK_EQ(node->opcode(), IrOpcode::kObjectIsSmi); - Node* input = NodeProperties::GetValueInput(node, 0); + Node* input = SkipTypeGuards(NodeProperties::GetValueInput(node, 0)); if (escape_analysis()->IsVirtual(input)) { ReplaceWithValue(node, jsgraph()->FalseConstant()); TRACE("Replaced ObjectIsSmi #%d with false\n", node->id()); @@ -313,7 +331,7 @@ Node* EscapeAnalysisReducer::ReduceStateValueInput(Node* node, int node_index, bool node_multiused, bool already_cloned, bool multiple_users) { - Node* input = NodeProperties::GetValueInput(node, node_index); + Node* input = SkipTypeGuards(NodeProperties::GetValueInput(node, node_index)); if (node->id() < static_cast<NodeId>(fully_reduced_.length()) && fully_reduced_.Contains(node->id())) { return nullptr; |