• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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