OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/graph-inl.h" | 5 #include "src/compiler/graph-inl.h" |
6 #include "src/compiler/js-operator.h" | 6 #include "src/compiler/js-operator.h" |
7 #include "src/compiler/node.h" | 7 #include "src/compiler/node.h" |
8 #include "src/compiler/node-properties-inl.h" | 8 #include "src/compiler/node-properties-inl.h" |
9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
10 #include "src/compiler/simplified-operator.h" | 10 #include "src/compiler/simplified-operator.h" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 private: | 112 private: |
113 Typer* typer_; | 113 Typer* typer_; |
114 MaybeHandle<Context> context_; | 114 MaybeHandle<Context> context_; |
115 }; | 115 }; |
116 | 116 |
117 | 117 |
118 class Typer::RunVisitor : public Typer::Visitor { | 118 class Typer::RunVisitor : public Typer::Visitor { |
119 public: | 119 public: |
120 RunVisitor(Typer* typer, MaybeHandle<Context> context) | 120 RunVisitor(Typer* typer, MaybeHandle<Context> context) |
121 : Visitor(typer, context), | 121 : Visitor(typer, context), |
122 phis(NodeSet::key_compare(), NodeSet::allocator_type(typer->zone())) {} | 122 redo(NodeSet::key_compare(), NodeSet::allocator_type(typer->zone())) {} |
123 | 123 |
124 GenericGraphVisit::Control Post(Node* node) { | 124 GenericGraphVisit::Control Post(Node* node) { |
125 if (OperatorProperties::HasValueOutput(node->op())) { | 125 if (OperatorProperties::HasValueOutput(node->op())) { |
126 Bounds bounds = TypeNode(node); | 126 Bounds bounds = TypeNode(node); |
127 NodeProperties::SetBounds(node, bounds); | 127 NodeProperties::SetBounds(node, bounds); |
128 // Remember phis for least fixpoint iteration. | 128 // Remember incompletely typed nodes for least fixpoint iteration. |
129 if (node->opcode() == IrOpcode::kPhi) phis.insert(node); | 129 int arity = OperatorProperties::GetValueInputCount(node->op()); |
| 130 for (int i = 0; i < arity; ++i) { |
| 131 // TODO(rossberg): change once IsTyped is available. |
| 132 // if (!NodeProperties::IsTyped(NodeProperties::GetValueInput(node, i)))
{ |
| 133 if (OperandType(node, i).upper->Is(Type::None())) { |
| 134 redo.insert(node); |
| 135 break; |
| 136 } |
| 137 } |
130 } | 138 } |
131 return GenericGraphVisit::CONTINUE; | 139 return GenericGraphVisit::CONTINUE; |
132 } | 140 } |
133 | 141 |
134 NodeSet phis; | 142 NodeSet redo; |
135 }; | 143 }; |
136 | 144 |
137 | 145 |
138 class Typer::NarrowVisitor : public Typer::Visitor { | 146 class Typer::NarrowVisitor : public Typer::Visitor { |
139 public: | 147 public: |
140 NarrowVisitor(Typer* typer, MaybeHandle<Context> context) | 148 NarrowVisitor(Typer* typer, MaybeHandle<Context> context) |
141 : Visitor(typer, context) {} | 149 : Visitor(typer, context) {} |
142 | 150 |
143 GenericGraphVisit::Control Pre(Node* node) { | 151 GenericGraphVisit::Control Pre(Node* node) { |
144 if (OperatorProperties::HasValueOutput(node->op())) { | 152 if (OperatorProperties::HasValueOutput(node->op())) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 GenericGraphVisit::Control Post(Node* node) { | 191 GenericGraphVisit::Control Post(Node* node) { |
184 return GenericGraphVisit::REENTER; | 192 return GenericGraphVisit::REENTER; |
185 } | 193 } |
186 }; | 194 }; |
187 | 195 |
188 | 196 |
189 void Typer::Run(Graph* graph, MaybeHandle<Context> context) { | 197 void Typer::Run(Graph* graph, MaybeHandle<Context> context) { |
190 RunVisitor typing(this, context); | 198 RunVisitor typing(this, context); |
191 graph->VisitNodeInputsFromEnd(&typing); | 199 graph->VisitNodeInputsFromEnd(&typing); |
192 // Find least fixpoint. | 200 // Find least fixpoint. |
193 for (NodeSetIter i = typing.phis.begin(); i != typing.phis.end(); ++i) { | 201 for (NodeSetIter i = typing.redo.begin(); i != typing.redo.end(); ++i) { |
194 Widen(graph, *i, context); | 202 Widen(graph, *i, context); |
195 } | 203 } |
196 } | 204 } |
197 | 205 |
198 | 206 |
199 void Typer::Narrow(Graph* graph, Node* start, MaybeHandle<Context> context) { | 207 void Typer::Narrow(Graph* graph, Node* start, MaybeHandle<Context> context) { |
200 NarrowVisitor typing(this, context); | 208 NarrowVisitor typing(this, context); |
201 graph->VisitNodeUsesFrom(start, &typing); | 209 graph->VisitNodeUsesFrom(start, &typing); |
202 } | 210 } |
203 | 211 |
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
876 } | 884 } |
877 | 885 |
878 | 886 |
879 void Typer::DecorateGraph(Graph* graph) { | 887 void Typer::DecorateGraph(Graph* graph) { |
880 graph->AddDecorator(new (zone()) TyperDecorator(this)); | 888 graph->AddDecorator(new (zone()) TyperDecorator(this)); |
881 } | 889 } |
882 | 890 |
883 } | 891 } |
884 } | 892 } |
885 } // namespace v8::internal::compiler | 893 } // namespace v8::internal::compiler |
OLD | NEW |