| Index: src/types.cc
|
| diff --git a/src/types.cc b/src/types.cc
|
| index db638ed141d604e95ffe7ab9f9099aac0ba34a2d..8b68a7d0ea2cbb29c6cc61478e508aa5c9103693 100644
|
| --- a/src/types.cc
|
| +++ b/src/types.cc
|
| @@ -262,7 +262,7 @@ bool TypeImpl<Config>::SlowIs(TypeImpl* that) {
|
| if (this->IsBitset() && SEMANTIC(this->AsBitset()) == BitsetType::kNone) {
|
| // Bitsets only have non-bitset supertypes along the representation axis.
|
| int that_bitset = that->BitsetGlb();
|
| - return (this->AsBitset() | that_bitset) == that_bitset;
|
| + return (BitsetType::Is(this->AsBitset(), that_bitset));
|
| }
|
|
|
| if (that->IsClass()) {
|
| @@ -313,16 +313,12 @@ bool TypeImpl<Config>::SlowIs(TypeImpl* that) {
|
|
|
| // T <= (T1 \/ ... \/ Tn) <=> (T <= T1) \/ ... \/ (T <= Tn)
|
| // (iff T is not a union)
|
| - ASSERT(!this->IsUnion());
|
| - if (that->IsUnion()) {
|
| - UnionHandle unioned = handle(that->AsUnion());
|
| - for (int i = 0; i < unioned->Length(); ++i) {
|
| - if (this->Is(unioned->Get(i))) return true;
|
| - if (this->IsBitset()) break; // Fast fail, only first field is a bitset.
|
| - }
|
| - return false;
|
| + ASSERT(!this->IsUnion() && that->IsUnion());
|
| + UnionHandle unioned = handle(that->AsUnion());
|
| + for (int i = 0; i < unioned->Length(); ++i) {
|
| + if (this->Is(unioned->Get(i))) return true;
|
| + if (this->IsBitset()) break; // Fast fail, only first field is a bitset.
|
| }
|
| -
|
| return false;
|
| }
|
|
|
| @@ -382,11 +378,8 @@ bool TypeImpl<Config>::Maybe(TypeImpl* that) {
|
| }
|
|
|
| ASSERT(!this->IsUnion() && !that->IsUnion());
|
| - if (this->IsBitset()) {
|
| - return BitsetType::IsInhabited(this->AsBitset() & that->BitsetLub());
|
| - }
|
| - if (that->IsBitset()) {
|
| - return BitsetType::IsInhabited(this->BitsetLub() & that->AsBitset());
|
| + if (this->IsBitset() || that->IsBitset()) {
|
| + return BitsetType::IsInhabited(this->BitsetLub() & that->BitsetLub());
|
| }
|
| if (this->IsClass()) {
|
| return that->IsClass()
|
| @@ -444,6 +437,7 @@ template<class Config>
|
| typename TypeImpl<Config>::TypeHandle TypeImpl<Config>::Narrow(
|
| int bitset, Region* region) {
|
| TypeHandle bound = BitsetType::New(bitset, region);
|
| + ASSERT(!this->IsBitset() && this->Is(bound));
|
| if (this->IsClass()) {
|
| return ClassType::New(this->AsClass()->Map(), bound, region);
|
| } else if (this->IsConstant()) {
|
| @@ -570,7 +564,7 @@ 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 ((bitset | glb) == glb) {
|
| + if (BitsetType::Is(bitset, glb)) {
|
| for (int j = 1; j < size; ++j) {
|
| result->Set(j - 1, result->Get(j));
|
| }
|
|
|