Commit d52451ec authored by mvstanton's avatar mvstanton Committed by Commit bot

[turbofan] Remove the representation dimension from Type.

BUG=

Review-Url: https://codereview.chromium.org/2359153002
Cr-Commit-Position: refs/heads/master@{#39641}
parent 94978c9a
...@@ -918,7 +918,7 @@ Node* RepresentationChanger::TypeError(Node* node, ...@@ -918,7 +918,7 @@ Node* RepresentationChanger::TypeError(Node* node,
if (!testing_type_errors_) { if (!testing_type_errors_) {
std::ostringstream out_str; std::ostringstream out_str;
out_str << output_rep << " ("; out_str << output_rep << " (";
output_type->PrintTo(out_str, Type::SEMANTIC_DIM); output_type->PrintTo(out_str);
out_str << ")"; out_str << ")";
std::ostringstream use_str; std::ostringstream use_str;
......
...@@ -119,9 +119,9 @@ Type::bitset BitsetType::Glb(Type* type) { ...@@ -119,9 +119,9 @@ Type::bitset BitsetType::Glb(Type* type) {
} else if (type->IsRange()) { } else if (type->IsRange()) {
bitset glb = SEMANTIC( bitset glb = SEMANTIC(
BitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max())); BitsetType::Glb(type->AsRange()->Min(), type->AsRange()->Max()));
return glb | REPRESENTATION(type->BitsetLub()); return glb;
} else { } else {
return type->Representation(); return kNone;
} }
} }
...@@ -185,10 +185,10 @@ Type::bitset BitsetType::Lub(i::Map* map) { ...@@ -185,10 +185,10 @@ Type::bitset BitsetType::Lub(i::Map* map) {
map == heap->arguments_marker_map() || map == heap->arguments_marker_map() ||
map == heap->optimized_out_map() || map == heap->optimized_out_map() ||
map == heap->stale_register_map()); map == heap->stale_register_map());
return kOtherInternal & kTaggedPointer; return kOtherInternal;
} }
case HEAP_NUMBER_TYPE: case HEAP_NUMBER_TYPE:
return kNumber & kTaggedPointer; return kNumber;
case SIMD128_VALUE_TYPE: case SIMD128_VALUE_TYPE:
return kSimd; return kSimd;
case JS_OBJECT_TYPE: case JS_OBJECT_TYPE:
...@@ -242,10 +242,10 @@ Type::bitset BitsetType::Lub(i::Map* map) { ...@@ -242,10 +242,10 @@ Type::bitset BitsetType::Lub(i::Map* map) {
case CODE_TYPE: case CODE_TYPE:
case PROPERTY_CELL_TYPE: case PROPERTY_CELL_TYPE:
case MODULE_TYPE: case MODULE_TYPE:
return kOtherInternal & kTaggedPointer; return kOtherInternal;
// Remaining instance types are unsupported for now. If any of them do // 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 MUTABLE_HEAP_NUMBER_TYPE:
case FREE_SPACE_TYPE: case FREE_SPACE_TYPE:
#define FIXED_TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ #define FIXED_TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \
...@@ -282,8 +282,7 @@ Type::bitset BitsetType::Lub(i::Map* map) { ...@@ -282,8 +282,7 @@ Type::bitset BitsetType::Lub(i::Map* map) {
Type::bitset BitsetType::Lub(i::Object* value) { Type::bitset BitsetType::Lub(i::Object* value) {
DisallowHeapAllocation no_allocation; DisallowHeapAllocation no_allocation;
if (value->IsNumber()) { if (value->IsNumber()) {
return Lub(value->Number()) & return Lub(value->Number());
(value->IsSmi() ? kTaggedSigned : kTaggedPointer);
} }
return Lub(i::HeapObject::cast(value)->map()); return Lub(i::HeapObject::cast(value)->map());
} }
...@@ -419,10 +418,6 @@ bool Type::SimplyEquals(Type* that) { ...@@ -419,10 +418,6 @@ bool Type::SimplyEquals(Type* that) {
return false; return false;
} }
Type::bitset Type::Representation() {
return REPRESENTATION(this->BitsetLub());
}
// Check if [this] <= [that]. // Check if [this] <= [that].
bool Type::SlowIs(Type* that) { bool Type::SlowIs(Type* that) {
DisallowHeapAllocation no_allocation; DisallowHeapAllocation no_allocation;
...@@ -436,11 +431,6 @@ bool Type::SlowIs(Type* that) { ...@@ -436,11 +431,6 @@ bool Type::SlowIs(Type* that) {
return BitsetType::Is(this->AsBitset(), that->BitsetGlb()); return BitsetType::Is(this->AsBitset(), that->BitsetGlb());
} }
// Check the representations.
if (!BitsetType::Is(Representation(), that->Representation())) {
return false;
}
// Check the semantic part. // Check the semantic part.
return SemanticIs(that); return SemanticIs(that);
} }
...@@ -622,25 +612,15 @@ Type* Type::Intersect(Type* type1, Type* type2, Zone* zone) { ...@@ -622,25 +612,15 @@ Type* Type::Intersect(Type* type1, Type* type2, Zone* zone) {
// Slow case: create union. // 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 // Semantic subtyping check - this is needed for consistency with the
// semi-fast case above - we should behave the same way regardless of // semi-fast case above.
// representations. Intersection with a universal bitset should only update
// the representations.
if (type1->SemanticIs(type2)) { if (type1->SemanticIs(type2)) {
type2 = Any(); type2 = Any();
} else if (type2->SemanticIs(type1)) { } else if (type2->SemanticIs(type1)) {
type1 = Any(); type1 = Any();
} }
bitset bits = bitset bits = SEMANTIC(type1->BitsetGlb() & type2->BitsetGlb());
SEMANTIC(type1->BitsetGlb() & type2->BitsetGlb()) | representation;
int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1;
int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1;
if (!AddIsSafe(size1, size2)) return Any(); if (!AddIsSafe(size1, size2)) return Any();
...@@ -660,8 +640,7 @@ Type* Type::Intersect(Type* type1, Type* type2, Zone* zone) { ...@@ -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 // If the range is not empty, then insert it into the union and
// remove the number bits from the bitset. // remove the number bits from the bitset.
if (!lims.IsEmpty()) { if (!lims.IsEmpty()) {
size = UpdateRange(RangeType::New(lims, representation, zone), result, size, size = UpdateRange(RangeType::New(lims, zone), result, size, zone);
zone);
// Remove the number bits. // Remove the number bits.
bitset number_bits = BitsetType::NumberBits(bits); bitset number_bits = BitsetType::NumberBits(bits);
...@@ -806,7 +785,7 @@ Type* Type::NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone) { ...@@ -806,7 +785,7 @@ Type* Type::NormalizeRangeAndBitset(Type* range, bitset* bits, Zone* zone) {
if (bitset_max > range_max) { if (bitset_max > range_max) {
range_max = bitset_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) { Type* Type::Union(Type* type1, Type* type2, Zone* zone) {
...@@ -823,13 +802,6 @@ 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 (type1->Is(type2)) return type2;
if (type2->Is(type1)) return type1; 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. // Slow case: create union.
int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1; int size1 = type1->IsUnion() ? type1->AsUnion()->Length() : 1;
int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1; int size2 = type2->IsUnion() ? type2->AsUnion()->Length() : 1;
...@@ -852,14 +824,14 @@ Type* Type::Union(Type* type1, Type* type2, Zone* zone) { ...@@ -852,14 +824,14 @@ Type* Type::Union(Type* type1, Type* type2, Zone* zone) {
RangeType::Limits lims = RangeType::Limits lims =
RangeType::Limits::Union(RangeType::Limits(range1->AsRange()), RangeType::Limits::Union(RangeType::Limits(range1->AsRange()),
RangeType::Limits(range2->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); range = NormalizeRangeAndBitset(union_range, &new_bitset, zone);
} else if (range1 != NULL) { } else if (range1 != NULL) {
range = NormalizeRangeAndBitset(range1, &new_bitset, zone); range = NormalizeRangeAndBitset(range1, &new_bitset, zone);
} else if (range2 != NULL) { } else if (range2 != NULL) {
range = NormalizeRangeAndBitset(range2, &new_bitset, zone); range = NormalizeRangeAndBitset(range2, &new_bitset, zone);
} }
new_bitset = SEMANTIC(new_bitset) | representation; new_bitset = SEMANTIC(new_bitset);
Type* bits = BitsetType::New(new_bitset); Type* bits = BitsetType::New(new_bitset);
result->Set(size++, bits); result->Set(size++, bits);
if (!range->IsNone()) result->Set(size++, range); if (!range->IsNone()) result->Set(size++, range);
...@@ -897,14 +869,9 @@ Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) { ...@@ -897,14 +869,9 @@ Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) {
bitset bits = unioned->Get(0)->AsBitset(); bitset bits = unioned->Get(0)->AsBitset();
// If the union only consists of a range, we can get rid of the union. // If the union only consists of a range, we can get rid of the union.
if (size == 2 && SEMANTIC(bits) == BitsetType::kNone) { 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()) { if (unioned->Get(1)->IsRange()) {
return RangeType::New(unioned->Get(1)->AsRange()->Min(), return RangeType::New(unioned->Get(1)->AsRange()->Min(),
unioned->Get(1)->AsRange()->Max(), unioned->Get(1)->AsRange()->Max(), zone);
unioned->Get(0)->AsBitset(), zone);
} }
} }
unioned->Shrink(size); unioned->Shrink(size);
...@@ -915,11 +882,6 @@ Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) { ...@@ -915,11 +882,6 @@ Type* Type::NormalizeUnion(Type* union_type, int size, Zone* zone) {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Component extraction // Component extraction
// static
Type* Type::Representation(Type* t, Zone* zone) {
return BitsetType::New(t->Representation());
}
// static // static
Type* Type::Semantic(Type* t, Zone* zone) { Type* Type::Semantic(Type* t, Zone* zone) {
return Intersect(t, BitsetType::New(BitsetType::kSemantic), zone); return Intersect(t, BitsetType::New(BitsetType::kSemantic), zone);
...@@ -994,14 +956,6 @@ void Type::Iterator<T>::Advance() { ...@@ -994,14 +956,6 @@ void Type::Iterator<T>::Advance() {
const char* BitsetType::Name(bitset bits) { const char* BitsetType::Name(bitset bits) {
switch (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) \ #define RETURN_NAMED_SEMANTIC_TYPE(type, value) \
case SEMANTIC(k##type): \ case SEMANTIC(k##type): \
return #type; return #type;
...@@ -1025,10 +979,6 @@ void BitsetType::Print(std::ostream& os, // NOLINT ...@@ -1025,10 +979,6 @@ void BitsetType::Print(std::ostream& os, // NOLINT
// clang-format off // clang-format off
static const bitset named_bitsets[] = { 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), #define BITSET_CONSTANT(type, value) SEMANTIC(k##type),
INTERNAL_BITSET_TYPE_LIST(BITSET_CONSTANT) INTERNAL_BITSET_TYPE_LIST(BITSET_CONSTANT)
SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT) SEMANTIC_BITSET_TYPE_LIST(BITSET_CONSTANT)
...@@ -1051,9 +1001,8 @@ void BitsetType::Print(std::ostream& os, // NOLINT ...@@ -1051,9 +1001,8 @@ void BitsetType::Print(std::ostream& os, // NOLINT
os << ")"; os << ")";
} }
void Type::PrintTo(std::ostream& os, PrintDimension dim) { void Type::PrintTo(std::ostream& os) {
DisallowHeapAllocation no_allocation; DisallowHeapAllocation no_allocation;
if (dim != REPRESENTATION_DIM) {
if (this->IsBitset()) { if (this->IsBitset()) {
BitsetType::Print(os, SEMANTIC(this->AsBitset())); BitsetType::Print(os, SEMANTIC(this->AsBitset()));
} else if (this->IsConstant()) { } else if (this->IsConstant()) {
...@@ -1070,7 +1019,7 @@ void Type::PrintTo(std::ostream& os, PrintDimension dim) { ...@@ -1070,7 +1019,7 @@ void Type::PrintTo(std::ostream& os, PrintDimension dim) {
for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) { for (int i = 0, n = this->AsUnion()->Length(); i < n; ++i) {
Type* type_i = this->AsUnion()->Get(i); Type* type_i = this->AsUnion()->Get(i);
if (i > 0) os << " | "; if (i > 0) os << " | ";
type_i->PrintTo(os, dim); type_i->PrintTo(os);
} }
os << ")"; os << ")";
} else if (this->IsTuple()) { } else if (this->IsTuple()) {
...@@ -1078,17 +1027,12 @@ void Type::PrintTo(std::ostream& os, PrintDimension dim) { ...@@ -1078,17 +1027,12 @@ void Type::PrintTo(std::ostream& os, PrintDimension dim) {
for (int i = 0, n = this->AsTuple()->Arity(); i < n; ++i) { for (int i = 0, n = this->AsTuple()->Arity(); i < n; ++i) {
Type* type_i = this->AsTuple()->Element(i); Type* type_i = this->AsTuple()->Element(i);
if (i > 0) os << ", "; if (i > 0) os << ", ";
type_i->PrintTo(os, dim); type_i->PrintTo(os);
} }
os << ">"; os << ">";
} else { } else {
UNREACHABLE(); UNREACHABLE();
} }
}
if (dim == BOTH_DIMS) os << "/";
if (dim != SEMANTIC_DIM) {
BitsetType::Print(os, REPRESENTATION(this->BitsetLub()));
}
} }
#ifdef DEBUG #ifdef DEBUG
......
...@@ -47,34 +47,6 @@ namespace compiler { ...@@ -47,34 +47,6 @@ namespace compiler {
// Constant(x) < T iff instance_type(map(x)) < T // Constant(x) < T iff instance_type(map(x)) < T
// //
// //
// REPRESENTATIONAL DIMENSION
//
// For the representation axis, the following holds:
//
// None <= R
// R <= Any
//
// UntaggedInt = UntaggedInt1 \/ UntaggedInt8 \/
// UntaggedInt16 \/ UntaggedInt32
// UntaggedFloat = UntaggedFloat32 \/ UntaggedFloat64
// UntaggedNumber = UntaggedInt \/ UntaggedFloat
// Untagged = UntaggedNumber \/ UntaggedPtr
// Tagged = TaggedInt \/ TaggedPtr
//
// Subtyping relates the two dimensions, for example:
//
// Number <= Tagged \/ UntaggedNumber
// Object <= TaggedPtr \/ UntaggedPtr
//
// That holds because the semantic type constructors defined by the API create
// types that allow for all possible representations, and dually, the ones for
// representation types initially include all semantic ranges. Representations
// can then e.g. be narrowed for a given semantic type using intersection:
//
// SignedSmall /\ TaggedInt (a 'smi')
// Number /\ TaggedPtr (a heap number)
//
//
// RANGE TYPES // RANGE TYPES
// //
// A range type represents a continuous integer interval by its minimum and // A range type represents a continuous integer interval by its minimum and
...@@ -125,7 +97,6 @@ namespace compiler { ...@@ -125,7 +97,6 @@ namespace compiler {
// Internally, all 'primitive' types, and their unions, are represented as // Internally, all 'primitive' types, and their unions, are represented as
// bitsets. Bit 0 is reserved for tagging. Only structured types require // bitsets. Bit 0 is reserved for tagging. Only structured types require
// allocation. // allocation.
// Note that the bitset representation is closed under both Union and Intersect.
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Values for bitset types // Values for bitset types
...@@ -133,56 +104,35 @@ namespace compiler { ...@@ -133,56 +104,35 @@ namespace compiler {
// clang-format off // clang-format off
#define MASK_BITSET_TYPE_LIST(V) \ #define MASK_BITSET_TYPE_LIST(V) \
V(Representation, 0xffc00000u) \ V(Semantic, 0xfffffffeu)
V(Semantic, 0x003ffffeu)
#define REPRESENTATION(k) ((k) & BitsetType::kRepresentation)
#define SEMANTIC(k) ((k) & BitsetType::kSemantic) #define SEMANTIC(k) ((k) & BitsetType::kSemantic)
#define REPRESENTATION_BITSET_TYPE_LIST(V) \
V(None, 0) \
V(UntaggedBit, 1u << 22 | kSemantic) \
V(UntaggedIntegral8, 1u << 23 | kSemantic) \
V(UntaggedIntegral16, 1u << 24 | kSemantic) \
V(UntaggedIntegral32, 1u << 25 | kSemantic) \
V(UntaggedFloat32, 1u << 26 | kSemantic) \
V(UntaggedFloat64, 1u << 27 | kSemantic) \
V(UntaggedSimd128, 1u << 28 | kSemantic) \
V(UntaggedPointer, 1u << 29 | kSemantic) \
V(TaggedSigned, 1u << 30 | kSemantic) \
V(TaggedPointer, 1u << 31 | kSemantic) \
\
V(UntaggedIntegral, kUntaggedBit | kUntaggedIntegral8 | \
kUntaggedIntegral16 | kUntaggedIntegral32) \
V(UntaggedFloat, kUntaggedFloat32 | kUntaggedFloat64) \
V(UntaggedNumber, kUntaggedIntegral | kUntaggedFloat) \
V(Untagged, kUntaggedNumber | kUntaggedPointer) \
V(Tagged, kTaggedSigned | kTaggedPointer)
#define INTERNAL_BITSET_TYPE_LIST(V) \ #define INTERNAL_BITSET_TYPE_LIST(V) \
V(OtherUnsigned31, 1u << 1 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(OtherUnsigned31, 1u << 1) \
V(OtherUnsigned32, 1u << 2 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(OtherUnsigned32, 1u << 2) \
V(OtherSigned32, 1u << 3 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(OtherSigned32, 1u << 3) \
V(OtherNumber, 1u << 4 | REPRESENTATION(kTagged | kUntaggedNumber)) V(OtherNumber, 1u << 4) \
#define SEMANTIC_BITSET_TYPE_LIST(V) \ #define SEMANTIC_BITSET_TYPE_LIST(V) \
V(Negative31, 1u << 5 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(None, 0u) \
V(Null, 1u << 6 | REPRESENTATION(kTaggedPointer)) \ V(Negative31, 1u << 5) \
V(Undefined, 1u << 7 | REPRESENTATION(kTaggedPointer)) \ V(Null, 1u << 6) \
V(Boolean, 1u << 8 | REPRESENTATION(kTaggedPointer)) \ V(Undefined, 1u << 7) \
V(Unsigned30, 1u << 9 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(Boolean, 1u << 8) \
V(MinusZero, 1u << 10 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(Unsigned30, 1u << 9) \
V(NaN, 1u << 11 | REPRESENTATION(kTagged | kUntaggedNumber)) \ V(MinusZero, 1u << 10) \
V(Symbol, 1u << 12 | REPRESENTATION(kTaggedPointer)) \ V(NaN, 1u << 11) \
V(InternalizedString, 1u << 13 | REPRESENTATION(kTaggedPointer)) \ V(Symbol, 1u << 12) \
V(OtherString, 1u << 14 | REPRESENTATION(kTaggedPointer)) \ V(InternalizedString, 1u << 13) \
V(Simd, 1u << 15 | REPRESENTATION(kTaggedPointer)) \ V(OtherString, 1u << 14) \
V(OtherObject, 1u << 17 | REPRESENTATION(kTaggedPointer)) \ V(Simd, 1u << 15) \
V(OtherUndetectable, 1u << 16 | REPRESENTATION(kTaggedPointer)) \ V(OtherObject, 1u << 17) \
V(Proxy, 1u << 18 | REPRESENTATION(kTaggedPointer)) \ V(OtherUndetectable, 1u << 16) \
V(Function, 1u << 19 | REPRESENTATION(kTaggedPointer)) \ V(Proxy, 1u << 18) \
V(Hole, 1u << 20 | REPRESENTATION(kTaggedPointer)) \ V(Function, 1u << 19) \
V(OtherInternal, 1u << 21 | REPRESENTATION(kTagged | kUntagged)) \ V(Hole, 1u << 20) \
V(OtherInternal, 1u << 21) \
\ \
V(Signed31, kUnsigned30 | kNegative31) \ V(Signed31, kUnsigned30 | kNegative31) \
V(Signed32, kSigned31 | kOtherUnsigned31 | kOtherSigned32) \ V(Signed32, kSigned31 | kOtherUnsigned31 | kOtherSigned32) \
...@@ -244,12 +194,10 @@ namespace compiler { ...@@ -244,12 +194,10 @@ namespace compiler {
*/ */
#define PROPER_BITSET_TYPE_LIST(V) \ #define PROPER_BITSET_TYPE_LIST(V) \
REPRESENTATION_BITSET_TYPE_LIST(V) \
SEMANTIC_BITSET_TYPE_LIST(V) SEMANTIC_BITSET_TYPE_LIST(V)
#define BITSET_TYPE_LIST(V) \ #define BITSET_TYPE_LIST(V) \
MASK_BITSET_TYPE_LIST(V) \ MASK_BITSET_TYPE_LIST(V) \
REPRESENTATION_BITSET_TYPE_LIST(V) \
INTERNAL_BITSET_TYPE_LIST(V) \ INTERNAL_BITSET_TYPE_LIST(V) \
SEMANTIC_BITSET_TYPE_LIST(V) SEMANTIC_BITSET_TYPE_LIST(V)
...@@ -276,9 +224,7 @@ class BitsetType { ...@@ -276,9 +224,7 @@ class BitsetType {
return static_cast<bitset>(reinterpret_cast<uintptr_t>(this) ^ 1u); return static_cast<bitset>(reinterpret_cast<uintptr_t>(this) ^ 1u);
} }
static bool IsInhabited(bitset bits) { static bool IsInhabited(bitset bits) { return SemanticIsInhabited(bits); }
return SEMANTIC(bits) != kNone && REPRESENTATION(bits) != kNone;
}
static bool SemanticIsInhabited(bitset bits) { static bool SemanticIsInhabited(bitset bits) {
return SEMANTIC(bits) != kNone; return SEMANTIC(bits) != kNone;
...@@ -389,7 +335,6 @@ class ConstantType : public TypeBase { ...@@ -389,7 +335,6 @@ class ConstantType : public TypeBase {
Handle<i::Object> object_; Handle<i::Object> object_;
}; };
// TODO(neis): Also cache value if numerical. // TODO(neis): Also cache value if numerical.
// TODO(neis): Allow restricting the representation.
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// Range types. // Range types.
...@@ -415,21 +360,18 @@ class RangeType : public TypeBase { ...@@ -415,21 +360,18 @@ class RangeType : public TypeBase {
friend class BitsetType; friend class BitsetType;
friend class UnionType; friend class UnionType;
static Type* New(double min, double max, BitsetType::bitset representation, static Type* New(double min, double max, Zone* zone) {
Zone* zone) { return New(Limits(min, max), zone);
return New(Limits(min, max), representation, zone);
} }
static bool IsInteger(double x) { static bool IsInteger(double x) {
return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities. return nearbyint(x) == x && !i::IsMinusZero(x); // Allows for infinities.
} }
static Type* New(Limits lim, BitsetType::bitset representation, Zone* zone) { static Type* New(Limits lim, Zone* zone) {
DCHECK(IsInteger(lim.min) && IsInteger(lim.max)); DCHECK(IsInteger(lim.min) && IsInteger(lim.max));
DCHECK(lim.min <= lim.max); DCHECK(lim.min <= lim.max);
DCHECK(REPRESENTATION(representation) == representation); BitsetType::bitset bits = SEMANTIC(BitsetType::Lub(lim.min, lim.max));
BitsetType::bitset bits =
SEMANTIC(BitsetType::Lub(lim.min, lim.max)) | representation;
return AsType(new (zone->New(sizeof(RangeType))) RangeType(bits, lim)); return AsType(new (zone->New(sizeof(RangeType))) RangeType(bits, lim));
} }
...@@ -556,9 +498,7 @@ class Type { ...@@ -556,9 +498,7 @@ class Type {
return ConstantType::New(value, zone); return ConstantType::New(value, zone);
} }
static Type* Range(double min, double max, Zone* zone) { static Type* Range(double min, double max, Zone* zone) {
return RangeType::New(min, max, REPRESENTATION(BitsetType::kTagged | return RangeType::New(min, max, zone);
BitsetType::kUntaggedNumber),
zone);
} }
static Type* Tuple(Type* first, Type* second, Type* third, Zone* zone) { static Type* Tuple(Type* first, Type* second, Type* third, Zone* zone) {
Type* tuple = TupleType::New(3, zone); Type* tuple = TupleType::New(3, zone);
...@@ -587,7 +527,6 @@ class Type { ...@@ -587,7 +527,6 @@ class Type {
static Type* For(i::Handle<i::Map> map) { return For(*map); } static Type* For(i::Handle<i::Map> map) { return For(*map); }
// Extraction of components. // Extraction of components.
static Type* Representation(Type* t, Zone* zone);
static Type* Semantic(Type* t, Zone* zone); static Type* Semantic(Type* t, Zone* zone);
// Predicates. // Predicates.
...@@ -655,9 +594,7 @@ class Type { ...@@ -655,9 +594,7 @@ class Type {
// Printing. // Printing.
enum PrintDimension { BOTH_DIMS, SEMANTIC_DIM, REPRESENTATION_DIM }; void PrintTo(std::ostream& os);
void PrintTo(std::ostream& os, PrintDimension dim = BOTH_DIMS); // NOLINT
#ifdef DEBUG #ifdef DEBUG
void Print(); void Print();
...@@ -690,8 +627,6 @@ class Type { ...@@ -690,8 +627,6 @@ class Type {
} }
UnionType* AsUnion() { return UnionType::cast(this); } UnionType* AsUnion() { return UnionType::cast(this); }
bitset Representation();
// Auxiliary functions. // Auxiliary functions.
bool SemanticMaybe(Type* that); bool SemanticMaybe(Type* that);
......
...@@ -187,72 +187,6 @@ struct Tests { ...@@ -187,72 +187,6 @@ struct Tests {
} }
} }
void PointwiseRepresentation() {
// Check we can decompose type into semantics and representation and
// then compose it back to get an equivalent type.
int counter = 0;
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
counter++;
Type* type1 = *it1;
Type* representation = T.Representation(type1);
Type* semantic = T.Semantic(type1);
Type* composed = T.Union(representation, semantic);
CHECK(type1->Equals(composed));
}
// Pointwiseness of Union.
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
Type* type1 = *it1;
Type* type2 = *it2;
Type* representation1 = T.Representation(type1);
Type* semantic1 = T.Semantic(type1);
Type* representation2 = T.Representation(type2);
Type* semantic2 = T.Semantic(type2);
Type* direct_union = T.Union(type1, type2);
Type* representation_union = T.Union(representation1, representation2);
Type* semantic_union = T.Union(semantic1, semantic2);
Type* composed_union = T.Union(representation_union, semantic_union);
CHECK(direct_union->Equals(composed_union));
}
}
// Pointwiseness of Intersect.
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
Type* type1 = *it1;
Type* type2 = *it2;
Type* representation1 = T.Representation(type1);
Type* semantic1 = T.Semantic(type1);
Type* representation2 = T.Representation(type2);
Type* semantic2 = T.Semantic(type2);
Type* direct_intersection = T.Intersect(type1, type2);
Type* representation_intersection =
T.Intersect(representation1, representation2);
Type* semantic_intersection = T.Intersect(semantic1, semantic2);
Type* composed_intersection =
T.Union(representation_intersection, semantic_intersection);
CHECK(direct_intersection->Equals(composed_intersection));
}
}
// Pointwiseness of Is.
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
Type* type1 = *it1;
Type* type2 = *it2;
Type* representation1 = T.Representation(type1);
Type* semantic1 = T.Semantic(type1);
Type* representation2 = T.Representation(type2);
Type* semantic2 = T.Semantic(type2);
bool representation_is = representation1->Is(representation2);
bool semantic_is = semantic1->Is(semantic2);
bool direct_is = type1->Is(type2);
CHECK(direct_is == (semantic_is && representation_is));
}
}
}
void Constant() { void Constant() {
// Constructor // Constructor
for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) { for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
...@@ -1153,8 +1087,6 @@ struct Tests { ...@@ -1153,8 +1087,6 @@ struct Tests {
TEST(IsSomeType) { Tests().IsSomeType(); } TEST(IsSomeType) { Tests().IsSomeType(); }
TEST(PointwiseRepresentation) { Tests().PointwiseRepresentation(); }
TEST(BitsetType) { Tests().Bitset(); } TEST(BitsetType) { Tests().Bitset(); }
TEST(ConstantType) { Tests().Constant(); } TEST(ConstantType) { Tests().Constant(); }
......
...@@ -142,8 +142,6 @@ class Types { ...@@ -142,8 +142,6 @@ class Types {
Type* Intersect(Type* t1, Type* t2) { return Type::Intersect(t1, t2, zone_); } Type* Intersect(Type* t1, Type* t2) { return Type::Intersect(t1, t2, zone_); }
Type* Representation(Type* t) { return Type::Representation(t, zone_); }
Type* Semantic(Type* t) { return Type::Semantic(t, zone_); } Type* Semantic(Type* t) { return Type::Semantic(t, zone_); }
Type* Random() { Type* Random() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment