| 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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 GenericGraphVisit::Control Post(Node* node) { |
| 255 if (OperatorProperties::HasValueOutput(node->op()) && | 255 if (node->op()->ValueOutputCount() > 0 && !NodeProperties::IsTyped(node)) { |
| 256 !NodeProperties::IsTyped(node)) { | |
| 257 Bounds bounds = TypeNode(node); | 256 Bounds bounds = TypeNode(node); |
| 258 NodeProperties::SetBounds(node, bounds); | 257 NodeProperties::SetBounds(node, bounds); |
| 259 // Remember incompletely typed nodes for least fixpoint iteration. | 258 // Remember incompletely typed nodes for least fixpoint iteration. |
| 260 if (!NodeProperties::AllValueInputsAreTyped(node)) redo.insert(node); | 259 if (!NodeProperties::AllValueInputsAreTyped(node)) redo.insert(node); |
| 261 } | 260 } |
| 262 return GenericGraphVisit::CONTINUE; | 261 return GenericGraphVisit::CONTINUE; |
| 263 } | 262 } |
| 264 | 263 |
| 265 NodeSet redo; | 264 NodeSet redo; |
| 266 }; | 265 }; |
| 267 | 266 |
| 268 | 267 |
| 269 class Typer::NarrowVisitor : public Typer::Visitor { | 268 class Typer::NarrowVisitor : public Typer::Visitor { |
| 270 public: | 269 public: |
| 271 explicit NarrowVisitor(Typer* typer) : Visitor(typer) {} | 270 explicit NarrowVisitor(Typer* typer) : Visitor(typer) {} |
| 272 | 271 |
| 273 GenericGraphVisit::Control Pre(Node* node) { | 272 GenericGraphVisit::Control Pre(Node* node) { |
| 274 if (OperatorProperties::HasValueOutput(node->op())) { | 273 if (node->op()->ValueOutputCount() > 0) { |
| 275 Bounds previous = NodeProperties::GetBounds(node); | 274 Bounds previous = NodeProperties::GetBounds(node); |
| 276 Bounds current = TypeNode(node); | 275 Bounds current = TypeNode(node); |
| 277 NodeProperties::SetBounds(node, Bounds::Both(current, previous, zone())); | 276 NodeProperties::SetBounds(node, Bounds::Both(current, previous, zone())); |
| 278 DCHECK(current.Narrows(previous)); | 277 DCHECK(current.Narrows(previous)); |
| 279 // Stop when nothing changed (but allow re-entry in case it does later). | 278 // Stop when nothing changed (but allow re-entry in case it does later). |
| 280 return previous.Narrows(current) ? GenericGraphVisit::DEFER | 279 return previous.Narrows(current) ? GenericGraphVisit::DEFER |
| 281 : GenericGraphVisit::REENTER; | 280 : GenericGraphVisit::REENTER; |
| 282 } else { | 281 } else { |
| 283 return GenericGraphVisit::SKIP; | 282 return GenericGraphVisit::SKIP; |
| 284 } | 283 } |
| 285 } | 284 } |
| 286 | 285 |
| 287 GenericGraphVisit::Control Post(Node* node) { | 286 GenericGraphVisit::Control Post(Node* node) { |
| 288 return GenericGraphVisit::REENTER; | 287 return GenericGraphVisit::REENTER; |
| 289 } | 288 } |
| 290 }; | 289 }; |
| 291 | 290 |
| 292 | 291 |
| 293 class Typer::WidenVisitor : public Typer::Visitor { | 292 class Typer::WidenVisitor : public Typer::Visitor { |
| 294 public: | 293 public: |
| 295 explicit WidenVisitor(Typer* typer) : Visitor(typer) {} | 294 explicit WidenVisitor(Typer* typer) : Visitor(typer) {} |
| 296 | 295 |
| 297 GenericGraphVisit::Control Pre(Node* node) { | 296 GenericGraphVisit::Control Pre(Node* node) { |
| 298 if (OperatorProperties::HasValueOutput(node->op())) { | 297 if (node->op()->ValueOutputCount() > 0) { |
| 299 Bounds previous = BoundsOrNone(node); | 298 Bounds previous = BoundsOrNone(node); |
| 300 Bounds current = TypeNode(node); | 299 Bounds current = TypeNode(node); |
| 301 | 300 |
| 302 // Speed up termination in the presence of range types: | 301 // Speed up termination in the presence of range types: |
| 303 current.upper = Weaken(current.upper, previous.upper); | 302 current.upper = Weaken(current.upper, previous.upper); |
| 304 current.lower = Weaken(current.lower, previous.lower); | 303 current.lower = Weaken(current.lower, previous.lower); |
| 305 | 304 |
| 306 DCHECK(previous.lower->Is(current.lower)); | 305 DCHECK(previous.lower->Is(current.lower)); |
| 307 DCHECK(previous.upper->Is(current.upper)); | 306 DCHECK(previous.upper->Is(current.upper)); |
| 308 | 307 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 333 } | 332 } |
| 334 | 333 |
| 335 | 334 |
| 336 void Typer::Narrow(Node* start) { | 335 void Typer::Narrow(Node* start) { |
| 337 NarrowVisitor typing(this); | 336 NarrowVisitor typing(this); |
| 338 graph_->VisitNodeUsesFrom(start, &typing); | 337 graph_->VisitNodeUsesFrom(start, &typing); |
| 339 } | 338 } |
| 340 | 339 |
| 341 | 340 |
| 342 void Typer::Decorator::Decorate(Node* node) { | 341 void Typer::Decorator::Decorate(Node* node) { |
| 343 if (OperatorProperties::HasValueOutput(node->op())) { | 342 if (node->op()->ValueOutputCount() > 0) { |
| 344 // Only eagerly type-decorate nodes with known input types. | 343 // Only eagerly type-decorate nodes with known input types. |
| 345 // Other cases will generally require a proper fixpoint iteration with Run. | 344 // Other cases will generally require a proper fixpoint iteration with Run. |
| 346 bool is_typed = NodeProperties::IsTyped(node); | 345 bool is_typed = NodeProperties::IsTyped(node); |
| 347 if (is_typed || NodeProperties::AllValueInputsAreTyped(node)) { | 346 if (is_typed || NodeProperties::AllValueInputsAreTyped(node)) { |
| 348 Visitor typing(typer_); | 347 Visitor typing(typer_); |
| 349 Bounds bounds = typing.TypeNode(node); | 348 Bounds bounds = typing.TypeNode(node); |
| 350 if (is_typed) { | 349 if (is_typed) { |
| 351 bounds = | 350 bounds = |
| 352 Bounds::Both(bounds, NodeProperties::GetBounds(node), typer_->zone()); | 351 Bounds::Both(bounds, NodeProperties::GetBounds(node), typer_->zone()); |
| 353 } | 352 } |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 return Bounds(Type::None(zone()), Type::Internal(zone())); | 533 return Bounds(Type::None(zone()), Type::Internal(zone())); |
| 535 } | 534 } |
| 536 | 535 |
| 537 | 536 |
| 538 Bounds Typer::Visitor::TypeSelect(Node* node) { | 537 Bounds Typer::Visitor::TypeSelect(Node* node) { |
| 539 return Bounds::Either(Operand(node, 1), Operand(node, 2), zone()); | 538 return Bounds::Either(Operand(node, 1), Operand(node, 2), zone()); |
| 540 } | 539 } |
| 541 | 540 |
| 542 | 541 |
| 543 Bounds Typer::Visitor::TypePhi(Node* node) { | 542 Bounds Typer::Visitor::TypePhi(Node* node) { |
| 544 int arity = OperatorProperties::GetValueInputCount(node->op()); | 543 int arity = node->op()->ValueInputCount(); |
| 545 Bounds bounds = Operand(node, 0); | 544 Bounds bounds = Operand(node, 0); |
| 546 for (int i = 1; i < arity; ++i) { | 545 for (int i = 1; i < arity; ++i) { |
| 547 bounds = Bounds::Either(bounds, Operand(node, i), zone()); | 546 bounds = Bounds::Either(bounds, Operand(node, i), zone()); |
| 548 } | 547 } |
| 549 return bounds; | 548 return bounds; |
| 550 } | 549 } |
| 551 | 550 |
| 552 | 551 |
| 553 Bounds Typer::Visitor::TypeEffectPhi(Node* node) { | 552 Bounds Typer::Visitor::TypeEffectPhi(Node* node) { |
| 554 UNREACHABLE(); | 553 UNREACHABLE(); |
| (...skipping 1325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1880 return typer_->float64_array_fun_; | 1879 return typer_->float64_array_fun_; |
| 1881 } | 1880 } |
| 1882 } | 1881 } |
| 1883 } | 1882 } |
| 1884 return Type::Constant(value, zone()); | 1883 return Type::Constant(value, zone()); |
| 1885 } | 1884 } |
| 1886 | 1885 |
| 1887 } | 1886 } |
| 1888 } | 1887 } |
| 1889 } // namespace v8::internal::compiler | 1888 } // namespace v8::internal::compiler |
| OLD | NEW |