| Index: src/compiler/typer.cc
|
| diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
|
| index 615b3711a5820c4ba3de34dde9a06aa8daea7735..4d0157b4da96271fdde6797ee0c5bdb5f304ea6e 100644
|
| --- a/src/compiler/typer.cc
|
| +++ b/src/compiler/typer.cc
|
| @@ -43,8 +43,8 @@ Typer::Typer(Isolate* isolate, Graph* graph, Flags flags,
|
|
|
| Type* infinity = Type::Constant(factory->infinity_value(), zone);
|
| Type* minus_infinity = Type::Constant(factory->minus_infinity_value(), zone);
|
| - // TODO(neis): Unfortunately, the infinities created in other places might
|
| - // be different ones (eg the result of NewNumber in TypeNumberConstant).
|
| + // Unfortunately, the infinities created in other places might be different
|
| + // ones (eg the result of NewNumber in TypeNumberConstant).
|
| Type* truncating_to_zero =
|
| Type::Union(Type::Union(infinity, minus_infinity, zone),
|
| Type::MinusZeroOrNaN(), zone);
|
| @@ -534,7 +534,6 @@ Type* Typer::Visitor::NumberTrunc(Type* type, Typer* t) {
|
| }
|
|
|
| Type* Typer::Visitor::NumberToInt32(Type* type, Typer* t) {
|
| - // TODO(neis): DCHECK(type->Is(Type::Number()));
|
| if (type->Is(Type::Signed32())) return type;
|
| if (type->Is(t->cache_.kZeroish)) return t->cache_.kSingletonZero;
|
| if (type->Is(t->signed32ish_)) {
|
| @@ -547,7 +546,6 @@ Type* Typer::Visitor::NumberToInt32(Type* type, Typer* t) {
|
|
|
|
|
| Type* Typer::Visitor::NumberToUint32(Type* type, Typer* t) {
|
| - // TODO(neis): DCHECK(type->Is(Type::Number()));
|
| if (type->Is(Type::Unsigned32())) return type;
|
| if (type->Is(t->cache_.kZeroish)) return t->cache_.kSingletonZero;
|
| if (type->Is(t->unsigned32ish_)) {
|
| @@ -766,7 +764,6 @@ Type* Typer::Visitor::JSEqualTyper(Type* lhs, Type* rhs, Typer* t) {
|
| if (lhs->IsConstant() && rhs->Is(lhs)) {
|
| // Types are equal and are inhabited only by a single semantic value,
|
| // which is not nan due to the earlier check.
|
| - // TODO(neis): Extend this to Range(x,x), MinusZero, ...?
|
| return t->singleton_true_;
|
| }
|
| return Type::Boolean();
|
| @@ -910,7 +907,6 @@ Type* Typer::Visitor::JSBitwiseOrTyper(Type* lhs, Type* rhs, Typer* t) {
|
| max = std::min(max, -1.0);
|
| }
|
| return Type::Range(min, max, t->zone());
|
| - // TODO(neis): Be precise for singleton inputs, here and elsewhere.
|
| }
|
|
|
|
|
| @@ -1085,7 +1081,6 @@ Type* Typer::Visitor::JSAddTyper(Type* lhs, Type* rhs, Typer* t) {
|
| if (lhs->IsRange() && rhs->IsRange()) {
|
| return JSAddRanger(lhs->AsRange(), rhs->AsRange(), t);
|
| }
|
| - // TODO(neis): Deal with numeric bitsets here and elsewhere.
|
| return Type::Number();
|
| }
|
|
|
| @@ -1169,7 +1164,6 @@ Type* Typer::Visitor::JSDivideTyper(Type* lhs, Type* rhs, Typer* t) {
|
| rhs = ToNumber(rhs, t);
|
| if (lhs->Is(Type::NaN()) || rhs->Is(Type::NaN())) return Type::NaN();
|
| // Division is tricky, so all we do is try ruling out nan.
|
| - // TODO(neis): try ruling out -0 as well?
|
| bool maybe_nan =
|
| lhs->Maybe(Type::NaN()) || rhs->Maybe(t->cache_.kZeroish) ||
|
| ((lhs->Min() == -V8_INFINITY || lhs->Max() == +V8_INFINITY) &&
|
| @@ -1854,39 +1848,43 @@ Type* ChangeRepresentation(Type* type, Type* rep, Zone* zone) {
|
|
|
| Type* Typer::Visitor::TypeChangeTaggedSignedToInt32(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Signed32()));
|
| + // TODO(jarin): DCHECK(arg->Is(Type::Signed32()));
|
| + // Many tests fail this check.
|
| return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone());
|
| }
|
|
|
| Type* Typer::Visitor::TypeChangeTaggedToInt32(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Signed32()));
|
| + DCHECK(arg->Is(Type::Signed32()));
|
| return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone());
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeChangeTaggedToUint32(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Unsigned32()));
|
| + DCHECK(arg->Is(Type::Unsigned32()));
|
| return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone());
|
| }
|
|
|
|
|
| Type* Typer::Visitor::TypeChangeTaggedToFloat64(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Number()));
|
| + DCHECK(arg->Is(Type::Number()));
|
| return ChangeRepresentation(arg, Type::UntaggedFloat64(), zone());
|
| }
|
|
|
| Type* Typer::Visitor::TypeTruncateTaggedToFloat64(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::NumberOrUndefined()));
|
| + DCHECK(arg->Is(Type::NumberOrUndefined()));
|
| return ChangeRepresentation(arg, Type::UntaggedFloat64(), zone());
|
| }
|
|
|
| Type* Typer::Visitor::TypeChangeInt31ToTaggedSigned(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Signed31()));
|
| + // TODO(jarin): DCHECK(arg->Is(Type::Signed31()));
|
| + // Some mjsunit/asm and mjsunit/wasm tests fail this check.
|
| + // For instance, asm/int32-umod fails with Signed32/UntaggedIntegral32 in
|
| + // simplified-lowering (after propagation).
|
| Type* rep =
|
| arg->Is(Type::SignedSmall()) ? Type::TaggedSigned() : Type::Tagged();
|
| return ChangeRepresentation(arg, rep, zone());
|
| @@ -1894,35 +1892,38 @@ Type* Typer::Visitor::TypeChangeInt31ToTaggedSigned(Node* node) {
|
|
|
| Type* Typer::Visitor::TypeChangeInt32ToTagged(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Signed32()));
|
| + // TODO(jarin): DCHECK(arg->Is(Type::Signed32()));
|
| + // Two tests fail this check: mjsunit/asm/sqlite3/sqlite-safe-heap and
|
| + // mjsunit/wasm/embenchen/lua_binarytrees. The first one fails with Any/Any in
|
| + // simplified-lowering (after propagation).
|
| Type* rep =
|
| arg->Is(Type::SignedSmall()) ? Type::TaggedSigned() : Type::Tagged();
|
| return ChangeRepresentation(arg, rep, zone());
|
| }
|
|
|
| -
|
| Type* Typer::Visitor::TypeChangeUint32ToTagged(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Unsigned32()));
|
| + // TODO(jarin): DCHECK(arg->Is(Type::Unsigned32()));
|
| + // This fails in benchmarks/octane/mandreel (--turbo).
|
| return ChangeRepresentation(arg, Type::Tagged(), zone());
|
| }
|
|
|
| -
|
| Type* Typer::Visitor::TypeChangeFloat64ToTagged(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): CHECK(arg.upper->Is(Type::Number()));
|
| + // TODO(jarin): DCHECK(arg->Is(Type::Number()));
|
| + // Some (or all) mjsunit/wasm/embenchen/ tests fail this check when run with
|
| + // --turbo and --always-opt.
|
| return ChangeRepresentation(arg, Type::Tagged(), zone());
|
| }
|
|
|
| Type* Typer::Visitor::TypeChangeTaggedToBit(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg.upper->Is(Type::Boolean()));
|
| + DCHECK(arg->Is(Type::Boolean()));
|
| return ChangeRepresentation(arg, Type::UntaggedBit(), zone());
|
| }
|
|
|
| Type* Typer::Visitor::TypeChangeBitToTagged(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg.upper->Is(Type::Boolean()));
|
| return ChangeRepresentation(arg, Type::TaggedPointer(), zone());
|
| }
|
|
|
| @@ -1944,7 +1945,10 @@ Type* Typer::Visitor::TypeCheckedTaggedToFloat64(Node* node) {
|
|
|
| Type* Typer::Visitor::TypeTruncateTaggedToWord32(Node* node) {
|
| Type* arg = Operand(node, 0);
|
| - // TODO(neis): DCHECK(arg->Is(Type::Number()));
|
| + // TODO(jarin): DCHECK(arg->Is(Type::NumberOrUndefined()));
|
| + // Several mjsunit and cctest tests fail this check. For instance,
|
| + // mjsunit/compiler/regress-607493 fails with Any/Any in simplified-lowering
|
| + // (after propagation).
|
| return ChangeRepresentation(arg, Type::UntaggedIntegral32(), zone());
|
| }
|
|
|
|
|