1dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
26b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
36b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org// found in the LICENSE file.
4dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
5202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org#include <vector>
65b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-types.h"
86b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org#include "src/isolate-inl.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
11dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
12dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgusing namespace v8::internal;
13dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
14c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org// Testing auxiliaries (breaking the Type abstraction).
15d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.orgtypedef uint32_t bitset;
16d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org
17c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct ZoneRep {
18c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  typedef void* Struct;
19c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
20c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsStruct(Type* t, int tag) {
21c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag;
22c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
23d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  static bool IsBitset(Type* t) { return reinterpret_cast<uintptr_t>(t) & 1; }
247c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  static bool IsUnion(Type* t) { return IsStruct(t, 6); }
25c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
26c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsStruct(Type* t) {
27c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return reinterpret_cast<Struct*>(t);
28c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
29d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  static bitset AsBitset(Type* t) {
30d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    return static_cast<bitset>(reinterpret_cast<uintptr_t>(t) ^ 1u);
31c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
32c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsUnion(Type* t) {
33c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return AsStruct(t);
34c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
35c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static int Length(Struct* structured) {
36c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return static_cast<int>(reinterpret_cast<intptr_t>(structured[1]));
37c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
38c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
39c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Zone* ToRegion(Zone* zone, Isolate* isolate) { return zone; }
40d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
41d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  struct BitsetType : Type::BitsetType {
42d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::New;
43d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::Glb;
44d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::Lub;
45b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    using Type::BitsetType::IsInhabited;
46d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  };
47c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org};
48c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
49c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
50c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct HeapRep {
51c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  typedef FixedArray Struct;
52c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
53c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsStruct(Handle<HeapType> t, int tag) {
54c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag;
55c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
56c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); }
577c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 6); }
58c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
59c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); }
60d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  static bitset AsBitset(Handle<HeapType> t) {
61d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    return static_cast<bitset>(reinterpret_cast<uintptr_t>(*t));
62d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org  }
63c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); }
64c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static int Length(Struct* structured) { return structured->length() - 1; }
65c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
66c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; }
67d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
68d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  struct BitsetType : HeapType::BitsetType {
69d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::New;
70d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::Glb;
71d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::Lub;
72b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    using HeapType::BitsetType::IsInhabited;
73d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    static bitset Glb(Handle<HeapType> type) { return Glb(*type); }
74d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    static bitset Lub(Handle<HeapType> type) { return Lub(*type); }
75d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  };
76c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org};
77c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
78c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region>
806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgclass Types {
816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org public:
826b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  Types(Region* region, Isolate* isolate)
836b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org      : region_(region), rng_(isolate->random_number_generator()) {
84202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    #define DECLARE_TYPE(name, value) \
85202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      name = Type::name(region); \
86202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      types.push_back(name);
87b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    PROPER_BITSET_TYPE_LIST(DECLARE_TYPE)
88202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    #undef DECLARE_TYPE
89202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
90b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    object_map = isolate->factory()->NewMap(
91b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        JS_OBJECT_TYPE, JSObject::kHeaderSize);
92b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    array_map = isolate->factory()->NewMap(
93b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        JS_ARRAY_TYPE, JSArray::kSize);
94b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    number_map = isolate->factory()->NewMap(
95b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        HEAP_NUMBER_TYPE, HeapNumber::kSize);
96202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    uninitialized_map = isolate->factory()->uninitialized_map();
97202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    ObjectClass = Type::Class(object_map, region);
98202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    ArrayClass = Type::Class(array_map, region);
99b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    NumberClass = Type::Class(number_map, region);
100202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    UninitializedClass = Type::Class(uninitialized_map, region);
101202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
102202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    maps.push_back(object_map);
103202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    maps.push_back(array_map);
104202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    maps.push_back(uninitialized_map);
105202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapVector::iterator it = maps.begin(); it != maps.end(); ++it) {
106202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      types.push_back(Type::Class(*it, region));
107202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
108202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    smi = handle(Smi::FromInt(666), isolate);
1106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    signed32 = isolate->factory()->NewHeapNumber(0x40000000);
1116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    object1 = isolate->factory()->NewJSObjectFromMap(object_map);
1126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    object2 = isolate->factory()->NewJSObjectFromMap(object_map);
1136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    array = isolate->factory()->NewJSArray(20);
114202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    uninitialized = isolate->factory()->uninitialized_value();
1156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    SmiConstant = Type::Constant(smi, region);
1166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    Signed32Constant = Type::Constant(signed32, region);
1176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ObjectConstant1 = Type::Constant(object1, region);
1186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ObjectConstant2 = Type::Constant(object2, region);
119202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    ArrayConstant = Type::Constant(array, region);
120202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    UninitializedConstant = Type::Constant(uninitialized, region);
121202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
122202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(smi);
123202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(signed32);
124202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(object1);
125202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(object2);
126202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(array);
127202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(uninitialized);
128202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) {
129202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      types.push_back(Type::Constant(*it, region));
1305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
1315b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
132b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    integers.push_back(isolate->factory()->NewNumber(-V8_INFINITY));
133b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    integers.push_back(isolate->factory()->NewNumber(+V8_INFINITY));
134b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    integers.push_back(isolate->factory()->NewNumber(-rng_->NextInt(10)));
135b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    integers.push_back(isolate->factory()->NewNumber(+rng_->NextInt(10)));
1367c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    for (int i = 0; i < 10; ++i) {
137b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      double x = rng_->NextInt();
138b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      integers.push_back(isolate->factory()->NewNumber(x));
139b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      x *= rng_->NextInt();
140b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      if (!IsMinusZero(x)) integers.push_back(isolate->factory()->NewNumber(x));
1417c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    }
1427c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
1437e6132b924829c353864933f29124419916db550machenbach@chromium.org    NumberArray = Type::Array(Number, region);
1449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    StringArray = Type::Array(String, region);
1459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    AnyArray = Type::Array(Any, region);
1469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region);
1489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    NumberFunction1 = Type::Function(Number, Number, region);
1499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    NumberFunction2 = Type::Function(Number, Number, Number, region);
1509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    MethodFunction = Type::Function(String, Object, 0, region);
1519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1528640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org    for (int i = 0; i < 30; ++i) {
153c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      types.push_back(Fuzz());
154202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
1566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Map> object_map;
1589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Map> array_map;
159b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  Handle<i::Map> number_map;
1609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Map> uninitialized_map;
1619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Smi> smi;
1639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::HeapNumber> signed32;
1649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::JSObject> object1;
1659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::JSObject> object2;
1669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::JSArray> array;
1679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Oddball> uninitialized;
1689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
169202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  #define DECLARE_TYPE(name, value) TypeHandle name;
170202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  BITSET_TYPE_LIST(DECLARE_TYPE)
171202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  #undef DECLARE_TYPE
1726d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ObjectClass;
1746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ArrayClass;
175b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  TypeHandle NumberClass;
176202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle UninitializedClass;
1776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle SmiConstant;
1796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle Signed32Constant;
1806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ObjectConstant1;
1816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ObjectConstant2;
182202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle ArrayConstant;
183202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle UninitializedConstant;
1846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1857e6132b924829c353864933f29124419916db550machenbach@chromium.org  TypeHandle NumberArray;
1869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle StringArray;
1879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle AnyArray;
1886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle SignedFunction1;
1909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle NumberFunction1;
1919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle NumberFunction2;
1929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle MethodFunction;
1936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
194202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef std::vector<TypeHandle> TypeVector;
195202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef std::vector<Handle<i::Map> > MapVector;
196202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef std::vector<Handle<i::Object> > ValueVector;
1977c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
198202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeVector types;
199202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  MapVector maps;
200202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ValueVector values;
201b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ValueVector integers;  // "Integer" values used for range limits.
2028640107360766c74218cf16d51b714b1f2138839machenbach@chromium.org
203202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle Of(Handle<i::Object> value) {
204202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::Of(value, region_);
205202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
206202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
207202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle NowOf(Handle<i::Object> value) {
208202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::NowOf(value, region_);
209202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
2105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
211b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  TypeHandle Class(Handle<i::Map> map) {
212b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    return Type::Class(map, region_);
213b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  }
214b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
215202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle Constant(Handle<i::Object> value) {
216202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::Constant(value, region_);
2175b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
2185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
219b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  TypeHandle Range(Handle<i::Object> min, Handle<i::Object> max) {
2207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    return Type::Range(min, max, region_);
2217c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  }
2227c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
223b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  TypeHandle Context(TypeHandle outer) {
224b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    return Type::Context(outer, region_);
2255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
2265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
2279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Array1(TypeHandle element) {
2289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return Type::Array(element, region_);
2299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Function0(TypeHandle result, TypeHandle receiver) {
2329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return Type::Function(result, receiver, 0, region_);
2339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) {
2369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    TypeHandle type = Type::Function(result, receiver, 1, region_);
2379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    type->AsFunction()->InitParameter(0, arg);
2389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return type;
2399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) {
2429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return Type::Function(result, arg1, arg2, region_);
2439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle Union(TypeHandle t1, TypeHandle t2) {
2466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    return Type::Union(t1, t2, region_);
2476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
2486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle Intersect(TypeHandle t1, TypeHandle t2) {
2496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    return Type::Intersect(t1, t2, region_);
2506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
2516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
252af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  template<class Type2, class TypeHandle2>
253af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  TypeHandle Convert(TypeHandle2 t) {
254af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    return Type::template Convert<Type2>(t, region_);
255af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  }
256af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
2579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Random() {
2586b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org    return types[rng_->NextInt(static_cast<int>(types.size()))];
2599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
261b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  TypeHandle Fuzz(int depth = 4) {
2626b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org    switch (rng_->NextInt(depth == 0 ? 3 : 20)) {
263c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      case 0: {  // bitset
264c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        int n = 0
265c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #define COUNT_BITSET_TYPES(type, value) + 1
266b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        PROPER_BITSET_TYPE_LIST(COUNT_BITSET_TYPES)
267c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #undef COUNT_BITSET_TYPES
268c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        ;
2696b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        int i = rng_->NextInt(n);
270c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #define PICK_BITSET_TYPE(type, value) \
271c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          if (i-- == 0) return Type::type(region_);
272b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        PROPER_BITSET_TYPE_LIST(PICK_BITSET_TYPE)
273c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #undef PICK_BITSET_TYPE
274c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        UNREACHABLE();
275c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
276c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      case 1: {  // class
2776b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        int i = rng_->NextInt(static_cast<int>(maps.size()));
278c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        return Type::Class(maps[i], region_);
279c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
280c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      case 2: {  // constant
2816b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        int i = rng_->NextInt(static_cast<int>(values.size()));
282c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        return Type::Constant(values[i], region_);
283c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
284b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      case 3: {  // range
285b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        int i = rng_->NextInt(static_cast<int>(integers.size()));
286b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        int j = rng_->NextInt(static_cast<int>(integers.size()));
287b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i::Handle<i::Object> min = integers[i];
288b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i::Handle<i::Object> max = integers[j];
289b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        if (min->Number() > max->Number()) std::swap(min, max);
290b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        return Type::Range(min, max, region_);
291b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
292b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      case 4: {  // context
2936b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        int depth = rng_->NextInt(3);
2947e6132b924829c353864933f29124419916db550machenbach@chromium.org        TypeHandle type = Type::Internal(region_);
2957e6132b924829c353864933f29124419916db550machenbach@chromium.org        for (int i = 0; i < depth; ++i) type = Type::Context(type, region_);
2967e6132b924829c353864933f29124419916db550machenbach@chromium.org        return type;
2977e6132b924829c353864933f29124419916db550machenbach@chromium.org      }
298b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      case 5: {  // array
2998496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle element = Fuzz(depth / 2);
3008496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        return Type::Array(element, region_);
3018496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org      }
302b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      case 6:
303b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      case 7: {  // function
3048496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle result = Fuzz(depth / 2);
3058496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle receiver = Fuzz(depth / 2);
3066b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        int arity = rng_->NextInt(3);
3078496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle type = Type::Function(result, receiver, arity, region_);
3089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int i = 0; i < type->AsFunction()->Arity(); ++i) {
3099d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org          TypeHandle parameter = Fuzz(depth / 2);
3108496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          type->AsFunction()->InitParameter(i, parameter);
3119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
3129d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org        return type;
3139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
314c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      default: {  // union
3156b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org        int n = rng_->NextInt(10);
316c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type = None;
317c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (int i = 0; i < n; ++i) {
3188496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          TypeHandle operand = Fuzz(depth - 1);
3198496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          type = Type::Union(type, operand, region_);
320c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
321c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        return type;
322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    UNREACHABLE();
3256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
3266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
327d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Region* region() { return region_; }
328d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
329c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org private:
330c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  Region* region_;
3316b0d137a5839eff3ce1a98ca9e12310027eff30fmachenbach@chromium.org  v8::base::RandomNumberGenerator* rng_;
3326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org};
3331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
334e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
3356d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region, class Rep>
3366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgstruct Tests : Rep {
337202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef Types<Type, TypeHandle, Region> TypesInstance;
338202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef typename TypesInstance::TypeVector::iterator TypeIterator;
339202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef typename TypesInstance::MapVector::iterator MapIterator;
340202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef typename TypesInstance::ValueVector::iterator ValueIterator;
341202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
3426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Isolate* isolate;
3436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HandleScope scope;
3446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Zone zone;
345202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypesInstance T;
3466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
3476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Tests() :
3486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      isolate(CcTest::i_isolate()),
3496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      scope(isolate),
3506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      zone(isolate),
3516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      T(Rep::ToRegion(&zone, isolate), isolate) {
3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
354c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  bool Equal(TypeHandle type1, TypeHandle type2) {
355c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return
3563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        type1->Equals(type2) &&
357b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        this->IsBitset(type1) == this->IsBitset(type2) &&
358b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        this->IsUnion(type1) == this->IsUnion(type2) &&
359c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        type1->NumClasses() == type2->NumClasses() &&
360c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        type1->NumConstants() == type2->NumConstants() &&
361b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        (!this->IsBitset(type1) ||
362b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          this->AsBitset(type1) == this->AsBitset(type2)) &&
363b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        (!this->IsUnion(type1) ||
364b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          this->Length(this->AsUnion(type1)) ==
365b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              this->Length(this->AsUnion(type2)));
366c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
367c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
3684452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckEqual(TypeHandle type1, TypeHandle type2) {
369c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CHECK(Equal(type1, type2));
3706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
371e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
3724452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckSub(TypeHandle type1, TypeHandle type2) {
3736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(type1->Is(type2));
3746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Is(type1));
375b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    if (this->IsBitset(type1) && this->IsBitset(type2)) {
376b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      CHECK(this->AsBitset(type1) != this->AsBitset(type2));
3776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
3781510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
3804452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckUnordered(TypeHandle type1, TypeHandle type2) {
3816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type1->Is(type2));
3826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Is(type1));
383b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    if (this->IsBitset(type1) && this->IsBitset(type2)) {
384b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      CHECK(this->AsBitset(type1) != this->AsBitset(type2));
3856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
3866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
387e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
388b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void CheckOverlap(TypeHandle type1, TypeHandle type2) {
3896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(type1->Maybe(type2));
3906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(type2->Maybe(type1));
3911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
393b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void CheckDisjoint(TypeHandle type1, TypeHandle type2) {
3946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type1->Is(type2));
3956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Is(type1));
3966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type1->Maybe(type2));
3976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Maybe(type1));
398b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  }
399b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
400b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void IsSomeType() {
401b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
402b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      TypeHandle t = *it;
403b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      CHECK(1 ==
404b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          this->IsBitset(t) + t->IsClass() + t->IsConstant() + t->IsRange() +
405b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          this->IsUnion(t) + t->IsArray() + t->IsFunction() + t->IsContext());
4066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
4076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
4081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Bitset() {
410202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // None and Any are bitsets.
411bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    CHECK(this->IsBitset(T.None));
412bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    CHECK(this->IsBitset(T.Any));
413bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org
414d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    CHECK(bitset(0) == this->AsBitset(T.None));
415d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org    CHECK(bitset(0xfffffffeu) == this->AsBitset(T.Any));
416202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
417c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Union(T1, T2) is bitset for bitsets T1,T2
418202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
419202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
420202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
421202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
422c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
423202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) ||
424c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->IsBitset(union12));
425202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
426202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
427202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
428c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Intersect(T1, T2) is bitset for bitsets T1,T2
429202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
430202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
431202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
432202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
433c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
434c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) ||
435c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->IsBitset(intersect12));
436c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
437c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
438c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
439c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Union(T1, T2) is bitset if T2 is bitset and T1->Is(T2)
440c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
441c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
442c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
443c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
444c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
445202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!(this->IsBitset(type2) && type1->Is(type2)) ||
446c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->IsBitset(union12));
447202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
448202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
449202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
450c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Union(T1, T2) is bitwise disjunction for bitsets T1,T2
451202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
452202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
453202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
454202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
455c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
456202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        if (this->IsBitset(type1) && this->IsBitset(type2)) {
457d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org          CHECK(
458d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org              (this->AsBitset(type1) | this->AsBitset(type2)) ==
459c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->AsBitset(union12));
460202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        }
461202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
462202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
463202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
464b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Intersect(T1, T2) is bitwise conjunction for bitsets T1,T2 (modulo None)
465202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
466202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
467202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
468202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
469c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
470202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        if (this->IsBitset(type1) && this->IsBitset(type2)) {
471b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          bitset bits = this->AsBitset(type1) & this->AsBitset(type2);
472d3df75b4472c9d5d4d2615aaea74d2adce4160f8machenbach@chromium.org          CHECK(
473b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (Rep::BitsetType::IsInhabited(bits) ? bits : 0) ==
474c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->AsBitset(intersect12));
475202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        }
476202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
477202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
478dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  }
479dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
4806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Class() {
481202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constructor
482202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
483202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Map> map = *mt;
484c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Class(map);
4853e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CHECK(type->IsClass());
486202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
487dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
488202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Map attribute
489202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
490202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Map> map = *mt;
491c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Class(map);
4929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CHECK(*map == *type->AsClass()->Map());
493202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
494202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
495c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2
496202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
497202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
498202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
499202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
500c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = T.Class(map1);
501c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = T.Class(map2);
502c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(Equal(type1, type2) == (*map1 == *map2));
503202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
504202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
5056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
506dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
5076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Constant() {
508202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constructor
509202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
510202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
511c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Constant(value);
5123e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CHECK(type->IsConstant());
513202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
514202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
515202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Value attribute
516202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
517202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Constant(value);
5199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CHECK(*value == *type->AsConstant()->Value());
520202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
521202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
5229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2
523202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
524202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
525c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
526c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
527c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = T.Constant(value1);
528c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = T.Constant(value2);
529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(Equal(type1, type2) == (*value1 == *value2));
530202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
531202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
5327e6132b924829c353864933f29124419916db550machenbach@chromium.org
5337e6132b924829c353864933f29124419916db550machenbach@chromium.org    // Typing of numbers
5347e6132b924829c353864933f29124419916db550machenbach@chromium.org    Factory* fac = isolate->factory();
5357e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0))->Is(T.UnsignedSmall));
5367e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(1))->Is(T.UnsignedSmall));
5377e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall));
5387e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-1))->Is(T.OtherSignedSmall));
5397e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-0x3fffffff))->Is(T.OtherSignedSmall));
5407e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-0x40000000))->Is(T.OtherSignedSmall));
5417e6132b924829c353864933f29124419916db550machenbach@chromium.org    if (SmiValuesAre31Bits()) {
5427e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31));
5437e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31));
5447e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32));
5457e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32));
5467e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32));
5477e6132b924829c353864933f29124419916db550machenbach@chromium.org    } else {
5487e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(SmiValuesAre32Bits());
5497e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall));
5507e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall));
5517e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31));
5527e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31));
5537e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSignedSmall));
5547e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSignedSmall));
5557e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSignedSmall));
5567e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32));
5577e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32));
5587e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32));
5597e6132b924829c353864933f29124419916db550machenbach@chromium.org    }
5607e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0x80000000u))->Is(T.OtherUnsigned32));
5617e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0xffffffffu))->Is(T.OtherUnsigned32));
5627e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0xffffffffu+1.0))->Is(T.OtherNumber));
5637e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-0x7fffffff-2.0))->Is(T.OtherNumber));
5647e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0.1))->Is(T.OtherNumber));
5657e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-10.1))->Is(T.OtherNumber));
5667e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(10e60))->Is(T.OtherNumber));
5677e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-1.0*0.0))->Is(T.MinusZero));
5685de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    CHECK(T.Constant(fac->NewNumber(v8::base::OS::nan_value()))->Is(T.NaN));
5697e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(V8_INFINITY))->Is(T.OtherNumber));
5707e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-V8_INFINITY))->Is(T.OtherNumber));
571202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
572202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
5737c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  void Range() {
5747c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    // Constructor
575b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) {
576b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) {
577b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i::Handle<i::Object> min = *i;
578b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i::Handle<i::Object> max = *j;
579b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        if (min->Number() > max->Number()) std::swap(min, max);
5807c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org        TypeHandle type = T.Range(min, max);
5813e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        CHECK(type->IsRange());
5827c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org      }
5837c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    }
5847c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
5857c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    // Range attributes
586b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) {
587b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) {
588b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i::Handle<i::Object> min = *i;
589b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i::Handle<i::Object> max = *j;
590b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        if (min->Number() > max->Number()) std::swap(min, max);
5917c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org        TypeHandle type = T.Range(min, max);
592b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(*min == *type->AsRange()->Min());
593b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(*max == *type->AsRange()->Max());
594b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
595b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
596b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
597b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Functionality & Injectivity:
598b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Range(min1, max1) = Range(min2, max2) <=> min1 = min2 /\ max1 = max2
599b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (ValueIterator i1 = T.integers.begin();
600b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i1 != T.integers.end(); ++i1) {
601b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (ValueIterator j1 = T.integers.begin();
602b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          j1 != T.integers.end(); ++j1) {
603b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        for (ValueIterator i2 = T.integers.begin();
604b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i2 != T.integers.end(); ++i2) {
605b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          for (ValueIterator j2 = T.integers.begin();
606b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              j2 != T.integers.end(); ++j2) {
607b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> min1 = *i1;
608b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> max1 = *j1;
609b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> min2 = *i2;
610b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> max2 = *j2;
611b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            if (min1->Number() > max1->Number()) std::swap(min1, max1);
612b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            if (min2->Number() > max2->Number()) std::swap(min2, max2);
613b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            TypeHandle type1 = T.Range(min1, max1);
614b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            TypeHandle type2 = T.Range(min2, max2);
615b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            CHECK(Equal(type1, type2) == (*min1 == *min2 && *max1 == *max2));
616b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          }
617b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        }
618b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
619b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
6207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  }
6217c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
6229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Array() {
6239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Constructor
6249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle type = T.Random();
6269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle array = T.Array1(type);
6273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      CHECK(array->IsArray());
6289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Attributes
6319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle type = T.Random();
6339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle array = T.Array1(type);
6349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CheckEqual(type, array->AsArray()->Element());
6359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Functionality & Injectivity: Array(T1) = Array(T2) iff T1 = T2
6389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle type1 = T.Random();
6419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle type2 = T.Random();
6429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle array1 = T.Array1(type1);
6439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle array2 = T.Array1(type2);
6449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        CHECK(Equal(array1, array2) == Equal(type1, type2));
6459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
6489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Function() {
6509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Constructors
6519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int k = 0; k < 20; ++k) {
6549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type1 = T.Random();
6559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type2 = T.Random();
6569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type3 = T.Random();
6579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function0 = T.Function0(type1, type2);
6589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function1 = T.Function1(type1, type2, type3);
6599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function2 = T.Function2(type1, type2, type3);
6609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(function0->IsFunction());
6619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(function1->IsFunction());
6629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(function2->IsFunction());
6639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
6649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Attributes
6689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int k = 0; k < 20; ++k) {
6719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type1 = T.Random();
6729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type2 = T.Random();
6739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type3 = T.Random();
6749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function0 = T.Function0(type1, type2);
6759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function1 = T.Function1(type1, type2, type3);
6769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function2 = T.Function2(type1, type2, type3);
6779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK_EQ(0, function0->AsFunction()->Arity());
6789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK_EQ(1, function1->AsFunction()->Arity());
6799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK_EQ(2, function2->AsFunction()->Arity());
6809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type1, function0->AsFunction()->Result());
6819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type1, function1->AsFunction()->Result());
6829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type1, function2->AsFunction()->Result());
6839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type2, function0->AsFunction()->Receiver());
6849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type2, function1->AsFunction()->Receiver());
6859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(T.Any, function2->AsFunction()->Receiver());
6869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type3, function1->AsFunction()->Parameter(0));
6879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type2, function2->AsFunction()->Parameter(0));
6889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type3, function2->AsFunction()->Parameter(1));
6899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
6909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Functionality & Injectivity: Function(Ts1) = Function(Ts2) iff Ts1 = Ts2
6949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int k = 0; k < 20; ++k) {
6979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type1 = T.Random();
6989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type2 = T.Random();
6999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type3 = T.Random();
7009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function01 = T.Function0(type1, type2);
7019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function02 = T.Function0(type1, type3);
7029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function03 = T.Function0(type3, type2);
7039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function11 = T.Function1(type1, type2, type2);
7049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function12 = T.Function1(type1, type2, type3);
7059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function21 = T.Function2(type1, type2, type2);
7069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function22 = T.Function2(type1, type2, type3);
7079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function23 = T.Function2(type1, type3, type2);
7089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function01, function02) == Equal(type2, type3));
7099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function01, function03) == Equal(type1, type3));
7109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function11, function12) == Equal(type2, type3));
7119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function21, function22) == Equal(type2, type3));
7129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function21, function23) == Equal(type2, type3));
7139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
7149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
7159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
7169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
7179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
718202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  void Of() {
719c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Is(Of(V))
720202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
721202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle const_type = T.Constant(value);
723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle of_type = T.Of(value);
724c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(const_type->Is(of_type));
725202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
726202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
727b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // If Of(V)->Is(T), then Constant(V)->Is(T)
728202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
729202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
730202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
731202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
732c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle of_type = T.Of(value);
734b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!of_type->Is(type) || const_type->Is(type));
735b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
736b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
737b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
738b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // If Constant(V)->Is(T), then Of(V)->Is(T) or T->Maybe(Constant(V))
739b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
740b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
741b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        Handle<i::Object> value = *vt;
742b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type = *it;
743b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
744b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle of_type = T.Of(value);
745b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!const_type->Is(type) ||
746b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              of_type->Is(type) || type->Maybe(const_type));
747202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
748202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
749202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
750202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
751202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  void NowOf() {
752c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->NowIs(NowOf(V))
753202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
754202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
755c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle const_type = T.Constant(value);
756c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle nowof_type = T.NowOf(value);
757c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(const_type->NowIs(nowof_type));
758202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
759202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
760c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // NowOf(V)->Is(Of(V))
761202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
762202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
763c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle nowof_type = T.NowOf(value);
764c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle of_type = T.Of(value);
765c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(nowof_type->Is(of_type));
766202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
767202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
768b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // If NowOf(V)->NowIs(T), then Constant(V)->NowIs(T)
769b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
770b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
771b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        Handle<i::Object> value = *vt;
772b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type = *it;
773b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
774b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle nowof_type = T.NowOf(value);
775b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!nowof_type->NowIs(type) || const_type->NowIs(type));
776b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
777b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
778b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
779b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // If Constant(V)->NowIs(T),
780b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // then NowOf(V)->NowIs(T) or T->Maybe(Constant(V))
781202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
782202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
783202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
784202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
785c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
786c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.NowOf(value);
787b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!const_type->NowIs(type) ||
788b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              nowof_type->NowIs(type) || type->Maybe(const_type));
789202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
790202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
791202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
792b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // If Constant(V)->Is(T),
793b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // then NowOf(V)->Is(T) or T->Maybe(Constant(V))
794202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
795202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
796202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
797202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
798c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
799c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.NowOf(value);
800c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!const_type->Is(type) ||
801b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              nowof_type->Is(type) || type->Maybe(const_type));
802202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
803202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
8042efc3e46d2de48d8859520ee7fe035c02108509bmstarzinger@chromium.org  }
8056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
806b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void BitsetGlb() {
807b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Lower: (T->BitsetGlb())->Is(T)
808d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
809d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle type = *it;
810d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle glb =
811d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region());
812b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      CHECK(glb->Is(type));
813d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
814d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
815b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Greatest: If T1->IsBitset() and T1->Is(T2), then T1->Is(T2->BitsetGlb())
816b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
817b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
818b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = *it1;
819b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = *it2;
820b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle glb2 =
821b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            Rep::BitsetType::New(Rep::BitsetType::Glb(type2), T.region());
822b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!this->IsBitset(type1) || !type1->Is(type2) || type1->Is(glb2));
823b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
824b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
825b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
826b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Monotonicity: T1->Is(T2) implies (T1->BitsetGlb())->Is(T2->BitsetGlb())
827b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
828b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
829b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = *it1;
830b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = *it2;
831b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle glb1 =
832b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            Rep::BitsetType::New(Rep::BitsetType::Glb(type1), T.region());
833b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle glb2 =
834b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            Rep::BitsetType::New(Rep::BitsetType::Glb(type2), T.region());
835b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!type1->Is(type2) || glb1->Is(glb2));
836b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
837d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
838b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  }
839d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
840b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void BitsetLub() {
841b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Upper: T->Is(T->BitsetLub())
842d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
843d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle type = *it;
844d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle lub =
845d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region());
846d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CHECK(type->Is(lub));
847d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
848d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
849b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Least: If T2->IsBitset() and T1->Is(T2), then (T1->BitsetLub())->Is(T2)
850b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
851b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
852b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = *it1;
853b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = *it2;
854b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle lub1 =
855b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            Rep::BitsetType::New(Rep::BitsetType::Lub(type1), T.region());
856b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!this->IsBitset(type2) || !type1->Is(type2) || lub1->Is(type2));
857b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
858b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
859b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
860b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Monotonicity: T1->Is(T2) implies (T1->BitsetLub())->Is(T2->BitsetLub())
861b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
862b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
863b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = *it1;
864b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = *it2;
865b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle lub1 =
866b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            Rep::BitsetType::New(Rep::BitsetType::Lub(type1), T.region());
867b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle lub2 =
868b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            Rep::BitsetType::New(Rep::BitsetType::Lub(type2), T.region());
869b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!type1->Is(type2) || lub1->Is(lub2));
870b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
871d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
872d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
873d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
8746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Is() {
875c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Least Element (Bottom): None->Is(T)
8765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8775b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
878c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(T.None->Is(type));
8795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
881c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Greatest Element (Top): T->Is(Any)
8825b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8835b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
884c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(type->Is(T.Any));
8855b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8865b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
887c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Bottom Uniqueness: T->Is(None) implies T = None
8885b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8895b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
890c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (type->Is(T.None)) CheckEqual(type, T.None);
8915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8925b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
893c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Top Uniqueness: Any->Is(T) implies T = Any
8945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
896c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (T.Any->Is(type)) CheckEqual(type, T.Any);
8975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
899c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Reflexivity: T->Is(T)
9005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
9015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
9025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      CHECK(type->Is(type));
9035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
905c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Transitivity: T1->Is(T2) and T2->Is(T3) implies T1->Is(T3)
9065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
9075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
9085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
9095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type1 = *it1;
9105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type2 = *it2;
9115b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type3 = *it3;
912202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org          CHECK(!(type1->Is(type2) && type2->Is(type3)) || type1->Is(type3));
9135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        }
9145b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
9155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
917c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Antisymmetry: T1->Is(T2) and T2->Is(T1) iff T1 = T2
918c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
919c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
920c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
921c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
922c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK((type1->Is(type2) && type2->Is(type1)) == Equal(type1, type2));
923c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
924c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
925c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
926b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Class(M1)->Is(Class(M2)) iff M1 = M2
927b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
928b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
929b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
930b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
931b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle class_type1 = T.Class(map1);
932b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle class_type2 = T.Class(map2);
933b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(class_type1->Is(class_type2) == (*map1 == *map2));
934b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
935b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
936b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
937202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V1)->Is(Constant(V2)) iff V1 = V2
938202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
939202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
940c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
941c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
942c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type1 = T.Constant(value1);
943c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type2 = T.Constant(value2);
944c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type1->Is(const_type2) == (*value1 == *value2));
945202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
946202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
947202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
948b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Range(min1, max1)->Is(Range(min2, max2)) iff
949b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // min1 >= min2 /\ max1 <= max2
950b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (ValueIterator i1 = T.integers.begin();
951b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        i1 != T.integers.end(); ++i1) {
952b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (ValueIterator j1 = T.integers.begin();
953b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          j1 != T.integers.end(); ++j1) {
954b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        for (ValueIterator i2 = T.integers.begin();
955b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org             i2 != T.integers.end(); ++i2) {
956b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          for (ValueIterator j2 = T.integers.begin();
957b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org               j2 != T.integers.end(); ++j2) {
958b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> min1 = *i1;
959b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> max1 = *j1;
960b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> min2 = *i2;
961b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            i::Handle<i::Object> max2 = *j2;
962b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            if (min1->Number() > max1->Number()) std::swap(min1, max1);
963b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            if (min2->Number() > max2->Number()) std::swap(min2, max2);
964b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            TypeHandle type1 = T.Range(min1, max1);
965b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            TypeHandle type2 = T.Range(min2, max2);
966b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            CHECK(type1->Is(type2) ==
967b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org                (min2->Number() <= min1->Number() &&
968b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org                 max1->Number() <= max2->Number()));
969b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org          }
970b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        }
971202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
972202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
973202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
974b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Context(T1)->Is(Context(T2)) iff T1 = T2
975b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
976b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
977b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle outer1 = *it1;
978b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle outer2 = *it2;
979b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = T.Context(outer1);
980b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = T.Context(outer2);
981b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(type1->Is(type2) == outer1->Equals(outer2));
982202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
983202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
984202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
985b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Array(T1)->Is(Array(T2)) iff T1 = T2
986b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
987b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
988b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle element1 = *it1;
989b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle element2 = *it2;
990b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = T.Array1(element1);
991b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = T.Array1(element2);
992b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(type1->Is(type2) == element1->Equals(element2));
993b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
994b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
995b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
996b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // Function0(S1, T1)->Is(Function0(S2, T2)) iff S1 = S2 and T1 = T2
997b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator i = T.types.begin(); i != T.types.end(); ++i) {
998b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator j = T.types.begin(); j != T.types.end(); ++j) {
999b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle result1 = *i;
1000b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle receiver1 = *j;
1001b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = T.Function0(result1, receiver1);
1002b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle result2 = T.Random();
1003b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle receiver2 = T.Random();
1004b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = T.Function0(result2, receiver2);
1005b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(type1->Is(type2) ==
1006b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            (result1->Equals(result2) && receiver1->Equals(receiver2)));
1007b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      }
1008b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    }
1009b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
1010b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // (In-)Compatibilities.
1011b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    for (TypeIterator i = T.types.begin(); i != T.types.end(); ++i) {
1012b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org      for (TypeIterator j = T.types.begin(); j != T.types.end(); ++j) {
1013b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type1 = *i;
1014b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        TypeHandle type2 = *j;
1015b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        CHECK(!type1->Is(type2) || this->IsBitset(type2) ||
1016b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              this->IsUnion(type2) || this->IsUnion(type1) ||
1017b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsClass() && type2->IsClass()) ||
1018b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsConstant() && type2->IsConstant()) ||
1019b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsConstant() && type2->IsRange()) ||
1020b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsRange() && type2->IsRange()) ||
1021b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsContext() && type2->IsContext()) ||
1022b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsArray() && type2->IsArray()) ||
1023b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              (type1->IsFunction() && type2->IsFunction()) ||
1024b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org              type1->Equals(T.None));
1025202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1026202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
10276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1028202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Basic types
10296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Boolean, T.Null);
10306d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Undefined, T.Null);
10316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Boolean, T.Undefined);
10326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
10334452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.SignedSmall, T.Number);
10346d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Signed32, T.Number);
10354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.SignedSmall, T.Signed32);
10367e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckUnordered(T.SignedSmall, T.MinusZero);
10377e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckUnordered(T.Signed32, T.Unsigned32);
10386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
10396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.UniqueName, T.Name);
10406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.String, T.Name);
10416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.InternalizedString, T.String);
10426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.InternalizedString, T.UniqueName);
10436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.InternalizedString, T.Name);
10446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Symbol, T.UniqueName);
10456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Symbol, T.Name);
10466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.String, T.UniqueName);
10476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.String, T.Symbol);
10486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.InternalizedString, T.Symbol);
10496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
10506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Object, T.Receiver);
10516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Array, T.Object);
10526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Function, T.Object);
10536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Proxy, T.Receiver);
10546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Object, T.Proxy);
10556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Array, T.Function);
10566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1057202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Structural types
10586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ObjectClass, T.Object);
10596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ArrayClass, T.Object);
10609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.ArrayClass, T.Array);
1061c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckSub(T.UninitializedClass, T.Internal);
10626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectClass, T.ArrayClass);
1063c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedClass, T.Null);
1064c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedClass, T.Undefined);
10656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
10664452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.SmiConstant, T.SignedSmall);
10676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.SmiConstant, T.Signed32);
10686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.SmiConstant, T.Number);
10696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ObjectConstant1, T.Object);
10706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ObjectConstant2, T.Object);
1071202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckSub(T.ArrayConstant, T.Object);
1072202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckSub(T.ArrayConstant, T.Array);
1073c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckSub(T.UninitializedConstant, T.Internal);
10746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ObjectConstant2);
1075202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ArrayConstant);
1076c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedConstant, T.Null);
1077c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedConstant, T.Undefined);
10786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
10796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ObjectClass);
10806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant2, T.ObjectClass);
10816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ArrayClass);
10826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant2, T.ArrayClass);
1083202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckUnordered(T.ArrayConstant, T.ObjectClass);
10849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
10857e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckSub(T.NumberArray, T.Array);
10867e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckSub(T.NumberArray, T.Object);
10879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.StringArray, T.AnyArray);
10889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
10899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.MethodFunction, T.Function);
10909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.NumberFunction1, T.Object);
10919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.SignedFunction1, T.NumberFunction1);
10929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.NumberFunction1, T.NumberFunction2);
10931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
1094dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
10955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  void NowIs() {
1096c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Least Element (Bottom): None->NowIs(T)
10975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
10985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
1099c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(T.None->NowIs(type));
11005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1102c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Greatest Element (Top): T->NowIs(Any)
11035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
11045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
1105c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(type->NowIs(T.Any));
11065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1108c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Bottom Uniqueness: T->NowIs(None) implies T = None
11095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
11105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
1111c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (type->NowIs(T.None)) CheckEqual(type, T.None);
11125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1114c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Top Uniqueness: Any->NowIs(T) implies T = Any
11155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
11165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
1117c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (T.Any->NowIs(type)) CheckEqual(type, T.Any);
11185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11195b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1120c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Reflexivity: T->NowIs(T)
11215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
11225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
11235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      CHECK(type->NowIs(type));
11245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1126c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Transitivity: T1->NowIs(T2) and T2->NowIs(T3) implies T1->NowIs(T3)
11275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
11285b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
11295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
11305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type1 = *it1;
11315b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type2 = *it2;
11325b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type3 = *it3;
1133c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->NowIs(type2) && type2->NowIs(type3)) ||
11345b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                type1->NowIs(type3));
11355b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        }
11365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
11375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1139c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Antisymmetry: T1->NowIs(T2) and T2->NowIs(T1) iff T1 = T2
1140c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1141c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1142c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1143c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1144c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK((type1->NowIs(type2) && type2->NowIs(type1)) ==
1145c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              Equal(type1, type2));
1146c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1147c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1148c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1149c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T1->Is(T2) implies T1->NowIs(T2)
11505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
11515b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
11525b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type1 = *it1;
11535b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type2 = *it2;
11545b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        CHECK(!type1->Is(type2) || type1->NowIs(type2));
11555b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
11565b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1158202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V1)->NowIs(Constant(V2)) iff V1 = V2
1159202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
1160202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
1161c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
1162c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
1163c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type1 = T.Constant(value1);
1164c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type2 = T.Constant(value2);
1165c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type1->NowIs(const_type2) == (*value1 == *value2));
1166202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1167202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1168202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1169202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Class(M1)->NowIs(Class(M2)) iff M1 = M2
1170202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
1171202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
1172202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
1173202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
1174c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type1 = T.Class(map1);
1175c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type2 = T.Class(map2);
1176c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(class_type1->NowIs(class_type2) == (*map1 == *map2));
1177202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1178202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1179202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1180202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V)->NowIs(Class(M)) iff V has map M
1181202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1182202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1183202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1184202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1185c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1186c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1187202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK((value->IsHeapObject() &&
1188202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org               i::HeapObject::cast(*value)->map() == *map)
1189c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              == const_type->NowIs(class_type));
1190202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1191202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1192202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1193c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Class(M)->NowIs(Constant(V)) never
1194202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1195202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1196202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1197202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1198c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1199c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1200c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!class_type->NowIs(const_type));
1201202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1202202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
12035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
12045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
12055b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  void Contains() {
1206c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T->Contains(V) iff Constant(V)->Is(T)
1207202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1208202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1209202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1210202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1211c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1212c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type->Contains(value) == const_type->Is(type));
1213202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1214202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1215202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
1216202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1217202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  void NowContains() {
1218c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T->NowContains(V) iff Constant(V)->NowIs(T)
1219202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1220202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1221202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1222202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1223c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1224c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type->NowContains(value) == const_type->NowIs(type));
1225202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1226202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1227202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1228c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T->Contains(V) implies T->NowContains(V)
1229202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1230202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1231202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1232202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1233202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!type->Contains(value) || type->NowContains(value));
12345b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
12355b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
12365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1237c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // NowOf(V)->Is(T) implies T->NowContains(V)
12385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1239202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
12405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type = *it;
1241202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1242c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.Of(value);
1243c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!nowof_type->NowIs(type) || type->NowContains(value));
1244202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1245202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
12465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
12475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
12486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Maybe() {
1249202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // T->Maybe(Any) iff T inhabited
1250202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1251202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      TypeHandle type = *it;
1252202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      CHECK(type->Maybe(T.Any) == type->IsInhabited());
1253202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1254202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1255202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // T->Maybe(None) never
1256202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1257202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      TypeHandle type = *it;
1258202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      CHECK(!type->Maybe(T.None));
1259202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1260202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1261c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Reflexivity upto Inhabitation: T->Maybe(T) iff T inhabited
1262c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1263c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1264c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(type->Maybe(type) == type->IsInhabited());
1265c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1266c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1267c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Symmetry: T1->Maybe(T2) iff T2->Maybe(T1)
12685b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
12695b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
12705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type1 = *it1;
12715b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type2 = *it2;
12725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        CHECK(type1->Maybe(type2) == type2->Maybe(type1));
12735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
12745b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
12755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1276c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T1->Maybe(T2) implies T1, T2 inhabited
12775b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
12785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
12795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type1 = *it1;
12805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type2 = *it2;
1281202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!type1->Maybe(type2) ||
1282202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org              (type1->IsInhabited() && type2->IsInhabited()));
1283202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1284202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1285202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1286196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    // T1->Maybe(T2) implies Intersect(T1, T2) inhabited
1287c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1288c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1289c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1290c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1291c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1292196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        CHECK(!type1->Maybe(type2) || intersect12->IsInhabited());
1293c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1294c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1295c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1296c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T1->Is(T2) and T1 inhabited implies T1->Maybe(T2)
1297202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1298202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1299202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
1300202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
1301202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!(type1->Is(type2) && type1->IsInhabited()) ||
1302202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org              type1->Maybe(type2));
1303202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1304202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1305202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1306202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2
1307202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
1308202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
1309c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
1310c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
1311c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type1 = T.Constant(value1);
1312c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type2 = T.Constant(value2);
1313c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type1->Maybe(const_type2) == (*value1 == *value2));
1314202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1315202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1316202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1317202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Class(M1)->Maybe(Class(M2)) iff M1 = M2
1318202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
1319202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
1320202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
1321202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
1322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type1 = T.Class(map1);
1323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type2 = T.Class(map2);
1324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(class_type1->Maybe(class_type2) == (*map1 == *map2));
13255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
13265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
13275b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Maybe(Class(M)) never
1329b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold!
1330b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1331202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1332202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1333202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1334202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1336c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1337c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!const_type->Maybe(class_type));
1338202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1339202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1340b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
13414452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
1342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Class(M)->Maybe(Constant(V)) never
1343b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold!
1344b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1345202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1346202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1347202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1348202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1349c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1350c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1351c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!class_type->Maybe(const_type));
1352202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1353202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1354b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1355202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1356202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Basic types
1357b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Boolean, T.Null);
1358b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Undefined, T.Null);
1359b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Boolean, T.Undefined);
1360b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.SignedSmall, T.Number);
1361b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.NaN, T.Number);
1362b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Signed32, T.NaN);
1363b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.UniqueName, T.Name);
1364b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.String, T.Name);
1365b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.InternalizedString, T.String);
1366b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.InternalizedString, T.UniqueName);
1367b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.InternalizedString, T.Name);
1368b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Symbol, T.UniqueName);
1369b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Symbol, T.Name);
1370b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.String, T.UniqueName);
1371b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.String, T.Symbol);
1372b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.InternalizedString, T.Symbol);
1373b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Object, T.Receiver);
1374b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Array, T.Object);
1375b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Function, T.Object);
1376b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Proxy, T.Receiver);
1377b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Object, T.Proxy);
1378b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Array, T.Function);
13794452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
1380202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Structural types
1381b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectClass, T.Object);
1382b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ArrayClass, T.Object);
1383b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectClass, T.ObjectClass);
1384b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ArrayClass, T.ArrayClass);
1385b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.ObjectClass, T.ArrayClass);
1386b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.SmiConstant, T.SignedSmall);
1387b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.SmiConstant, T.Signed32);
1388b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.SmiConstant, T.Number);
1389b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectConstant1, T.Object);
1390b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectConstant2, T.Object);
1391b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ArrayConstant, T.Object);
1392b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ArrayConstant, T.Array);
1393b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectConstant1, T.ObjectConstant1);
1394b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ObjectConstant2);
1395b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ArrayConstant);
1396b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ArrayClass);
1397b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.ObjectConstant2, T.ArrayClass);
1398b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.ArrayConstant, T.ObjectClass);
1399b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.NumberArray, T.Array);
1400b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.NumberArray, T.AnyArray);
1401b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.NumberArray, T.StringArray);
1402b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.MethodFunction, T.Function);
1403b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.SignedFunction1, T.NumberFunction1);
1404b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.SignedFunction1, T.NumberFunction2);
1405b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.NumberFunction1, T.NumberFunction2);
1406b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.SignedFunction1, T.MethodFunction);
1407b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectConstant1, T.ObjectClass);  // !!!
1408b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.ObjectConstant2, T.ObjectClass);  // !!!
1409b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.NumberClass, T.Intersect(T.Number, T.Untagged));  // !!!
14106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
14116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Union1() {
1413c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Identity: Union(T, None) = T
1414c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1415c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1416c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle union_type = T.Union(type, T.None);
1417c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(union_type, type);
1418c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1419c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1420c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Domination: Union(T, Any) = Any
1421c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1422c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1423c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle union_type = T.Union(type, T.Any);
1424c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(union_type, T.Any);
1425c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1426c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1427c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Idempotence: Union(T, T) = T
1428c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1429c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1430c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle union_type = T.Union(type, type);
1431c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(union_type, type);
1432c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
14336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1434c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Commutativity: Union(T1, T2) = Union(T2, T1)
1435c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1436c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1437c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1438c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1439c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
1440c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union21 = T.Union(type2, type1);
1441c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CheckEqual(union12, union21);
1442c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1443c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1444c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1445c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Associativity: Union(T1, Union(T2, T3)) = Union(Union(T1, T2), T3)
1446b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold!
1447b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1448c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1449c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1450c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1451c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1452c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1453c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1454c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union12 = T.Union(type1, type2);
1455c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1456c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union1_23 = T.Union(type1, union23);
1457c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union12_3 = T.Union(union12, type3);
1458c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CheckEqual(union1_23, union12_3);
1459c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1460c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1461c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1462b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1463c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1464c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Meet: T1->Is(Union(T1, T2)) and T2->Is(Union(T1, T2))
1465c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1466c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1467c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1468c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1469c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
1470c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type1->Is(union12));
1471c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type2->Is(union12));
1472c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1473c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1474c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1475c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Upper Boundedness: T1->Is(T2) implies Union(T1, T2) = T2
1476c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1477c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1478c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1479c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1480c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
1481c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        if (type1->Is(type2)) CheckEqual(union12, type2);
1482c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1483c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1484c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1485c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3))
1486b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1487b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1488c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1489c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1490c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1491c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1492c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1493c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1494c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union13 = T.Union(type1, type3);
1495c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1496c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!type1->Is(type2) || union13->Is(union23));
1497c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1498c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1499c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1500b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1501b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  }
1502c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1503b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void Union2() {
1504c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T3) and T2->Is(T3) implies Union(T1, T2)->Is(T3)
1505b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.  TODO(neis): Could fix this by splitting
1506b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // OtherNumber into a negative and a positive part.
1507b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1508c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1509c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1510c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1511c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1512c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1513c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1514c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union12 = T.Union(type1, type2);
1515c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type3) && type2->Is(type3)) || union12->Is(type3));
1516c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1517c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1519b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1520b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  }
1521c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1522b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void Union3() {
1523c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) or T1->Is(T3) implies T1->Is(Union(T2, T3))
1524c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1525c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1526c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1527c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1528c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1530c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1531c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type2) || type1->Is(type3)) || type1->Is(union23));
1532c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1533c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1534c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1535b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  }
15366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1537b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void Union4() {
15386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-class
15396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectClass, T.ArrayClass), T.Object);
15406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Union(T.ObjectClass, T.ArrayClass), T.Array);
1541b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Union(T.ObjectClass, T.ArrayClass), T.Array);
1542b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Union(T.ObjectClass, T.ArrayClass), T.Number);
15436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
15446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Constant-constant
15456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectConstant1, T.ObjectConstant2), T.Object);
1546c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array);
15476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(
15486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ObjectConstant2), T.ObjectClass);
15494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(
1550b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array);
15514452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(
1552b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayConstant), T.Number);
1553b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(
1554b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass);  // !!!
15556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
15569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-array
15579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array)));
15587e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(this->IsUnion(T.Union(T.NumberArray, T.Number)));
15599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
15609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(T.Union(T.AnyArray, T.Array), T.Array);
15619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.Union(T.AnyArray, T.String), T.Array);
1562b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Union(T.NumberArray, T.String), T.Object);
1563b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Union(T.NumberArray, T.String), T.Number);
15649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
15659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-function
15669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK(this->IsBitset(T.Union(T.MethodFunction, T.Function)));
15679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK(this->IsUnion(T.Union(T.NumberFunction1, T.Number)));
15689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
15699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(T.Union(T.MethodFunction, T.Function), T.Function);
15709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.Union(T.NumberFunction1, T.String), T.Function);
1571b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Union(T.NumberFunction2, T.String), T.Object);
1572b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Union(T.NumberFunction1, T.String), T.Number);
15739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
15746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-class
15754452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(
15764452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number));
15776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectClass, T.Array), T.Object);
15786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Union(T.ObjectClass, T.String), T.Array);
1579b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Union(T.ObjectClass, T.String), T.Object);
1580b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Union(T.ObjectClass, T.String), T.Number);
15816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
15826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-constant
15836d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
15846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.Signed32), T.Union(T.Object, T.Number));
15856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectConstant1, T.Array), T.Object);
15866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Union(T.ObjectConstant1, T.String), T.Array);
1587b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(T.Union(T.ObjectConstant1, T.String), T.Object);
1588b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckDisjoint(T.Union(T.ObjectConstant1, T.String), T.Number);
15896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
15906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-constant
15916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectConstant1, T.ArrayClass), T.Object);
15926d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectClass, T.Union(T.ObjectConstant1, T.ArrayClass));
15936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
15946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayClass), T.Union(T.Array, T.Object));
1595202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayClass), T.ArrayConstant);
15964452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(
1597b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectConstant2);
1598b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckOverlap(
1599b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectClass);  // !!!
16006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-union
16026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
16037e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.NaN,
16046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number));
16056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
16067e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Signed32),
16076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.Union(T.Number, T.ArrayClass)));
16086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-union
16106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
16116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectClass, T.Union(T.ObjectConstant1, T.ObjectClass)),
16126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Object);
16136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.Union(T.ArrayClass, T.ObjectConstant2), T.ArrayClass),
16156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ArrayClass, T.ObjectConstant2));
16166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Constant-union
16186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
16206d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)),
16216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
16226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
1624202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org            T.Union(T.ArrayConstant, T.ObjectConstant2), T.ObjectConstant1),
16256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
1626202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org            T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1)));
16276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Array-union
16299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
16307e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Union(T.AnyArray, T.Union(T.NumberArray, T.AnyArray)),
16317e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Union(T.AnyArray, T.NumberArray));
16327e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckSub(T.Union(T.AnyArray, T.NumberArray), T.Array);
16339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
16349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Function-union
16359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
16369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Union(T.NumberFunction1, T.NumberFunction2),
16379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Union(T.NumberFunction2, T.NumberFunction1));
16389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.Union(T.SignedFunction1, T.MethodFunction), T.Function);
16399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
16406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Union-union
16416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
16436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant2, T.ObjectConstant1),
16446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant1, T.ObjectConstant2)),
16456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
16466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
16484452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org            T.Union(T.Number, T.ArrayClass),
16494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org            T.Union(T.SignedSmall, T.Array)),
16506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.Number, T.Array));
16516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
16526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1653b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void Intersect() {
1654c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Identity: Intersect(T, Any) = T
1655c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1656c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1657c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle intersect_type = T.Intersect(type, T.Any);
1658c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(intersect_type, type);
1659c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
16606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1661c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Domination: Intersect(T, None) = None
1662c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1663c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1664c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle intersect_type = T.Intersect(type, T.None);
1665c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(intersect_type, T.None);
1666c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
16676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1668c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Idempotence: Intersect(T, T) = T
1669c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1670c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1671c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle intersect_type = T.Intersect(type, type);
1672c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(intersect_type, type);
1673c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
16746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1675c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Commutativity: Intersect(T1, T2) = Intersect(T2, T1)
1676c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1677c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1678c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1679c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1680c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1681c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect21 = T.Intersect(type2, type1);
1682c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CheckEqual(intersect12, intersect21);
1683c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1684c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
16856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1686c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Associativity:
1687c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Intersect(T1, Intersect(T2, T3)) = Intersect(Intersect(T1, T2), T3)
1688b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1689b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1690c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1691c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1692c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1693c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1694c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1695c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1696c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect12 = T.Intersect(type1, type2);
1697c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1698c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect1_23 = T.Intersect(type1, intersect23);
1699c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect12_3 = T.Intersect(intersect12, type3);
1700c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CheckEqual(intersect1_23, intersect12_3);
1701c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1702c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1703c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1704b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
17056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1706c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Join: Intersect(T1, T2)->Is(T1) and Intersect(T1, T2)->Is(T2)
1707b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.  Not even the disjunction.
1708b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1709c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1711c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1712c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1713c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1714c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(intersect12->Is(type1));
1715c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(intersect12->Is(type2));
1716c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1717c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1718b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
17196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1720c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Lower Boundedness: T1->Is(T2) implies Intersect(T1, T2) = T1
1721c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1724c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1725c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1726c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        if (type1->Is(type2)) CheckEqual(intersect12, type1);
1727c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1728c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1729c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1730c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3))
1731b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1732b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1734c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1735c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1736c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1737c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1738c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1739c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect13 = T.Intersect(type1, type3);
1740c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1741c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!type1->Is(type2) || intersect13->Is(intersect23));
1742c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1743c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1744c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1745b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
17466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1747c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T3) or T2->Is(T3) implies Intersect(T1, T2)->Is(T3)
1748b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1749b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1750c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1751c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1752c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1753c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1754c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1755c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1756c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect12 = T.Intersect(type1, type2);
1757c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type3) || type2->Is(type3)) ||
1758c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org                intersect12->Is(type3));
1759c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1760c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1761c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1762b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1763c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1764c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) and T1->Is(T3) implies T1->Is(Intersect(T2, T3))
1765b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1766b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1767c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1768c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1769c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1770c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1771c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1772c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1773c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1774c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type2) && type1->Is(type3)) ||
1775c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org                type1->Is(intersect23));
1776c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1777c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1778c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1779b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1780c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1781c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Bitset-class
17826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(T.Intersect(T.ObjectClass, T.Object), T.ObjectClass);
1783b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckEqual(T.Intersect(T.ObjectClass, T.Array), T.None);
1784b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckEqual(T.Intersect(T.ObjectClass, T.Number), T.None);
17856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
17869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-array
17877e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckEqual(T.Intersect(T.NumberArray, T.Object), T.NumberArray);
1788b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckEqual(T.Intersect(T.AnyArray, T.Function), T.None);
17899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
17909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-function
17919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction);
1792b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CheckEqual(T.Intersect(T.NumberFunction1, T.Array), T.None);
17936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
17946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-union
17956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
17966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)),
17976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ObjectClass));
1798d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1799d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number)
1800d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
18016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
18029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Class-constant
1803b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    CHECK(T.Intersect(T.ObjectConstant1, T.ObjectClass)->IsInhabited());  // !!!
1804d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(!T.Intersect(T.ArrayClass, T.ObjectConstant2)->IsInhabited());
18059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Array-union
18079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
18087e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Intersect(T.NumberArray, T.Union(T.NumberArray, T.ArrayClass)),
18097e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.NumberArray);
18109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
18119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)),
18129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.AnyArray);
1813d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1814d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.NumberArray)
1815d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
18169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Function-union
18189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
18199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)),
18209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.MethodFunction);
18219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
18229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)),
18239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.NumberFunction1);
1824d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1825d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2)
1826d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
18279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-union
18296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18306d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)),
18316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.ArrayClass);
18326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)),
18346d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.ArrayClass);
1835d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1836b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass)
1837b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            ->IsInhabited());  // !!!
18386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
18396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Constant-union
18406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
18426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)),
18436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.ObjectConstant1);
18446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.SmiConstant, T.Union(T.Number, T.ObjectConstant2)),
18466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.SmiConstant);
1847d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1848b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Intersect(
1849d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            T.Union(T.ArrayConstant, T.ObjectClass), T.ObjectConstant1)
1850b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org                ->IsInhabited());  // !!!
18516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
18526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Union-union
18536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
18556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.Number, T.ArrayClass),
18564452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org            T.Union(T.SignedSmall, T.Array)),
18574452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Union(T.SignedSmall, T.ArrayClass));
18586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
18606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.Number, T.ObjectClass),
18616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.Signed32, T.Array)),
18626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Signed32);
18636d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
18656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant2, T.ObjectConstant1),
18666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant1, T.ObjectConstant2)),
18676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
18686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
18696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
18706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(
1871b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org                T.ArrayClass,
1872b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org                T.Union(T.ObjectConstant2, T.ObjectConstant1)),
18736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(
18746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                T.ObjectConstant1,
1875202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org                T.Union(T.ArrayConstant, T.ObjectConstant2))),
1876b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org        T.Union(
1877b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            T.ArrayConstant,
1878b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org            T.Union(T.ObjectConstant2, T.ObjectConstant1)));  // !!!
18796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
1880af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1881b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  void Distributivity() {
1882d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Union(T1, Intersect(T2, T3)) = Intersect(Union(T1, T2), Union(T1, T3))
1883b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1884b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1885d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1886d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1887d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1888d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type1 = *it1;
1889d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type2 = *it2;
1890d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type3 = *it3;
1891d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union12 = T.Union(type1, type2);
1892d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union13 = T.Union(type1, type3);
1893d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1894d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union1_23 = T.Union(type1, intersect23);
1895d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect12_13 = T.Intersect(union12, union13);
1896d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          CHECK(Equal(union1_23, intersect12_13));
1897d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        }
1898d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      }
1899d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
1900b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1901d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1902d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Intersect(T1, Union(T2, T3)) = Union(Intersect(T1, T2), Intersect(T1,T3))
1903b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    // This does NOT hold.
1904b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    /*
1905d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1906d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1907d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1908d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type1 = *it1;
1909d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type2 = *it2;
1910d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type3 = *it3;
1911d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect12 = T.Intersect(type1, type2);
1912d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect13 = T.Intersect(type1, type3);
1913d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1914d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect1_23 = T.Intersect(type1, union23);
1915d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union12_13 = T.Union(intersect12, intersect13);
1916d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          CHECK(Equal(intersect1_23, union12_13));
1917d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        }
1918d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      }
1919d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
1920b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org    */
1921d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
1922d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1923af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  template<class Type2, class TypeHandle2, class Region2, class Rep2>
1924af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  void Convert() {
1925af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    Types<Type2, TypeHandle2, Region2> T2(
1926af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org        Rep2::ToRegion(&zone, isolate), isolate);
1927202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1928c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type1 = *it;
1929c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle2 type2 = T2.template Convert<Type>(type1);
1930c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type3 = T.template Convert<Type2>(type2);
1931c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(type1, type3);
1932af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    }
1933af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  }
1934eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org
1935eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  void HTypeFromType() {
1936eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1937eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1938eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        TypeHandle type1 = *it1;
1939eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        TypeHandle type2 = *it2;
1940eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        HType htype1 = HType::FromType<Type>(type1);
1941eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        HType htype2 = HType::FromType<Type>(type2);
1942eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        CHECK(!type1->Is(type2) || htype1.IsSubtypeOf(htype2));
1943eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org      }
1944eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    }
1945eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  }
1946dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org};
1947dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
19486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests;
19496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests;
19506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1951dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1952b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(IsSomeType) {
1953b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  CcTest::InitializeVM();
1954b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().IsSomeType();
1955b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().IsSomeType();
1956b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org}
1957b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
1958b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
19599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(BitsetType) {
1960dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
19616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Bitset();
19626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Bitset();
1963dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1964dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1965dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
19669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ClassType) {
1967dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
19686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Class();
19696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Class();
1970dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1971dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1972dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
19739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ConstantType) {
1974dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
19756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Constant();
19766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Constant();
1977dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1978dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1979dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
19807c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgTEST(RangeType) {
19817c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  CcTest::InitializeVM();
19827c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  ZoneTests().Range();
19837c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  HeapTests().Range();
19847c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org}
19857c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
19867c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
19879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ArrayType) {
19889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
19899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Array();
19909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Array();
19919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
19929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
19939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
19949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(FunctionType) {
19959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
19969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Function();
19979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Function();
19989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
19999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
20009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2001202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(Of) {
2002202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  CcTest::InitializeVM();
2003202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ZoneTests().Of();
2004202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  HeapTests().Of();
2005202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}
2006202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
2007202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
2008202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowOf) {
2009202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  CcTest::InitializeVM();
2010202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ZoneTests().NowOf();
2011202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  HeapTests().NowOf();
2012202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}
2013202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
2014202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
2015b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(BitsetGlb) {
2016d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CcTest::InitializeVM();
2017b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().BitsetGlb();
2018b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().BitsetGlb();
2019b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org}
2020b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
2021b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
2022b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(BitsetLub) {
2023b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  CcTest::InitializeVM();
2024b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().BitsetLub();
2025b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().BitsetLub();
2026d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
2027d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2028d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2029dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Is) {
2030dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
20316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Is();
20326d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Is();
2033dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
2034dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
2035dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
20365b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(NowIs) {
20375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CcTest::InitializeVM();
20385b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  ZoneTests().NowIs();
20395b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  HeapTests().NowIs();
20405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
20415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
20425b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
20435b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(Contains) {
20445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CcTest::InitializeVM();
20455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  ZoneTests().Contains();
20465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  HeapTests().Contains();
20475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
20485b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
20495b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
2050202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowContains) {
2051202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  CcTest::InitializeVM();
2052202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ZoneTests().NowContains();
2053202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  HeapTests().NowContains();
2054202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}
2055202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
2056202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
2057dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Maybe) {
2058dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
20596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Maybe();
20606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Maybe();
2061dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
2062dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
2063dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
20649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union1) {
20659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
20669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Union1();
20679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Union1();
20689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
20699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
20709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2071b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org/*
20729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union2) {
20739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
20749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Union2();
20759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Union2();
20769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
2077b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org*/
20789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
20799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2080b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Union3) {
2081dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
2082b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().Union3();
2083b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().Union3();
2084dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
20851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
20861510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
2087b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Union4) {
20881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
2089b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().Union4();
2090b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().Union4();
20911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
2092af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
2093af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
2094b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Intersect) {
2095e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  CcTest::InitializeVM();
2096b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().Intersect();
2097b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().Intersect();
2098e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org}
2099e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
2100e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
2101b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org/*
2102b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.orgTEST(Distributivity) {
2103d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CcTest::InitializeVM();
2104b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  ZoneTests().Distributivity();
2105b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org  HeapTests().Distributivity();
2106d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
2107b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org*/
2108b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org
2109d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
2110af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTEST(Convert) {
2111af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  CcTest::InitializeVM();
2112af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
2113af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  HeapTests().Convert<Type, Type*, Zone, ZoneRep>();
2114af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org}
2115eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org
2116eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org
2117eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.orgTEST(HTypeFromType) {
2118eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  CcTest::InitializeVM();
2119eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  ZoneTests().HTypeFromType();
2120eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  HeapTests().HTypeFromType();
2121eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org}
2122