1 // Copyright 2019 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/compiler/add-type-assertions-reducer.h"
6
7 #include "src/compiler/node-properties.h"
8
9 namespace v8 {
10 namespace internal {
11 namespace compiler {
12
AddTypeAssertionsReducer(Editor * editor,JSGraph * jsgraph,Zone * zone)13 AddTypeAssertionsReducer::AddTypeAssertionsReducer(Editor* editor,
14 JSGraph* jsgraph, Zone* zone)
15 : AdvancedReducer(editor),
16 jsgraph_(jsgraph),
17 visited_(jsgraph->graph()->NodeCount(), zone) {}
18
19 AddTypeAssertionsReducer::~AddTypeAssertionsReducer() = default;
20
Reduce(Node * node)21 Reduction AddTypeAssertionsReducer::Reduce(Node* node) {
22 if (node->opcode() == IrOpcode::kAssertType ||
23 node->opcode() == IrOpcode::kPhi || !NodeProperties::IsTyped(node) ||
24 visited_.Get(node)) {
25 return NoChange();
26 }
27 visited_.Set(node, true);
28
29 Type type = NodeProperties::GetType(node);
30 if (!type.IsRange()) {
31 return NoChange();
32 }
33
34 Node* assertion = graph()->NewNode(simplified()->AssertType(type), node);
35 NodeProperties::SetType(assertion, type);
36
37 for (Edge edge : node->use_edges()) {
38 Node* const user = edge.from();
39 DCHECK(!user->IsDead());
40 if (NodeProperties::IsValueEdge(edge) && user != assertion) {
41 edge.UpdateTo(assertion);
42 Revisit(user);
43 }
44 }
45
46 return NoChange();
47 }
48
49 } // namespace compiler
50 } // namespace internal
51 } // namespace v8
52