| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| index 7261a4f78491ee681f21afa169fa07dbb1808d4a..c2f18e5ff96b87faecc979e4269ebde9f96c1e68 100644
|
| --- a/src/compiler/simplified-lowering.cc
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -357,17 +357,25 @@ class RepresentationSelector {
|
| Type* type = info->feedback_type();
|
| Type* new_type = type;
|
|
|
| + // For any non-phi node just wait until we get all inputs typed. We only
|
| + // allow untyped inputs for phi nodes because phis are the only places
|
| + // where cycles need to be broken.
|
| + if (node->opcode() != IrOpcode::kPhi) {
|
| + for (int i = 0; i < node->op()->ValueInputCount(); i++) {
|
| + if (GetInfo(node->InputAt(i))->feedback_type() == nullptr) {
|
| + return false;
|
| + }
|
| + }
|
| + }
|
| +
|
| switch (node->opcode()) {
|
| case IrOpcode::kSpeculativeNumberAdd: {
|
| - Type* lhs = FeedbackTypeOf(node->InputAt(0));
|
| - Type* rhs = FeedbackTypeOf(node->InputAt(1));
|
| - if (lhs->Is(Type::None()) || rhs->Is(Type::None())) return false;
|
| // TODO(jarin) The ToNumber conversion is too conservative here,
|
| // e.g. it will treat true as 1 even though the number check will
|
| // fail on a boolean. OperationTyper should have a function that
|
| // computes a more precise type.
|
| - lhs = op_typer_.ToNumber(lhs);
|
| - rhs = op_typer_.ToNumber(rhs);
|
| + Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0)));
|
| + Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1)));
|
| Type* static_type = op_typer_.NumericAdd(lhs, rhs);
|
| if (info->type_check() == TypeCheckKind::kNone) {
|
| new_type = static_type;
|
| @@ -379,15 +387,12 @@ class RepresentationSelector {
|
| }
|
|
|
| case IrOpcode::kSpeculativeNumberSubtract: {
|
| - Type* lhs = FeedbackTypeOf(node->InputAt(0));
|
| - Type* rhs = FeedbackTypeOf(node->InputAt(1));
|
| - if (lhs->Is(Type::None()) || rhs->Is(Type::None())) return false;
|
| // TODO(jarin) The ToNumber conversion is too conservative here,
|
| // e.g. it will treat true as 1 even though the number check will
|
| // fail on a boolean. OperationTyper should have a function that
|
| // computes a more precise type.
|
| - lhs = op_typer_.ToNumber(lhs);
|
| - rhs = op_typer_.ToNumber(rhs);
|
| + Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0)));
|
| + Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1)));
|
| Type* static_type = op_typer_.NumericSubtract(lhs, rhs);
|
| if (info->type_check() == TypeCheckKind::kNone) {
|
| new_type = static_type;
|
| @@ -399,15 +404,12 @@ class RepresentationSelector {
|
| }
|
|
|
| case IrOpcode::kSpeculativeNumberMultiply: {
|
| - Type* lhs = FeedbackTypeOf(node->InputAt(0));
|
| - Type* rhs = FeedbackTypeOf(node->InputAt(1));
|
| - if (lhs->Is(Type::None()) || rhs->Is(Type::None())) return false;
|
| // TODO(jarin) The ToNumber conversion is too conservative here,
|
| // e.g. it will treat true as 1 even though the number check will
|
| // fail on a boolean. OperationTyper should have a function that
|
| // computes a more precise type.
|
| - lhs = op_typer_.ToNumber(lhs);
|
| - rhs = op_typer_.ToNumber(rhs);
|
| + Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0)));
|
| + Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1)));
|
| Type* static_type = op_typer_.NumericMultiply(lhs, rhs);
|
| if (info->type_check() == TypeCheckKind::kNone) {
|
| new_type = static_type;
|
| @@ -419,15 +421,12 @@ class RepresentationSelector {
|
| }
|
|
|
| case IrOpcode::kSpeculativeNumberDivide: {
|
| - Type* lhs = FeedbackTypeOf(node->InputAt(0));
|
| - Type* rhs = FeedbackTypeOf(node->InputAt(1));
|
| - if (lhs->Is(Type::None()) || rhs->Is(Type::None())) return false;
|
| // TODO(jarin) The ToNumber conversion is too conservative here,
|
| // e.g. it will treat true as 1 even though the number check will
|
| // fail on a boolean. OperationTyper should have a function that
|
| // computes a more precise type.
|
| - lhs = op_typer_.ToNumber(lhs);
|
| - rhs = op_typer_.ToNumber(rhs);
|
| + Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0)));
|
| + Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1)));
|
| Type* static_type = op_typer_.NumericDivide(lhs, rhs);
|
| if (info->type_check() == TypeCheckKind::kNone) {
|
| new_type = static_type;
|
| @@ -439,15 +438,12 @@ class RepresentationSelector {
|
| }
|
|
|
| case IrOpcode::kSpeculativeNumberModulus: {
|
| - Type* lhs = FeedbackTypeOf(node->InputAt(0));
|
| - Type* rhs = FeedbackTypeOf(node->InputAt(1));
|
| - if (lhs->Is(Type::None()) || rhs->Is(Type::None())) return false;
|
| // TODO(jarin) The ToNumber conversion is too conservative here,
|
| // e.g. it will treat true as 1 even though the number check will
|
| // fail on a boolean. OperationTyper should have a function that
|
| // computes a more precise type.
|
| - lhs = op_typer_.ToNumber(lhs);
|
| - rhs = op_typer_.ToNumber(rhs);
|
| + Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0)));
|
| + Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1)));
|
| Type* static_type = op_typer_.NumericModulus(lhs, rhs);
|
| if (info->type_check() == TypeCheckKind::kNone) {
|
| new_type = static_type;
|
| @@ -945,7 +941,6 @@ class RepresentationSelector {
|
| }
|
|
|
| MachineSemantic DeoptValueSemanticOf(Type* type) {
|
| - CHECK(!type->Is(Type::None()));
|
| // We only need signedness to do deopt correctly.
|
| if (type->Is(Type::Signed32())) {
|
| return MachineSemantic::kInt32;
|
|
|