// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/compiler/add-type-assertions-reducer.h" #include "src/compiler/node-properties.h" namespace v8 { namespace internal { namespace compiler { AddTypeAssertionsReducer::AddTypeAssertionsReducer(Editor* editor, JSGraph* jsgraph, Zone* zone) : AdvancedReducer(editor), jsgraph_(jsgraph), visited_(jsgraph->graph()->NodeCount(), zone) {} AddTypeAssertionsReducer::~AddTypeAssertionsReducer() = default; Reduction AddTypeAssertionsReducer::Reduce(Node* node) { if (node->opcode() == IrOpcode::kAssertType || node->opcode() == IrOpcode::kPhi || !NodeProperties::IsTyped(node) || visited_.Get(node)) { return NoChange(); } visited_.Set(node, true); Type type = NodeProperties::GetType(node); if (!type.IsRange()) { return NoChange(); } Node* assertion = graph()->NewNode(simplified()->AssertType(type), node); NodeProperties::SetType(assertion, type); for (Edge edge : node->use_edges()) { Node* const user = edge.from(); DCHECK(!user->IsDead()); if (NodeProperties::IsValueEdge(edge) && user != assertion) { edge.UpdateTo(assertion); Revisit(user); } } return NoChange(); } } // namespace compiler } // namespace internal } // namespace v8