| Index: src/compiler/types.cc
|
| diff --git a/src/compiler/types.cc b/src/compiler/types.cc
|
| index b7b2702000ef526342ebb53bf910b13e9e1273c0..1a1537b5193544e17435543be3ee7ce81de63870 100644
|
| --- a/src/compiler/types.cc
|
| +++ b/src/compiler/types.cc
|
| @@ -119,9 +119,9 @@ Type::bitset BitsetType::Glb(Type* type) {
|
| } else if (type->IsRange()) {
|
| bitset glb = SEMANTIC(
|
| BitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max()));
|
| - return glb | REPRESENTATION(type->BitsetLub());
|
| + return glb;
|
| } else {
|
| - return type->Representation();
|
| + return kNone;
|
| }
|
| }
|
|
|
| @@ -185,10 +185,10 @@ Type::bitset BitsetType::Lub(i::Map* map) {
|
| map == heap->arguments_marker_map() ||
|
| map == heap->optimized_out_map() ||
|
| map == heap->stale_register_map());
|
| - return kOtherInternal & kTaggedPointer;
|
| + return kOtherInternal;
|
| }
|
| case HEAP_NUMBER_TYPE:
|
| - return kNumber & kTaggedPointer;
|
| + return kNumber;
|
| case SIMD128_VALUE_TYPE:
|
| return kSimd;
|
| case JS_OBJECT_TYPE:
|
| @@ -242,10 +242,10 @@ Type::bitset BitsetType::Lub(i::Map* map) {
|
| case CODE_TYPE:
|
| case PROPERTY_CELL_TYPE:
|
| case MODULE_TYPE:
|
| - return kOtherInternal & kTaggedPointer;
|
| + return kOtherInternal;
|
|
|
| // Remaining instance types are unsupported for now. If any of them do
|
| - // require bit set types, they should get kOtherInternal & kTaggedPointer.
|
| + // require bit set types, they should get kOtherInternal.
|
| case MUTABLE_HEAP_NUMBER_TYPE:
|
| case FREE_SPACE_TYPE:
|
| #define FIXED_TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
|
| @@ -282,8 +282,7 @@ Type::bitset BitsetType::Lub(i::Map* map) {
|
| Type::bitset BitsetType::Lub(i::Object* value) {
|
| DisallowHeapAllocation no_allocation;
|
| if (value->IsNumber()) {
|
| - return Lub(value->Number()) &
|
| - (value->IsSmi() ? kTaggedSigned : kTaggedPointer);
|
| + return Lub(value->Number());
|
| }
|
| return Lub(i::HeapObject::cast(value)->map());
|
| }
|
| @@ -419,10 +418,6 @@ bool Type::SimplyEquals(Type* that) {
|
| return false;
|
| }
|
|
|
| -Type::bitset Type::Representation() {
|
| - return REPRESENTATION(this->BitsetLub());
|
| -}
|
| -
|
| // Check if [this] <= [that].
|
| bool Type::SlowIs(Type* that) {
|
| DisallowHeapAllocation no_allocation;
|
| @@ -436,11 +431,6 @@ bool Type::SlowIs(Type* that) {
|
| return BitsetType::Is(this->AsBitset(), that->BitsetGlb());
|
| }
|
|
|
| - // Check the representations.
|
| - if (!BitsetType::Is(Representation(), that->Representation())) {
|
| - return false;
|
| - }
|
| -
|
| // Check the semantic part.
|
| return SemanticIs(that);
|
| }
|
| @@ -622,25 +612,15 @@ Type* Type::Intersect(Type* type1, Type* type2, Zone* zone) {
|
|
|
| // Slow case: create union.
|
|
|
| - // Figure out the representation of the result first.
|
| - // The rest of the method should not change this representation and
|
| - // it should not make any decisions based on representations (i.e.,
|
| - // it should only use the semantic part of types).
|
| - const bitset representation =
|
| - type1->Representation() & type2->Representation();
|
| -
|
| // Semantic subtyping check - this is needed for consistency with the
|
| - // semi-fast case above - we should behave the same way regardless of
|
| - // representations. Intersection with a universal bitset should only update
|
| - // the representations.
|
| + // semi-fast case above.
|
| if (type1->SemanticIs(type2)) {
|
| type2 = Any();
|
| } else if (type2->SemanticIs(type1)) {
|
| type1 = Any();
|
| }
|
|
|
| - bitset bits =
|
| - SEMANTIC(type1->BitsetGlb() & type2->BitsetGlb()) | representation;
|
| + bitset bits = SEMANTIC(type1->BitsetGlb() & type2->BitsetGlb());
|
| int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1;
|
| int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1;
|
| if (!AddIsSafe(size1, size2)) return Any();
|
| @@ -660,8 +640,7 @@ Type* Type::Intersect(Type* type1, Type* type2, Zone* zone) {
|
| // If the range is not empty, then insert it into the union and
|
| // remove the number bits from the bitset.
|
| if (!lims.IsEmpty()) {
|
| - size = UpdateRange(RangeType::New(lims, representation, zone), result, size,
|
| - zone);
|
| + size = UpdateRange(RangeType::New(lims, zone), result, size, zone);
|
|
|
| // Remove the number bits.
|
| bitset number_bits = BitsetType::NumberBits(bits);
|
| @@ -806,7 +785,7 @@ Type* Type::NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone) {
|
| if (bitset_max > range_max) {
|
| range_max = bitset_max;
|
| }
|
| - return RangeType::New(range_min, range_max, BitsetType::kNone, zone);
|
| + return RangeType::New(range_min, range_max, zone);
|
| }
|
|
|
| Type* Type::Union(Type* type1, Type* type2, Zone* zone) {
|
| @@ -823,13 +802,6 @@ Type* Type::Union(Type* type1, Type* type2, Zone* zone) {
|
| if (type1->Is(type2)) return type2;
|
| if (type2->Is(type1)) return type1;
|
|
|
| - // Figure out the representation of the result.
|
| - // The rest of the method should not change this representation and
|
| - // it should not make any decisions based on representations (i.e.,
|
| - // it should only use the semantic part of types).
|
| - const bitset representation =
|
| - type1->Representation() | type2->Representation();
|
| -
|
| // Slow case: create union.
|
| int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1;
|
| int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1;
|
| @@ -852,14 +824,14 @@ Type* Type::Union(Type* type1, Type* type2, Zone* zone) {
|
| RangeType::Limits lims =
|
| RangeType::Limits::Union(RangeType::Limits(range1->AsRange()),
|
| RangeType::Limits(range2->AsRange()));
|
| - Type* union_range = RangeType::New(lims, representation, zone);
|
| + Type* union_range = RangeType::New(lims, zone);
|
| range = NormalizeRangeAndBitset(union_range, &new_bitset, zone);
|
| } else if (range1 != NULL) {
|
| range = NormalizeRangeAndBitset(range1, &new_bitset, zone);
|
| } else if (range2 != NULL) {
|
| range = NormalizeRangeAndBitset(range2, &new_bitset, zone);
|
| }
|
| - new_bitset = SEMANTIC(new_bitset) | representation;
|
| + new_bitset = SEMANTIC(new_bitset);
|
| Type* bits = BitsetType::New(new_bitset);
|
| result->Set(size++, bits);
|
| if (!range->IsNone()) result->Set(size++, range);
|
| @@ -897,14 +869,9 @@ Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) {
|
| bitset bits = unioned->Get(0)->AsBitset();
|
| // If the union only consists of a range, we can get rid of the union.
|
| if (size == 2 && SEMANTIC(bits) == BitsetType::kNone) {
|
| - bitset representation = REPRESENTATION(bits);
|
| - if (representation == unioned->Get(1)->Representation()) {
|
| - return unioned->Get(1);
|
| - }
|
| if (unioned->Get(1)->IsRange()) {
|
| return RangeType::New(unioned->Get(1)->AsRange()->Min(),
|
| - unioned->Get(1)->AsRange()->Max(),
|
| - unioned->Get(0)->AsBitset(), zone);
|
| + unioned->Get(1)->AsRange()->Max(), zone);
|
| }
|
| }
|
| unioned->Shrink(size);
|
| @@ -916,11 +883,6 @@ Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) {
|
| // Component extraction
|
|
|
| // static
|
| -Type* Type::Representation(Type* t, Zone* zone) {
|
| - return BitsetType::New(t->Representation());
|
| -}
|
| -
|
| -// static
|
| Type* Type::Semantic(Type* t, Zone* zone) {
|
| return Intersect(t, BitsetType::New(BitsetType::kSemantic), zone);
|
| }
|
| @@ -994,14 +956,6 @@ void Type::Iterator<T>::Advance() {
|
|
|
| const char* BitsetType::Name(bitset bits) {
|
| switch (bits) {
|
| - case REPRESENTATION(kAny):
|
| - return "Any";
|
| -#define RETURN_NAMED_REPRESENTATION_TYPE(type, value) \
|
| - case REPRESENTATION(k##type): \
|
| - return #type;
|
| - REPRESENTATION_BITSET_TYPE_LIST(RETURN_NAMED_REPRESENTATION_TYPE)
|
| -#undef RETURN_NAMED_REPRESENTATION_TYPE
|
| -
|
| #define RETURN_NAMED_SEMANTIC_TYPE(type, value) \
|
| case SEMANTIC(k##type): \
|
| return #type;
|
| @@ -1025,10 +979,6 @@ void BitsetType::Print(std::ostream& os, // NOLINT
|
|
|
| // clang-format off
|
| static const bitset named_bitsets[] = {
|
| -#define BITSET_CONSTANT(type, value) REPRESENTATION(k##type),
|
| - REPRESENTATION_BITSET_TYPE_LIST(BITSET_CONSTANT)
|
| -#undef BITSET_CONSTANT
|
| -
|
| #define BITSET_CONSTANT(type, value) SEMANTIC(k##type),
|
| INTERNAL_BITSET_TYPE_LIST(BITSET_CONSTANT)
|
| SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT)
|
| @@ -1051,43 +1001,37 @@ void BitsetType::Print(std::ostream& os, // NOLINT
|
| os << ")";
|
| }
|
|
|
| -void Type::PrintTo(std::ostream& os, PrintDimension dim) {
|
| +void Type::PrintTo(std::ostream& os) {
|
| DisallowHeapAllocation no_allocation;
|
| - if (dim != REPRESENTATION_DIM) {
|
| - if (this->IsBitset()) {
|
| - BitsetType::Print(os, SEMANTIC(this->AsBitset()));
|
| - } else if (this->IsConstant()) {
|
| - os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")";
|
| - } else if (this->IsRange()) {
|
| - std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed);
|
| - std::streamsize saved_precision = os.precision(0);
|
| - os << "Range(" << this->AsRange()->Min() << ", " << this->AsRange()->Max()
|
| - << ")";
|
| - os.flags(saved_flags);
|
| - os.precision(saved_precision);
|
| - } else if (this->IsUnion()) {
|
| - os << "(";
|
| - for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) {
|
| - Type* type_i = this->AsUnion()->Get(i);
|
| - if (i > 0) os << " | ";
|
| - type_i->PrintTo(os, dim);
|
| - }
|
| - os << ")";
|
| - } else if (this->IsTuple()) {
|
| - os << "<";
|
| - for (int i = 0, n = this->AsTuple()->Arity(); i < n; ++i) {
|
| - Type* type_i = this->AsTuple()->Element(i);
|
| - if (i > 0) os << ", ";
|
| - type_i->PrintTo(os, dim);
|
| - }
|
| - os << ">";
|
| - } else {
|
| - UNREACHABLE();
|
| + if (this->IsBitset()) {
|
| + BitsetType::Print(os, SEMANTIC(this->AsBitset()));
|
| + } else if (this->IsConstant()) {
|
| + os << "Constant(" << Brief(*this->AsConstant()->Value()) << ")";
|
| + } else if (this->IsRange()) {
|
| + std::ostream::fmtflags saved_flags = os.setf(std::ios::fixed);
|
| + std::streamsize saved_precision = os.precision(0);
|
| + os << "Range(" << this->AsRange()->Min() << ", " << this->AsRange()->Max()
|
| + << ")";
|
| + os.flags(saved_flags);
|
| + os.precision(saved_precision);
|
| + } else if (this->IsUnion()) {
|
| + os << "(";
|
| + for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) {
|
| + Type* type_i = this->AsUnion()->Get(i);
|
| + if (i > 0) os << " | ";
|
| + type_i->PrintTo(os);
|
| }
|
| - }
|
| - if (dim == BOTH_DIMS) os << "/";
|
| - if (dim != SEMANTIC_DIM) {
|
| - BitsetType::Print(os, REPRESENTATION(this->BitsetLub()));
|
| + os << ")";
|
| + } else if (this->IsTuple()) {
|
| + os << "<";
|
| + for (int i = 0, n = this->AsTuple()->Arity(); i < n; ++i) {
|
| + Type* type_i = this->AsTuple()->Element(i);
|
| + if (i > 0) os << ", ";
|
| + type_i->PrintTo(os);
|
| + }
|
| + os << ">";
|
| + } else {
|
| + UNREACHABLE();
|
| }
|
| }
|
|
|
|
|