| Index: src/compiler/typer.cc
|
| diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
|
| index 6ef16df97c46264ee39907b37fe91f6e3a859bca..432832e235f1d7f5bac41a1382abfd3cb700c1c8 100644
|
| --- a/src/compiler/typer.cc
|
| +++ b/src/compiler/typer.cc
|
| @@ -29,10 +29,8 @@ class Typer::Decorator final : public GraphDecorator {
|
| Typer* const typer_;
|
| };
|
|
|
| -
|
| Typer::Typer(Isolate* isolate, Graph* graph, Flags flags,
|
| - CompilationDependencies* dependencies,
|
| - Type::FunctionType* function_type)
|
| + CompilationDependencies* dependencies, FunctionType* function_type)
|
| : isolate_(isolate),
|
| graph_(graph),
|
| flags_(flags),
|
| @@ -243,11 +241,10 @@ class Typer::Visitor : public Reducer {
|
| static Type* NumberToInt32(Type*, Typer*);
|
| static Type* NumberToUint32(Type*, Typer*);
|
|
|
| - static Type* JSAddRanger(Type::RangeType*, Type::RangeType*, Typer*);
|
| - static Type* JSSubtractRanger(Type::RangeType*, Type::RangeType*, Typer*);
|
| - static Type* JSMultiplyRanger(Type::RangeType*, Type::RangeType*, Typer*);
|
| - static Type* JSDivideRanger(Type::RangeType*, Type::RangeType*, Typer*);
|
| - static Type* JSModulusRanger(Type::RangeType*, Type::RangeType*, Typer*);
|
| + static Type* JSAddRanger(RangeType*, RangeType*, Typer*);
|
| + static Type* JSSubtractRanger(RangeType*, RangeType*, Typer*);
|
| + static Type* JSDivideRanger(RangeType*, RangeType*, Typer*);
|
| + static Type* JSModulusRanger(RangeType*, RangeType*, Typer*);
|
|
|
| static ComparisonOutcome JSCompareTyper(Type*, Type*, Typer*);
|
|
|
| @@ -513,9 +510,7 @@ Type* Typer::Visitor::NumberToUint32(Type* type, Typer* t) {
|
|
|
| // Control operators.
|
|
|
| -
|
| -Type* Typer::Visitor::TypeStart(Node* node) { return Type::Internal(zone()); }
|
| -
|
| +Type* Typer::Visitor::TypeStart(Node* node) { return Type::Internal(); }
|
|
|
| Type* Typer::Visitor::TypeIfException(Node* node) { return Type::Any(); }
|
|
|
| @@ -524,7 +519,7 @@ Type* Typer::Visitor::TypeIfException(Node* node) { return Type::Any(); }
|
|
|
|
|
| Type* Typer::Visitor::TypeParameter(Node* node) {
|
| - if (Type::FunctionType* function_type = typer_->function_type()) {
|
| + if (FunctionType* function_type = typer_->function_type()) {
|
| int const index = ParameterIndexOf(node->op());
|
| if (index >= 0 && index < function_type->Arity()) {
|
| return function_type->Parameter(index);
|
| @@ -578,7 +573,7 @@ Type* Typer::Visitor::TypeHeapConstant(Node* node) {
|
|
|
|
|
| Type* Typer::Visitor::TypeExternalConstant(Node* node) {
|
| - return Type::Internal(zone());
|
| + return Type::Internal();
|
| }
|
|
|
|
|
| @@ -627,22 +622,15 @@ Type* Typer::Visitor::TypeFinishRegion(Node* node) { return Operand(node, 0); }
|
|
|
| Type* Typer::Visitor::TypeFrameState(Node* node) {
|
| // TODO(rossberg): Ideally FrameState wouldn't have a value output.
|
| - return Type::Internal(zone());
|
| -}
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeStateValues(Node* node) {
|
| - return Type::Internal(zone());
|
| + return Type::Internal();
|
| }
|
|
|
| +Type* Typer::Visitor::TypeStateValues(Node* node) { return Type::Internal(); }
|
|
|
| -Type* Typer::Visitor::TypeObjectState(Node* node) {
|
| - return Type::Internal(zone());
|
| -}
|
| -
|
| +Type* Typer::Visitor::TypeObjectState(Node* node) { return Type::Internal(); }
|
|
|
| Type* Typer::Visitor::TypeTypedStateValues(Node* node) {
|
| - return Type::Internal(zone());
|
| + return Type::Internal();
|
| }
|
|
|
|
|
| @@ -955,9 +943,7 @@ static double array_max(double a[], size_t n) {
|
| return x == 0 ? 0 : x; // -0 -> 0
|
| }
|
|
|
| -
|
| -Type* Typer::Visitor::JSAddRanger(Type::RangeType* lhs, Type::RangeType* rhs,
|
| - Typer* t) {
|
| +Type* Typer::Visitor::JSAddRanger(RangeType* lhs, RangeType* rhs, Typer* t) {
|
| double results[4];
|
| results[0] = lhs->Min() + rhs->Min();
|
| results[1] = lhs->Min() + rhs->Max();
|
| @@ -1003,9 +989,8 @@ Type* Typer::Visitor::JSAddTyper(Type* lhs, Type* rhs, Typer* t) {
|
| return Type::Number();
|
| }
|
|
|
| -
|
| -Type* Typer::Visitor::JSSubtractRanger(Type::RangeType* lhs,
|
| - Type::RangeType* rhs, Typer* t) {
|
| +Type* Typer::Visitor::JSSubtractRanger(RangeType* lhs, RangeType* rhs,
|
| + Typer* t) {
|
| double results[4];
|
| results[0] = lhs->Min() - rhs->Min();
|
| results[1] = lhs->Min() - rhs->Max();
|
| @@ -1042,41 +1027,38 @@ Type* Typer::Visitor::JSSubtractTyper(Type* lhs, Type* rhs, Typer* t) {
|
| }
|
|
|
|
|
| -Type* Typer::Visitor::JSMultiplyRanger(Type::RangeType* lhs,
|
| - Type::RangeType* rhs, Typer* t) {
|
| - double results[4];
|
| - double lmin = lhs->Min();
|
| - double lmax = lhs->Max();
|
| - double rmin = rhs->Min();
|
| - double rmax = rhs->Max();
|
| - results[0] = lmin * rmin;
|
| - results[1] = lmin * rmax;
|
| - results[2] = lmax * rmin;
|
| - results[3] = lmax * rmax;
|
| - // If the result may be nan, we give up on calculating a precise type, because
|
| - // the discontinuity makes it too complicated. Note that even if none of the
|
| - // "results" above is nan, the actual result may still be, so we have to do a
|
| - // different check:
|
| - bool maybe_nan = (lhs->Maybe(t->cache_.kSingletonZero) &&
|
| - (rmin == -V8_INFINITY || rmax == +V8_INFINITY)) ||
|
| - (rhs->Maybe(t->cache_.kSingletonZero) &&
|
| - (lmin == -V8_INFINITY || lmax == +V8_INFINITY));
|
| - if (maybe_nan) return t->cache_.kIntegerOrMinusZeroOrNaN; // Giving up.
|
| - bool maybe_minuszero = (lhs->Maybe(t->cache_.kSingletonZero) && rmin < 0) ||
|
| - (rhs->Maybe(t->cache_.kSingletonZero) && lmin < 0);
|
| - Type* range =
|
| - Type::Range(array_min(results, 4), array_max(results, 4), t->zone());
|
| - return maybe_minuszero ? Type::Union(range, Type::MinusZero(), t->zone())
|
| - : range;
|
| -}
|
| -
|
| -
|
| Type* Typer::Visitor::JSMultiplyTyper(Type* lhs, Type* rhs, Typer* t) {
|
| lhs = Rangify(ToNumber(lhs, t), t);
|
| rhs = Rangify(ToNumber(rhs, t), t);
|
| if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) return Type::NaN();
|
| if (lhs->IsRange() && rhs->IsRange()) {
|
| - return JSMultiplyRanger(lhs->AsRange(), rhs->AsRange(), t);
|
| + double results[4];
|
| + double lmin = lhs->AsRange()->Min();
|
| + double lmax = lhs->AsRange()->Max();
|
| + double rmin = rhs->AsRange()->Min();
|
| + double rmax = rhs->AsRange()->Max();
|
| + results[0] = lmin * rmin;
|
| + results[1] = lmin * rmax;
|
| + results[2] = lmax * rmin;
|
| + results[3] = lmax * rmax;
|
| + // If the result may be nan, we give up on calculating a precise type,
|
| + // because
|
| + // the discontinuity makes it too complicated. Note that even if none of
|
| + // the
|
| + // "results" above is nan, the actual result may still be, so we have to do
|
| + // a
|
| + // different check:
|
| + bool maybe_nan = (lhs->Maybe(t->cache_.kSingletonZero) &&
|
| + (rmin == -V8_INFINITY || rmax == +V8_INFINITY)) ||
|
| + (rhs->Maybe(t->cache_.kSingletonZero) &&
|
| + (lmin == -V8_INFINITY || lmax == +V8_INFINITY));
|
| + if (maybe_nan) return t->cache_.kIntegerOrMinusZeroOrNaN; // Giving up.
|
| + bool maybe_minuszero = (lhs->Maybe(t->cache_.kSingletonZero) && rmin < 0) ||
|
| + (rhs->Maybe(t->cache_.kSingletonZero) && lmin < 0);
|
| + Type* range =
|
| + Type::Range(array_min(results, 4), array_max(results, 4), t->zone());
|
| + return maybe_minuszero ? Type::Union(range, Type::MinusZero(), t->zone())
|
| + : range;
|
| }
|
| return Type::Number();
|
| }
|
| @@ -1095,9 +1077,8 @@ Type* Typer::Visitor::JSDivideTyper(Type* lhs, Type* rhs, Typer* t) {
|
| return maybe_nan ? Type::Number() : Type::OrderedNumber();
|
| }
|
|
|
| -
|
| -Type* Typer::Visitor::JSModulusRanger(Type::RangeType* lhs,
|
| - Type::RangeType* rhs, Typer* t) {
|
| +Type* Typer::Visitor::JSModulusRanger(RangeType* lhs, RangeType* rhs,
|
| + Typer* t) {
|
| double lmin = lhs->Min();
|
| double lmax = lhs->Max();
|
| double rmin = rhs->Min();
|
| @@ -1291,8 +1272,8 @@ Type* Typer::Visitor::TypeJSLoadNamed(Node* node) {
|
| } else if (receiver->IsClass() &&
|
| receiver->AsClass()->Map()->IsJSFunctionMap()) {
|
| Handle<Map> map = receiver->AsClass()->Map();
|
| - return map->has_non_instance_prototype() ? Type::Primitive(zone())
|
| - : Type::Receiver(zone());
|
| + return map->has_non_instance_prototype() ? Type::Primitive()
|
| + : Type::Receiver();
|
| }
|
| }
|
| return Type::Any();
|
| @@ -1340,8 +1321,8 @@ Type* Typer::Visitor::Weaken(Node* node, Type* current_type,
|
| // Only weaken if there is range involved; we should converge quickly
|
| // for all other types (the exception is a union of many constants,
|
| // but we currently do not increase the number of constants in unions).
|
| - Type::RangeType* previous = previous_integer->GetRange();
|
| - Type::RangeType* current = current_integer->GetRange();
|
| + Type* previous = previous_integer->GetRange();
|
| + Type* current = current_integer->GetRange();
|
| if (current == nullptr || previous == nullptr) {
|
| return current_type;
|
| }
|
| @@ -1402,19 +1383,12 @@ Type* Typer::Visitor::TypeJSStoreGlobal(Node* node) {
|
|
|
|
|
| Type* Typer::Visitor::TypeJSDeleteProperty(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeJSHasProperty(Node* node) {
|
| - return Type::Boolean(zone());
|
| + return Type::Boolean();
|
| }
|
|
|
| +Type* Typer::Visitor::TypeJSHasProperty(Node* node) { return Type::Boolean(); }
|
|
|
| -Type* Typer::Visitor::TypeJSInstanceOf(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| +Type* Typer::Visitor::TypeJSInstanceOf(Node* node) { return Type::Boolean(); }
|
|
|
| // JS context operators.
|
|
|
| @@ -1563,7 +1537,7 @@ Type* Typer::Visitor::TypeJSCallRuntime(Node* node) {
|
| case Runtime::kInlineIsFunction:
|
| case Runtime::kInlineIsRegExp:
|
| case Runtime::kInlineIsJSReceiver:
|
| - return Type::Boolean(zone());
|
| + return Type::Boolean();
|
| case Runtime::kInlineDoubleLo:
|
| case Runtime::kInlineDoubleHi:
|
| return Type::Signed32();
|
| @@ -1627,11 +1601,7 @@ Type* Typer::Visitor::TypeJSForInPrepare(Node* node) {
|
| return Type::Tuple(cache_type, cache_array, cache_length, zone());
|
| }
|
|
|
| -
|
| -Type* Typer::Visitor::TypeJSForInDone(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| +Type* Typer::Visitor::TypeJSForInDone(Node* node) { return Type::Boolean(); }
|
|
|
| Type* Typer::Visitor::TypeJSForInStep(Node* node) {
|
| STATIC_ASSERT(Map::EnumLengthBits::kMax <= FixedArray::kMaxLength);
|
| @@ -1653,82 +1623,57 @@ Type* Typer::Visitor::TypeJSStackCheck(Node* node) { return Type::Any(); }
|
|
|
| // Simplified operators.
|
|
|
| -
|
| -Type* Typer::Visitor::TypeBooleanNot(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| +Type* Typer::Visitor::TypeBooleanNot(Node* node) { return Type::Boolean(); }
|
|
|
| Type* Typer::Visitor::TypeBooleanToNumber(Node* node) {
|
| return TypeUnaryOp(node, ToNumber);
|
| }
|
|
|
| +Type* Typer::Visitor::TypeNumberEqual(Node* node) { return Type::Boolean(); }
|
|
|
| -Type* Typer::Visitor::TypeNumberEqual(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeNumberLessThan(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| +Type* Typer::Visitor::TypeNumberLessThan(Node* node) { return Type::Boolean(); }
|
|
|
| Type* Typer::Visitor::TypeNumberLessThanOrEqual(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeNumberAdd(Node* node) { return Type::Number(zone()); }
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeNumberSubtract(Node* node) {
|
| - return Type::Number(zone());
|
| -}
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeNumberMultiply(Node* node) {
|
| - return Type::Number(zone());
|
| + return Type::Boolean();
|
| }
|
|
|
| +Type* Typer::Visitor::TypeNumberAdd(Node* node) { return Type::Number(); }
|
|
|
| -Type* Typer::Visitor::TypeNumberDivide(Node* node) {
|
| - return Type::Number(zone());
|
| -}
|
| +Type* Typer::Visitor::TypeNumberSubtract(Node* node) { return Type::Number(); }
|
|
|
| +Type* Typer::Visitor::TypeNumberMultiply(Node* node) { return Type::Number(); }
|
|
|
| -Type* Typer::Visitor::TypeNumberModulus(Node* node) {
|
| - return Type::Number(zone());
|
| -}
|
| +Type* Typer::Visitor::TypeNumberDivide(Node* node) { return Type::Number(); }
|
|
|
| +Type* Typer::Visitor::TypeNumberModulus(Node* node) { return Type::Number(); }
|
|
|
| Type* Typer::Visitor::TypeNumberBitwiseOr(Node* node) {
|
| - return Type::Signed32(zone());
|
| + return Type::Signed32();
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeNumberBitwiseXor(Node* node) {
|
| - return Type::Signed32(zone());
|
| + return Type::Signed32();
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeNumberBitwiseAnd(Node* node) {
|
| - return Type::Signed32(zone());
|
| + return Type::Signed32();
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeNumberShiftLeft(Node* node) {
|
| - return Type::Signed32(zone());
|
| + return Type::Signed32();
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeNumberShiftRight(Node* node) {
|
| - return Type::Signed32(zone());
|
| + return Type::Signed32();
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeNumberShiftRightLogical(Node* node) {
|
| - return Type::Unsigned32(zone());
|
| + return Type::Unsigned32();
|
| }
|
|
|
|
|
| @@ -1743,7 +1688,7 @@ Type* Typer::Visitor::TypeNumberToUint32(Node* node) {
|
|
|
|
|
| Type* Typer::Visitor::TypeNumberIsHoleNaN(Node* node) {
|
| - return Type::Boolean(zone());
|
| + return Type::Boolean();
|
| }
|
|
|
|
|
| @@ -1765,19 +1710,12 @@ Type* Typer::Visitor::TypeReferenceEqual(Node* node) {
|
| return TypeBinaryOp(node, ReferenceEqualTyper);
|
| }
|
|
|
| +Type* Typer::Visitor::TypeStringEqual(Node* node) { return Type::Boolean(); }
|
|
|
| -Type* Typer::Visitor::TypeStringEqual(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| -
|
| -Type* Typer::Visitor::TypeStringLessThan(Node* node) {
|
| - return Type::Boolean(zone());
|
| -}
|
| -
|
| +Type* Typer::Visitor::TypeStringLessThan(Node* node) { return Type::Boolean(); }
|
|
|
| Type* Typer::Visitor::TypeStringLessThanOrEqual(Node* node) {
|
| - return Type::Boolean(zone());
|
| + return Type::Boolean();
|
| }
|
|
|
|
|
|
|