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(); |
} |
} |