Chromium Code Reviews| Index: src/compiler/types.cc |
| diff --git a/src/compiler/types.cc b/src/compiler/types.cc |
| index b7b2702000ef526342ebb53bf910b13e9e1273c0..277d9005b8e059effa2daf06f060010c4a28b475 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,8 @@ 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()); |
| + // TODO(mvstanton): if it's a smi can I make this SignedSmall()? |
|
Jarin
2016/09/22 15:27:39
No need to, Lub will take care of this.
mvstanton
2016/09/22 18:16:31
Acknowledged.
|
| } |
| return Lub(i::HeapObject::cast(value)->map()); |
| } |
| @@ -419,10 +419,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 +432,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 +613,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 +641,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 +786,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 +803,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 +825,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 +870,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 +884,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 +957,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 +980,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 +1002,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(); |
| } |
| } |