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/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
7 #include "src/compiler/js-operator.h" | 7 #include "src/compiler/js-operator.h" |
8 #include "src/compiler/node.h" | 8 #include "src/compiler/node.h" |
9 #include "src/compiler/node-properties-inl.h" | 9 #include "src/compiler/node-properties-inl.h" |
10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 static Type* JSCallFunctionTyper(Type*, Typer*); | 244 static Type* JSCallFunctionTyper(Type*, Typer*); |
245 }; | 245 }; |
246 | 246 |
247 | 247 |
248 class Typer::RunVisitor : public Typer::Visitor { | 248 class Typer::RunVisitor : public Typer::Visitor { |
249 public: | 249 public: |
250 explicit RunVisitor(Typer* typer) | 250 explicit RunVisitor(Typer* typer) |
251 : Visitor(typer), | 251 : Visitor(typer), |
252 redo(NodeSet::key_compare(), NodeSet::allocator_type(typer->zone())) {} | 252 redo(NodeSet::key_compare(), NodeSet::allocator_type(typer->zone())) {} |
253 | 253 |
254 GenericGraphVisit::Control Post(Node* node) { | 254 void Post(Node* node) { |
255 if (node->op()->ValueOutputCount() > 0) { | 255 if (node->op()->ValueOutputCount() > 0) { |
256 Bounds bounds = TypeNode(node); | 256 Bounds bounds = TypeNode(node); |
257 NodeProperties::SetBounds(node, bounds); | 257 NodeProperties::SetBounds(node, bounds); |
258 // Remember incompletely typed nodes for least fixpoint iteration. | 258 // Remember incompletely typed nodes for least fixpoint iteration. |
259 if (!NodeProperties::AllValueInputsAreTyped(node)) redo.insert(node); | 259 if (!NodeProperties::AllValueInputsAreTyped(node)) redo.insert(node); |
260 } | 260 } |
261 return GenericGraphVisit::CONTINUE; | |
262 } | 261 } |
263 | 262 |
264 NodeSet redo; | 263 NodeSet redo; |
265 }; | 264 }; |
266 | 265 |
267 | 266 |
268 class Typer::NarrowVisitor : public Typer::Visitor { | |
269 public: | |
270 explicit NarrowVisitor(Typer* typer) : Visitor(typer) {} | |
271 | |
272 GenericGraphVisit::Control Pre(Node* node) { | |
273 if (node->op()->ValueOutputCount() > 0) { | |
274 Bounds previous = NodeProperties::GetBounds(node); | |
275 Bounds current = TypeNode(node); | |
276 NodeProperties::SetBounds(node, Bounds::Both(current, previous, zone())); | |
277 DCHECK(current.Narrows(previous)); | |
278 // Stop when nothing changed (but allow re-entry in case it does later). | |
279 return previous.Narrows(current) ? GenericGraphVisit::DEFER | |
280 : GenericGraphVisit::REENTER; | |
281 } else { | |
282 return GenericGraphVisit::SKIP; | |
283 } | |
284 } | |
285 | |
286 GenericGraphVisit::Control Post(Node* node) { | |
287 return GenericGraphVisit::REENTER; | |
288 } | |
289 }; | |
290 | |
291 | |
292 class Typer::WidenVisitor : public Typer::Visitor { | 267 class Typer::WidenVisitor : public Typer::Visitor { |
293 public: | 268 public: |
294 explicit WidenVisitor(Typer* typer) | 269 explicit WidenVisitor(Typer* typer) |
295 : Visitor(typer), | 270 : Visitor(typer), |
296 local_zone_(zone()->isolate()), | 271 local_zone_(zone()->isolate()), |
297 enabled_(graph()->NodeCount(), true, &local_zone_), | 272 enabled_(graph()->NodeCount(), true, &local_zone_), |
298 queue_(&local_zone_) {} | 273 queue_(&local_zone_) {} |
299 | 274 |
300 void Run(NodeSet* nodes) { | 275 void Run(NodeSet* nodes) { |
301 // Queue all the roots. | 276 // Queue all the roots. |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 | 329 |
355 void Typer::Run() { | 330 void Typer::Run() { |
356 RunVisitor typing(this); | 331 RunVisitor typing(this); |
357 graph_->VisitNodeInputsFromEnd(&typing); | 332 graph_->VisitNodeInputsFromEnd(&typing); |
358 // Find least fixpoint. | 333 // Find least fixpoint. |
359 WidenVisitor widen(this); | 334 WidenVisitor widen(this); |
360 widen.Run(&typing.redo); | 335 widen.Run(&typing.redo); |
361 } | 336 } |
362 | 337 |
363 | 338 |
364 void Typer::Narrow(Node* start) { | |
365 NarrowVisitor typing(this); | |
366 graph_->VisitNodeUsesFrom(start, &typing); | |
367 } | |
368 | |
369 | |
370 void Typer::Decorator::Decorate(Node* node) { | 339 void Typer::Decorator::Decorate(Node* node) { |
371 if (node->op()->ValueOutputCount() > 0) { | 340 if (node->op()->ValueOutputCount() > 0) { |
372 // Only eagerly type-decorate nodes with known input types. | 341 // Only eagerly type-decorate nodes with known input types. |
373 // Other cases will generally require a proper fixpoint iteration with Run. | 342 // Other cases will generally require a proper fixpoint iteration with Run. |
374 bool is_typed = NodeProperties::IsTyped(node); | 343 bool is_typed = NodeProperties::IsTyped(node); |
375 if (is_typed || NodeProperties::AllValueInputsAreTyped(node)) { | 344 if (is_typed || NodeProperties::AllValueInputsAreTyped(node)) { |
376 Visitor typing(typer_); | 345 Visitor typing(typer_); |
377 Bounds bounds = typing.TypeNode(node); | 346 Bounds bounds = typing.TypeNode(node); |
378 if (is_typed) { | 347 if (is_typed) { |
379 bounds = | 348 bounds = |
(...skipping 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1908 return typer_->float64_array_fun_; | 1877 return typer_->float64_array_fun_; |
1909 } | 1878 } |
1910 } | 1879 } |
1911 } | 1880 } |
1912 return Type::Constant(value, zone()); | 1881 return Type::Constant(value, zone()); |
1913 } | 1882 } |
1914 | 1883 |
1915 } | 1884 } |
1916 } | 1885 } |
1917 } // namespace v8::internal::compiler | 1886 } // namespace v8::internal::compiler |
OLD | NEW |