| Index: src/compiler/typer.cc
|
| diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
|
| index c6d1516339e9cbbf44dd8d945bd008c0fe293d2b..101b31b4be58e2eb98277dda057412cbe40535e5 100644
|
| --- a/src/compiler/typer.cc
|
| +++ b/src/compiler/typer.cc
|
| @@ -70,21 +70,25 @@ class Typer::Visitor : public NullNodeVisitor {
|
| Bounds TypeNode(Node* node) {
|
| switch (node->opcode()) {
|
| #define DECLARE_CASE(x) case IrOpcode::k##x: return Type##x(node);
|
| + DECLARE_CASE(Start)
|
| VALUE_OP_LIST(DECLARE_CASE)
|
| #undef DECLARE_CASE
|
|
|
| #define DECLARE_CASE(x) case IrOpcode::k##x:
|
| - CONTROL_OP_LIST(DECLARE_CASE)
|
| + DECLARE_CASE(End)
|
| + INNER_CONTROL_OP_LIST(DECLARE_CASE)
|
| #undef DECLARE_CASE
|
| break;
|
| }
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
| Type* TypeConstant(Handle<Object> value);
|
|
|
| protected:
|
| #define DECLARE_METHOD(x) inline Bounds Type##x(Node* node);
|
| + DECLARE_METHOD(Start)
|
| VALUE_OP_LIST(DECLARE_METHOD)
|
| #undef DECLARE_METHOD
|
|
|
| @@ -118,12 +122,11 @@ class Typer::RunVisitor : public Typer::Visitor {
|
| phis(NodeSet::key_compare(), NodeSet::allocator_type(typer->zone())) {}
|
|
|
| GenericGraphVisit::Control Post(Node* node) {
|
| - Bounds bounds = TypeNode(node);
|
| - if (node->opcode() == IrOpcode::kPhi) {
|
| - // Remember phis for least fixpoint iteration.
|
| - phis.insert(node);
|
| - } else {
|
| + if (OperatorProperties::HasValueOutput(node->op())) {
|
| + Bounds bounds = TypeNode(node);
|
| NodeProperties::SetBounds(node, bounds);
|
| + // Remember phis for least fixpoint iteration.
|
| + if (node->opcode() == IrOpcode::kPhi) phis.insert(node);
|
| }
|
| return GenericGraphVisit::CONTINUE;
|
| }
|
| @@ -138,13 +141,17 @@ class Typer::NarrowVisitor : public Typer::Visitor {
|
| : Visitor(typer, context) {}
|
|
|
| GenericGraphVisit::Control Pre(Node* node) {
|
| - Bounds previous = NodeProperties::GetBounds(node);
|
| - Bounds bounds = TypeNode(node);
|
| - NodeProperties::SetBounds(node, Bounds::Both(bounds, previous, zone()));
|
| - DCHECK(bounds.Narrows(previous));
|
| - // Stop when nothing changed (but allow reentry in case it does later).
|
| - return previous.Narrows(bounds)
|
| - ? GenericGraphVisit::DEFER : GenericGraphVisit::REENTER;
|
| + if (OperatorProperties::HasValueOutput(node->op())) {
|
| + Bounds previous = NodeProperties::GetBounds(node);
|
| + Bounds bounds = TypeNode(node);
|
| + NodeProperties::SetBounds(node, Bounds::Both(bounds, previous, zone()));
|
| + DCHECK(bounds.Narrows(previous));
|
| + // Stop when nothing changed (but allow re-entry in case it does later).
|
| + return previous.Narrows(bounds)
|
| + ? GenericGraphVisit::DEFER : GenericGraphVisit::REENTER;
|
| + } else {
|
| + return GenericGraphVisit::SKIP;
|
| + }
|
| }
|
|
|
| GenericGraphVisit::Control Post(Node* node) {
|
| @@ -159,14 +166,18 @@ class Typer::WidenVisitor : public Typer::Visitor {
|
| : Visitor(typer, context) {}
|
|
|
| GenericGraphVisit::Control Pre(Node* node) {
|
| - Bounds previous = NodeProperties::GetBounds(node);
|
| - Bounds bounds = TypeNode(node);
|
| - DCHECK(previous.lower->Is(bounds.lower));
|
| - DCHECK(previous.upper->Is(bounds.upper));
|
| - NodeProperties::SetBounds(node, bounds); // TODO(rossberg): Either?
|
| - // Stop when nothing changed (but allow reentry in case it does later).
|
| - return bounds.Narrows(previous)
|
| - ? GenericGraphVisit::DEFER : GenericGraphVisit::REENTER;
|
| + if (OperatorProperties::HasValueOutput(node->op())) {
|
| + Bounds previous = NodeProperties::GetBounds(node);
|
| + Bounds bounds = TypeNode(node);
|
| + DCHECK(previous.lower->Is(bounds.lower));
|
| + DCHECK(previous.upper->Is(bounds.upper));
|
| + NodeProperties::SetBounds(node, bounds); // TODO(rossberg): Either?
|
| + // Stop when nothing changed (but allow re-entry in case it does later).
|
| + return bounds.Narrows(previous)
|
| + ? GenericGraphVisit::DEFER : GenericGraphVisit::REENTER;
|
| + } else {
|
| + return GenericGraphVisit::SKIP;
|
| + }
|
| }
|
|
|
| GenericGraphVisit::Control Post(Node* node) {
|
| @@ -204,7 +215,18 @@ void Typer::Init(Node* node) {
|
| }
|
|
|
|
|
| +// -----------------------------------------------------------------------------
|
| +
|
| +
|
| +// Control operators.
|
| +
|
| +Bounds Typer::Visitor::TypeStart(Node* node) {
|
| + return Bounds(Type::Internal(zone()));
|
| +}
|
| +
|
| +
|
| // Common operators.
|
| +
|
| Bounds Typer::Visitor::TypeParameter(Node* node) {
|
| return Bounds::Unbounded(zone());
|
| }
|
| @@ -256,30 +278,37 @@ Bounds Typer::Visitor::TypePhi(Node* node) {
|
|
|
|
|
| Bounds Typer::Visitor::TypeEffectPhi(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| Bounds Typer::Visitor::TypeControlEffect(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| Bounds Typer::Visitor::TypeValueEffect(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| -Bounds Typer::Visitor::TypeFinish(Node* node) { return OperandType(node, 0); }
|
| +Bounds Typer::Visitor::TypeFinish(Node* node) {
|
| + return OperandType(node, 0);
|
| +}
|
|
|
|
|
| Bounds Typer::Visitor::TypeFrameState(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| Bounds Typer::Visitor::TypeStateValues(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| @@ -424,7 +453,7 @@ Bounds Typer::Visitor::TypeJSToName(Node* node) {
|
|
|
|
|
| Bounds Typer::Visitor::TypeJSToObject(Node* node) {
|
| - return Bounds(Type::None(zone()), Type::Object(zone()));
|
| + return Bounds(Type::None(zone()), Type::Receiver(zone()));
|
| }
|
|
|
|
|
| @@ -458,12 +487,14 @@ Bounds Typer::Visitor::TypeJSLoadNamed(Node* node) {
|
|
|
|
|
| Bounds Typer::Visitor::TypeJSStoreProperty(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| Bounds Typer::Visitor::TypeJSStoreNamed(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| @@ -523,7 +554,8 @@ Bounds Typer::Visitor::TypeJSLoadContext(Node* node) {
|
|
|
|
|
| Bounds Typer::Visitor::TypeJSStoreContext(Node* node) {
|
| - return Bounds(Type::None(zone()));
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| @@ -744,12 +776,14 @@ Bounds Typer::Visitor::TypeLoadElement(Node* node) {
|
|
|
|
|
| Bounds Typer::Visitor::TypeStoreField(Node* node) {
|
| - return Bounds(Type::None());
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
| Bounds Typer::Visitor::TypeStoreElement(Node* node) {
|
| - return Bounds(Type::None());
|
| + UNREACHABLE();
|
| + return Bounds();
|
| }
|
|
|
|
|
|
|