Commit 63a170aa authored by neis@chromium.org's avatar neis@chromium.org

Remove non-trivial subtyping between bitset and non-bitset types.

R=rossberg@chromium.org
BUG=

Review URL: https://codereview.chromium.org/444503005

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22903 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 10603eff
......@@ -21,26 +21,9 @@ int TypeImpl<Config>::BitsetType::Glb(TypeImpl* type) {
return type->AsBitset();
} else if (type->IsUnion()) {
UnionHandle unioned = handle(type->AsUnion());
int bitset = kNone;
for (int i = 0; i < unioned->Length(); ++i) {
bitset |= unioned->Get(i)->BitsetGlb();
}
return bitset;
} else if (type->IsClass()) {
// Little hack to avoid the need for a region for handlification here...
return REPRESENTATION(Config::is_class(type)
? Lub(*Config::as_class(type))
: type->AsClass()->Bound(NULL)->AsBitset());
} else if (type->IsConstant()) {
return REPRESENTATION(type->AsConstant()->Bound()->AsBitset());
} else if (type->IsContext()) {
return REPRESENTATION(type->AsContext()->Bound()->AsBitset());
} else if (type->IsArray()) {
return REPRESENTATION(type->AsArray()->Bound()->AsBitset());
} else if (type->IsFunction()) {
return REPRESENTATION(type->AsFunction()->Bound()->AsBitset());
DCHECK(unioned->Wellformed());
return unioned->Get(0)->BitsetGlb(); // Other BitsetGlb's are kNone anyway.
} else {
UNREACHABLE();
return kNone;
}
}
......@@ -260,10 +243,6 @@ bool TypeImpl<Config>::SlowIs(TypeImpl* that) {
if (that->IsBitset()) {
return BitsetType::Is(BitsetType::Lub(this), that->AsBitset());
}
if (this->IsBitset() && SEMANTIC(this->AsBitset()) == BitsetType::kNone) {
// Bitsets only have non-bitset supertypes along the representation axis.
return BitsetType::Is(this->AsBitset(), that->BitsetGlb());
}
if (that->IsClass()) {
return this->IsClass()
......@@ -555,26 +534,6 @@ int TypeImpl<Config>::ExtendUnion(
}
// If bitset is subsumed by another entry in the result, remove it.
// (Only bitsets with empty semantic axis can be subtypes of non-bitsets.)
template<class Config>
int TypeImpl<Config>::NormalizeUnion(UnionHandle result, int size, int bitset) {
if (bitset != BitsetType::kNone && SEMANTIC(bitset) == BitsetType::kNone) {
for (int i = 1; i < size; ++i) {
int glb = result->Get(i)->BitsetGlb();
if (BitsetType::Is(bitset, glb)) {
for (int j = 1; j < size; ++j) {
result->Set(j - 1, result->Get(j));
}
--size;
break;
}
}
}
return size;
}
// Union is O(1) on simple bitsets, but O(n*m) on structured unions.
template<class Config>
typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Union(
......@@ -613,7 +572,6 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Union(
}
size = ExtendUnion(unioned, size, type1, type2, false, region);
size = ExtendUnion(unioned, size, type2, type1, false, region);
size = NormalizeUnion(unioned, size, bitset);
if (size == 1) {
return unioned->Get(0);
......@@ -663,7 +621,6 @@ typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Intersect(
}
size = ExtendUnion(unioned, size, type1, type2, true, region);
size = ExtendUnion(unioned, size, type2, type1, true, region);
size = NormalizeUnion(unioned, size, bitset);
if (size == 0) {
return None(region);
......
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