1dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
2dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// Redistribution and use in source and binary forms, with or without
3dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// modification, are permitted provided that the following conditions are
4dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// met:
5dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//
6dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//     * Redistributions of source code must retain the above copyright
7dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//       notice, this list of conditions and the following disclaimer.
8dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//     * Redistributions in binary form must reproduce the above
9dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//       copyright notice, this list of conditions and the following
10dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//       disclaimer in the documentation and/or other materials provided
11dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//       with the distribution.
12dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//     * Neither the name of Google Inc. nor the names of its
13dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//       contributors may be used to endorse or promote products derived
14dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//       from this software without specific prior written permission.
15dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org//
16dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
28202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org#include <vector>
295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-types.h"
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h"
32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils/random-number-generator.h"
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
34dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
35dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgusing namespace v8::internal;
36dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
37c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org// Testing auxiliaries (breaking the Type abstraction).
38c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct ZoneRep {
39c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  typedef void* Struct;
40c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
41c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsStruct(Type* t, int tag) {
42c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return !IsBitset(t) && reinterpret_cast<intptr_t>(AsStruct(t)[0]) == tag;
43c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
44c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsBitset(Type* t) { return reinterpret_cast<intptr_t>(t) & 1; }
45c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsClass(Type* t) { return IsStruct(t, 0); }
46c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsConstant(Type* t) { return IsStruct(t, 1); }
477e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsContext(Type* t) { return IsStruct(t, 2); }
487e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsArray(Type* t) { return IsStruct(t, 3); }
497e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsFunction(Type* t) { return IsStruct(t, 4); }
507e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsUnion(Type* t) { return IsStruct(t, 5); }
51c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
52c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsStruct(Type* t) {
53c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return reinterpret_cast<Struct*>(t);
54c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
55c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static int AsBitset(Type* t) {
56c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return static_cast<int>(reinterpret_cast<intptr_t>(t) >> 1);
57c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
58c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Map* AsClass(Type* t) {
59c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return *static_cast<Map**>(AsStruct(t)[3]);
60c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
61c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Object* AsConstant(Type* t) {
62c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return *static_cast<Object**>(AsStruct(t)[3]);
63c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
647e6132b924829c353864933f29124419916db550machenbach@chromium.org  static Type* AsContext(Type* t) {
657e6132b924829c353864933f29124419916db550machenbach@chromium.org    return *static_cast<Type**>(AsStruct(t)[2]);
667e6132b924829c353864933f29124419916db550machenbach@chromium.org  }
67c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsUnion(Type* t) {
68c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return AsStruct(t);
69c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
70c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static int Length(Struct* structured) {
71c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return static_cast<int>(reinterpret_cast<intptr_t>(structured[1]));
72c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
73c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
74c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Zone* ToRegion(Zone* zone, Isolate* isolate) { return zone; }
75d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
76d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  struct BitsetType : Type::BitsetType {
77d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::New;
78d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::Glb;
79d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::Lub;
80d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using Type::BitsetType::InherentLub;
81d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  };
82c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org};
83c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
84c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
85c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstruct HeapRep {
86c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  typedef FixedArray Struct;
87c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
88c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsStruct(Handle<HeapType> t, int tag) {
89c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return t->IsFixedArray() && Smi::cast(AsStruct(t)->get(0))->value() == tag;
90c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
91c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static bool IsBitset(Handle<HeapType> t) { return t->IsSmi(); }
92d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static bool IsClass(Handle<HeapType> t) {
93d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    return t->IsMap() || IsStruct(t, 0);
94d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
95d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static bool IsConstant(Handle<HeapType> t) { return IsStruct(t, 1); }
967e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsContext(Handle<HeapType> t) { return IsStruct(t, 2); }
977e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsArray(Handle<HeapType> t) { return IsStruct(t, 3); }
987e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsFunction(Handle<HeapType> t) { return IsStruct(t, 4); }
997e6132b924829c353864933f29124419916db550machenbach@chromium.org  static bool IsUnion(Handle<HeapType> t) { return IsStruct(t, 5); }
100c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
101c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsStruct(Handle<HeapType> t) { return FixedArray::cast(*t); }
102c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static int AsBitset(Handle<HeapType> t) { return Smi::cast(*t)->value(); }
103d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static Map* AsClass(Handle<HeapType> t) {
104d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    return t->IsMap() ? Map::cast(*t) : Map::cast(AsStruct(t)->get(2));
105c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
106d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  static Object* AsConstant(Handle<HeapType> t) { return AsStruct(t)->get(2); }
1077e6132b924829c353864933f29124419916db550machenbach@chromium.org  static HeapType* AsContext(Handle<HeapType> t) {
1087e6132b924829c353864933f29124419916db550machenbach@chromium.org    return HeapType::cast(AsStruct(t)->get(1));
1097e6132b924829c353864933f29124419916db550machenbach@chromium.org  }
110c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Struct* AsUnion(Handle<HeapType> t) { return AsStruct(t); }
111c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static int Length(Struct* structured) { return structured->length() - 1; }
112c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
113c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  static Isolate* ToRegion(Zone* zone, Isolate* isolate) { return isolate; }
114d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
115d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  struct BitsetType : HeapType::BitsetType {
116d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::New;
117d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::Glb;
118d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::Lub;
119d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    using HeapType::BitsetType::InherentLub;
120d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    static int Glb(Handle<HeapType> type) { return Glb(*type); }
121d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    static int Lub(Handle<HeapType> type) { return Lub(*type); }
122d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    static int InherentLub(Handle<HeapType> type) { return InherentLub(*type); }
123d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  };
124c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org};
125c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
126c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region>
1286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgclass Types {
1296d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org public:
130202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  Types(Region* region, Isolate* isolate) : region_(region) {
131202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    #define DECLARE_TYPE(name, value) \
132202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      name = Type::name(region); \
133202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      types.push_back(name);
134202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    BITSET_TYPE_LIST(DECLARE_TYPE)
135202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    #undef DECLARE_TYPE
136202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
137202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    object_map = isolate->factory()->NewMap(JS_OBJECT_TYPE, 3 * kPointerSize);
138202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    array_map = isolate->factory()->NewMap(JS_ARRAY_TYPE, 4 * kPointerSize);
139202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    uninitialized_map = isolate->factory()->uninitialized_map();
140202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    ObjectClass = Type::Class(object_map, region);
141202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    ArrayClass = Type::Class(array_map, region);
142202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    UninitializedClass = Type::Class(uninitialized_map, region);
143202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
144202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    maps.push_back(object_map);
145202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    maps.push_back(array_map);
146202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    maps.push_back(uninitialized_map);
147202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapVector::iterator it = maps.begin(); it != maps.end(); ++it) {
148202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      types.push_back(Type::Class(*it, region));
149202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
150202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1516d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    smi = handle(Smi::FromInt(666), isolate);
1526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    signed32 = isolate->factory()->NewHeapNumber(0x40000000);
1536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    object1 = isolate->factory()->NewJSObjectFromMap(object_map);
1546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    object2 = isolate->factory()->NewJSObjectFromMap(object_map);
1556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    array = isolate->factory()->NewJSArray(20);
156202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    uninitialized = isolate->factory()->uninitialized_value();
1576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    SmiConstant = Type::Constant(smi, region);
1586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    Signed32Constant = Type::Constant(signed32, region);
1596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ObjectConstant1 = Type::Constant(object1, region);
1606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    ObjectConstant2 = Type::Constant(object2, region);
161202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    ArrayConstant = Type::Constant(array, region);
162202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    UninitializedConstant = Type::Constant(uninitialized, region);
163202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
164202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(smi);
165202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(signed32);
166202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(object1);
167202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(object2);
168202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(array);
169202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    values.push_back(uninitialized);
170202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueVector::iterator it = values.begin(); it != values.end(); ++it) {
171202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      types.push_back(Type::Constant(*it, region));
1725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
1735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1747e6132b924829c353864933f29124419916db550machenbach@chromium.org    NumberArray = Type::Array(Number, region);
1759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    StringArray = Type::Array(String, region);
1769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    AnyArray = Type::Array(Any, region);
1779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region);
1799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    NumberFunction1 = Type::Function(Number, Number, region);
1809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    NumberFunction2 = Type::Function(Number, Number, Number, region);
1819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    MethodFunction = Type::Function(String, Object, 0, region);
1829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 50; ++i) {
184c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      types.push_back(Fuzz());
185202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
1876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1889fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Map> object_map;
1899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Map> array_map;
1909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Map> uninitialized_map;
1919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Smi> smi;
1939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::HeapNumber> signed32;
1949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::JSObject> object1;
1959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::JSObject> object2;
1969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::JSArray> array;
1979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  Handle<i::Oddball> uninitialized;
1989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
199202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  #define DECLARE_TYPE(name, value) TypeHandle name;
200202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  BITSET_TYPE_LIST(DECLARE_TYPE)
201202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  #undef DECLARE_TYPE
2026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
2036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ObjectClass;
2046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ArrayClass;
205202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle UninitializedClass;
2066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
2076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle SmiConstant;
2086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle Signed32Constant;
2096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ObjectConstant1;
2106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle ObjectConstant2;
211202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle ArrayConstant;
212202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle UninitializedConstant;
2136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
2147e6132b924829c353864933f29124419916db550machenbach@chromium.org  TypeHandle NumberArray;
2159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle StringArray;
2169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle AnyArray;
2176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
2189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle SignedFunction1;
2199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle NumberFunction1;
2209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle NumberFunction2;
2219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle MethodFunction;
2226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
223202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef std::vector<TypeHandle> TypeVector;
224202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef std::vector<Handle<i::Map> > MapVector;
225202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef std::vector<Handle<i::Object> > ValueVector;
226202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeVector types;
227202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  MapVector maps;
228202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ValueVector values;
2295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
230202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle Of(Handle<i::Object> value) {
231202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::Of(value, region_);
232202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
233202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
234202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle NowOf(Handle<i::Object> value) {
235202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::NowOf(value, region_);
236202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
2375b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
238202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle Constant(Handle<i::Object> value) {
239202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::Constant(value, region_);
2405b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
2415b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
242202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypeHandle Class(Handle<i::Map> map) {
243202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    return Type::Class(map, region_);
2445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
2455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
2469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Array1(TypeHandle element) {
2479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return Type::Array(element, region_);
2489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Function0(TypeHandle result, TypeHandle receiver) {
2519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return Type::Function(result, receiver, 0, region_);
2529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Function1(TypeHandle result, TypeHandle receiver, TypeHandle arg) {
2559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    TypeHandle type = Type::Function(result, receiver, 1, region_);
2569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    type->AsFunction()->InitParameter(0, arg);
2579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return type;
2589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Function2(TypeHandle result, TypeHandle arg1, TypeHandle arg2) {
2619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return Type::Function(result, arg1, arg2, region_);
2629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
2646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle Union(TypeHandle t1, TypeHandle t2) {
2656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    return Type::Union(t1, t2, region_);
2666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
2676d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  TypeHandle Intersect(TypeHandle t1, TypeHandle t2) {
2686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    return Type::Intersect(t1, t2, region_);
2696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
2706d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
271af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  template<class Type2, class TypeHandle2>
272af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  TypeHandle Convert(TypeHandle2 t) {
273af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    return Type::template Convert<Type2>(t, region_);
274af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  }
275af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
2769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  TypeHandle Random() {
2779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    return types[rng_.NextInt(static_cast<int>(types.size()))];
2789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
2799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
280c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  TypeHandle Fuzz(int depth = 5) {
281c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    switch (rng_.NextInt(depth == 0 ? 3 : 20)) {
282c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      case 0: {  // bitset
283c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        int n = 0
284c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #define COUNT_BITSET_TYPES(type, value) + 1
285c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        BITSET_TYPE_LIST(COUNT_BITSET_TYPES)
286c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #undef COUNT_BITSET_TYPES
287c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        ;
288c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        int i = rng_.NextInt(n);
289c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #define PICK_BITSET_TYPE(type, value) \
290c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          if (i-- == 0) return Type::type(region_);
291c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        BITSET_TYPE_LIST(PICK_BITSET_TYPE)
292c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        #undef PICK_BITSET_TYPE
293c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        UNREACHABLE();
294c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
295c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      case 1: {  // class
296c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        int i = rng_.NextInt(static_cast<int>(maps.size()));
297c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        return Type::Class(maps[i], region_);
298c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
299c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      case 2: {  // constant
300c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        int i = rng_.NextInt(static_cast<int>(values.size()));
301c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        return Type::Constant(values[i], region_);
302c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
3037e6132b924829c353864933f29124419916db550machenbach@chromium.org      case 3: {  // context
3047e6132b924829c353864933f29124419916db550machenbach@chromium.org        int depth = rng_.NextInt(3);
3057e6132b924829c353864933f29124419916db550machenbach@chromium.org        TypeHandle type = Type::Internal(region_);
3067e6132b924829c353864933f29124419916db550machenbach@chromium.org        for (int i = 0; i < depth; ++i) type = Type::Context(type, region_);
3077e6132b924829c353864933f29124419916db550machenbach@chromium.org        return type;
3087e6132b924829c353864933f29124419916db550machenbach@chromium.org      }
3097e6132b924829c353864933f29124419916db550machenbach@chromium.org      case 4: {  // array
3108496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle element = Fuzz(depth / 2);
3118496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        return Type::Array(element, region_);
3128496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org      }
3139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      case 5:
3147e6132b924829c353864933f29124419916db550machenbach@chromium.org      case 6:
3157e6132b924829c353864933f29124419916db550machenbach@chromium.org      case 7: {  // function
3168496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle result = Fuzz(depth / 2);
3178496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle receiver = Fuzz(depth / 2);
3188496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        int arity = rng_.NextInt(3);
3198496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org        TypeHandle type = Type::Function(result, receiver, arity, region_);
3209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int i = 0; i < type->AsFunction()->Arity(); ++i) {
3218496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          TypeHandle parameter = Fuzz(depth - 1);
3228496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          type->AsFunction()->InitParameter(i, parameter);
3239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
3249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
325c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      default: {  // union
326c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        int n = rng_.NextInt(10);
327c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type = None;
328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (int i = 0; i < n; ++i) {
3298496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          TypeHandle operand = Fuzz(depth - 1);
3308496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org          type = Type::Union(type, operand, region_);
331c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
332c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        return type;
333c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
334c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    UNREACHABLE();
3366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
3376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
338d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  Region* region() { return region_; }
339d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
340c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org private:
341c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  Region* region_;
342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  RandomNumberGenerator rng_;
3436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org};
3441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
345e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
3466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtemplate<class Type, class TypeHandle, class Region, class Rep>
3476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgstruct Tests : Rep {
348202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef Types<Type, TypeHandle, Region> TypesInstance;
349202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef typename TypesInstance::TypeVector::iterator TypeIterator;
350202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef typename TypesInstance::MapVector::iterator MapIterator;
351202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  typedef typename TypesInstance::ValueVector::iterator ValueIterator;
352202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
3536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Isolate* isolate;
3546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HandleScope scope;
3556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Zone zone;
356202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  TypesInstance T;
3576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
3586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  Tests() :
3596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      isolate(CcTest::i_isolate()),
3606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      scope(isolate),
3616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      zone(isolate),
3626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      T(Rep::ToRegion(&zone, isolate), isolate) {
3631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
365c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  bool Equal(TypeHandle type1, TypeHandle type2) {
366c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    return
367c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        type1->Is(type2) && type2->Is(type1) &&
368c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Rep::IsBitset(type1) == Rep::IsBitset(type2) &&
369c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Rep::IsClass(type1) == Rep::IsClass(type2) &&
370c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Rep::IsConstant(type1) == Rep::IsConstant(type2) &&
3717e6132b924829c353864933f29124419916db550machenbach@chromium.org        Rep::IsContext(type1) == Rep::IsContext(type2) &&
372d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        Rep::IsArray(type1) == Rep::IsArray(type2) &&
373d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        Rep::IsFunction(type1) == Rep::IsFunction(type2) &&
374c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Rep::IsUnion(type1) == Rep::IsUnion(type2) &&
375c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        type1->NumClasses() == type2->NumClasses() &&
376c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        type1->NumConstants() == type2->NumConstants() &&
377c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        (!Rep::IsBitset(type1) ||
378c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          Rep::AsBitset(type1) == Rep::AsBitset(type2)) &&
379c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        (!Rep::IsClass(type1) ||
380c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          Rep::AsClass(type1) == Rep::AsClass(type2)) &&
381c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        (!Rep::IsConstant(type1) ||
382c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          Rep::AsConstant(type1) == Rep::AsConstant(type2)) &&
383d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          // TODO(rossberg): Check details of arrays, functions, bounds.
384d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          (!Rep::IsUnion(type1) ||
385c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          Rep::Length(Rep::AsUnion(type1)) == Rep::Length(Rep::AsUnion(type2)));
386c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org  }
387c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
3884452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckEqual(TypeHandle type1, TypeHandle type2) {
389c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CHECK(Equal(type1, type2));
3906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
391e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
3924452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckSub(TypeHandle type1, TypeHandle type2) {
3936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(type1->Is(type2));
3946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Is(type1));
3956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
3966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2));
3976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
3981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
3991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4004452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckUnordered(TypeHandle type1, TypeHandle type2) {
4016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type1->Is(type2));
4026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Is(type1));
4036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
4046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      CHECK_NE(Rep::AsBitset(type1), Rep::AsBitset(type2));
4056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
4066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
407e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
4084452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckOverlap(TypeHandle type1, TypeHandle type2, TypeHandle mask) {
4096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(type1->Maybe(type2));
4106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(type2->Maybe(type1));
4116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
4124452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org      CHECK_NE(0,
4134452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org          Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask));
4146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
4151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
4161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4174452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org  void CheckDisjoint(TypeHandle type1, TypeHandle type2, TypeHandle mask) {
4186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type1->Is(type2));
4196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Is(type1));
4206d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type1->Maybe(type2));
4216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CHECK(!type2->Maybe(type1));
4226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    if (Rep::IsBitset(type1) && Rep::IsBitset(type2)) {
4234452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org      CHECK_EQ(0,
4244452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org          Rep::AsBitset(type1) & Rep::AsBitset(type2) & Rep::AsBitset(mask));
4256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    }
4266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
4271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Bitset() {
429202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // None and Any are bitsets.
430bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    CHECK(this->IsBitset(T.None));
431bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    CHECK(this->IsBitset(T.Any));
432bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org
433bbbda924f939464825b508976aabe7ed128605cbmachenbach@chromium.org    CHECK_EQ(0, this->AsBitset(T.None));
434202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CHECK_EQ(-1, this->AsBitset(T.Any));
435202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
436c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Union(T1, T2) is bitset for bitsets T1,T2
437202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
438202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
439202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
440202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
441c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
442202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) ||
443c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->IsBitset(union12));
444202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
445202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
446202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
447c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Intersect(T1, T2) is bitset for bitsets T1,T2
448202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
449202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
450202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
451202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
452c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
453c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!(this->IsBitset(type1) && this->IsBitset(type2)) ||
454c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->IsBitset(intersect12));
455c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
456c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
457c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
458c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Union(T1, T2) is bitset if T2 is bitset and T1->Is(T2)
459c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
460c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
461c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
462c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
463c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
464202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!(this->IsBitset(type2) && type1->Is(type2)) ||
465c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->IsBitset(union12));
466202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
467202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
468202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
469c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Union(T1, T2) is bitwise disjunction for bitsets T1,T2
470202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
471202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
472202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
473202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
474c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
475202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        if (this->IsBitset(type1) && this->IsBitset(type2)) {
476202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org          CHECK_EQ(
477202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org              this->AsBitset(type1) | this->AsBitset(type2),
478c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->AsBitset(union12));
479202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        }
480202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
481202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
482202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
483c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Intersect(T1, T2) is bitwise conjunction for bitsets T1,T2
484202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
485202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
486202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
487202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
488c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
489202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        if (this->IsBitset(type1) && this->IsBitset(type2)) {
490202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org          CHECK_EQ(
491202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org              this->AsBitset(type1) & this->AsBitset(type2),
492c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              this->AsBitset(intersect12));
493202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        }
494202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
495202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
496dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  }
497dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
4986d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Class() {
499202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constructor
500202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
501202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Map> map = *mt;
502c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Class(map);
503c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(this->IsClass(type));
504202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
505dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
506202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Map attribute
507202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
508202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Map> map = *mt;
509c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Class(map);
5109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CHECK(*map == *type->AsClass()->Map());
511202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
512202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
513c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Functionality & Injectivity: Class(M1) = Class(M2) iff M1 = M2
514202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
515202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
516202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
517202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = T.Class(map1);
519c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = T.Class(map2);
520c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(Equal(type1, type2) == (*map1 == *map2));
521202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
522202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
5236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
524dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
5256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Constant() {
526202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constructor
527202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
528202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Constant(value);
530c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(this->IsConstant(type));
531202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
532202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
533202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Value attribute
534202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
535202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
536c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = T.Constant(value);
5379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CHECK(*value == *type->AsConstant()->Value());
538202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
539202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
5409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Functionality & Injectivity: Constant(V1) = Constant(V2) iff V1 = V2
541202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
542202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
543c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
544c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
545c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = T.Constant(value1);
546c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = T.Constant(value2);
547c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(Equal(type1, type2) == (*value1 == *value2));
548202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
549202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
5507e6132b924829c353864933f29124419916db550machenbach@chromium.org
5517e6132b924829c353864933f29124419916db550machenbach@chromium.org    // Typing of numbers
5527e6132b924829c353864933f29124419916db550machenbach@chromium.org    Factory* fac = isolate->factory();
5537e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0))->Is(T.UnsignedSmall));
5547e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(1))->Is(T.UnsignedSmall));
5557e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0x3fffffff))->Is(T.UnsignedSmall));
5567e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-1))->Is(T.OtherSignedSmall));
5577e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-0x3fffffff))->Is(T.OtherSignedSmall));
5587e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-0x40000000))->Is(T.OtherSignedSmall));
5597e6132b924829c353864933f29124419916db550machenbach@chromium.org    if (SmiValuesAre31Bits()) {
5607e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31));
5617e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31));
5627e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32));
5637e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32));
5647e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32));
5657e6132b924829c353864933f29124419916db550machenbach@chromium.org    } else {
5667e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(SmiValuesAre32Bits());
5677e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x40000000))->Is(T.UnsignedSmall));
5687e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(0x7fffffff))->Is(T.UnsignedSmall));
5697e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(0x40000000))->Is(T.OtherUnsigned31));
5707e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(0x7fffffff))->Is(T.OtherUnsigned31));
5717e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSignedSmall));
5727e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSignedSmall));
5737e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSignedSmall));
5747e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(-0x40000001))->Is(T.OtherSigned32));
5757e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(-0x7fffffff))->Is(T.OtherSigned32));
5767e6132b924829c353864933f29124419916db550machenbach@chromium.org      CHECK(!T.Constant(fac->NewNumber(-0x7fffffff-1))->Is(T.OtherSigned32));
5777e6132b924829c353864933f29124419916db550machenbach@chromium.org    }
5787e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0x80000000u))->Is(T.OtherUnsigned32));
5797e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0xffffffffu))->Is(T.OtherUnsigned32));
5807e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0xffffffffu+1.0))->Is(T.OtherNumber));
5817e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-0x7fffffff-2.0))->Is(T.OtherNumber));
5827e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(0.1))->Is(T.OtherNumber));
5837e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-10.1))->Is(T.OtherNumber));
5847e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(10e60))->Is(T.OtherNumber));
5857e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-1.0*0.0))->Is(T.MinusZero));
5867e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(OS::nan_value()))->Is(T.NaN));
5877e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(V8_INFINITY))->Is(T.OtherNumber));
5887e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(T.Constant(fac->NewNumber(-V8_INFINITY))->Is(T.OtherNumber));
589202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
590202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
5919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Array() {
5929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Constructor
5939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
5949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle type = T.Random();
5959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle array = T.Array1(type);
5969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CHECK(this->IsArray(array));
5979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
5989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
5999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Attributes
6009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle type = T.Random();
6029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      TypeHandle array = T.Array1(type);
6039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      CheckEqual(type, array->AsArray()->Element());
6049fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Functionality & Injectivity: Array(T1) = Array(T2) iff T1 = T2
6079fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6089fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6099fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle type1 = T.Random();
6109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle type2 = T.Random();
6119fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle array1 = T.Array1(type1);
6129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        TypeHandle array2 = T.Array1(type2);
6139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        CHECK(Equal(array1, array2) == Equal(type1, type2));
6149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6169fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
6179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6189fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Function() {
6199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Constructors
6209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int k = 0; k < 20; ++k) {
6239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type1 = T.Random();
6249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type2 = T.Random();
6259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type3 = T.Random();
6269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function0 = T.Function0(type1, type2);
6279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function1 = T.Function1(type1, type2, type3);
6289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function2 = T.Function2(type1, type2, type3);
6299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(function0->IsFunction());
6309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(function1->IsFunction());
6319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(function2->IsFunction());
6329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
6339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Attributes
6379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6389fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int k = 0; k < 20; ++k) {
6409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type1 = T.Random();
6419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type2 = T.Random();
6429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type3 = T.Random();
6439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function0 = T.Function0(type1, type2);
6449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function1 = T.Function1(type1, type2, type3);
6459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function2 = T.Function2(type1, type2, type3);
6469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK_EQ(0, function0->AsFunction()->Arity());
6479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK_EQ(1, function1->AsFunction()->Arity());
6489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK_EQ(2, function2->AsFunction()->Arity());
6499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type1, function0->AsFunction()->Result());
6509fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type1, function1->AsFunction()->Result());
6519fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type1, function2->AsFunction()->Result());
6529fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type2, function0->AsFunction()->Receiver());
6539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type2, function1->AsFunction()->Receiver());
6549fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(T.Any, function2->AsFunction()->Receiver());
6559fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type3, function1->AsFunction()->Parameter(0));
6569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type2, function2->AsFunction()->Parameter(0));
6579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CheckEqual(type3, function2->AsFunction()->Parameter(1));
6589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
6599fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
6629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Functionality & Injectivity: Function(Ts1) = Function(Ts2) iff Ts1 = Ts2
6639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    for (int i = 0; i < 20; ++i) {
6649fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      for (int j = 0; j < 20; ++j) {
6659fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        for (int k = 0; k < 20; ++k) {
6669fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type1 = T.Random();
6679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type2 = T.Random();
6689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle type3 = T.Random();
6699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function01 = T.Function0(type1, type2);
6709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function02 = T.Function0(type1, type3);
6719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function03 = T.Function0(type3, type2);
6729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function11 = T.Function1(type1, type2, type2);
6739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function12 = T.Function1(type1, type2, type3);
6749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function21 = T.Function2(type1, type2, type2);
6759fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function22 = T.Function2(type1, type2, type3);
6769fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          TypeHandle function23 = T.Function2(type1, type3, type2);
6779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function01, function02) == Equal(type2, type3));
6789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function01, function03) == Equal(type1, type3));
6799fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function11, function12) == Equal(type2, type3));
6809fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function21, function22) == Equal(type2, type3));
6819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org          CHECK(Equal(function21, function23) == Equal(type2, type3));
6829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        }
6839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org      }
6849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
6859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
6869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
687202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  void Of() {
688c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Is(Of(V))
689202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
690202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
691c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle const_type = T.Constant(value);
692c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle of_type = T.Of(value);
693c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(const_type->Is(of_type));
694202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
695202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
696c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Is(T) iff Of(V)->Is(T) or T->Maybe(Constant(V))
697202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
698202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
699202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
700202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
701c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
702c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle of_type = T.Of(value);
703c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type->Is(type) ==
704c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              (of_type->Is(type) || type->Maybe(const_type)));
705202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
706202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
707202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
708202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
709202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  void NowOf() {
710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->NowIs(NowOf(V))
711202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
712202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
713c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle const_type = T.Constant(value);
714c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle nowof_type = T.NowOf(value);
715c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(const_type->NowIs(nowof_type));
716202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
717202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
718c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // NowOf(V)->Is(Of(V))
719202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
720202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      Handle<i::Object> value = *vt;
721c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle nowof_type = T.NowOf(value);
722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle of_type = T.Of(value);
723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(nowof_type->Is(of_type));
724202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
725202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
726c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->NowIs(T) iff NowOf(V)->NowIs(T) or T->Maybe(Constant(V))
727202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
728202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
729202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
730202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
731c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
732c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.NowOf(value);
733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type->NowIs(type) ==
734c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              (nowof_type->NowIs(type) || type->Maybe(const_type)));
735202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
736202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
737202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
738c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Is(T) implies NowOf(V)->Is(T) or T->Maybe(Constant(V))
739202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
740202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
741202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
742202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
743c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
744c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.NowOf(value);
745c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!const_type->Is(type) ||
746c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              (nowof_type->Is(type) || type->Maybe(const_type)));
747202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
748202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
7492efc3e46d2de48d8859520ee7fe035c02108509bmstarzinger@chromium.org  }
7506d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
751d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  void Bounds() {
752d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Ordering: (T->BitsetGlb())->Is(T->BitsetLub())
753d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
754d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle type = *it;
755d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle glb =
756d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region());
757d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle lub =
758d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region());
759d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CHECK(glb->Is(lub));
760d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
761d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
762d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Lower bound: (T->BitsetGlb())->Is(T)
763d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
764d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle type = *it;
765d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle glb =
766d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region());
767d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CHECK(glb->Is(type));
768d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
769d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
770d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Upper bound: T->Is(T->BitsetLub())
771d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
772d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle type = *it;
773d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle lub =
774d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region());
775d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CHECK(type->Is(lub));
776d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
777d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
778d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Inherent bound: (T->BitsetLub())->Is(T->InherentBitsetLub())
779d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
780d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle type = *it;
781d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle lub =
782d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::Lub(type), T.region());
783d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      TypeHandle inherent =
784d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          Rep::BitsetType::New(Rep::BitsetType::InherentLub(type), T.region());
785d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      CHECK(lub->Is(inherent));
786d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
787d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
788d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
7896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Is() {
790c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Least Element (Bottom): None->Is(T)
7915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
7925b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
793c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(T.None->Is(type));
7945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
7955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
796c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Greatest Element (Top): T->Is(Any)
7975b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
7985b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
799c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(type->Is(T.Any));
8005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
802c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Bottom Uniqueness: T->Is(None) implies T = None
8035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
805c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (type->Is(T.None)) CheckEqual(type, T.None);
8065b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
808c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Top Uniqueness: Any->Is(T) implies T = Any
8095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
811c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (T.Any->Is(type)) CheckEqual(type, T.Any);
8125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
814c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Reflexivity: T->Is(T)
8155b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
8165b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
8175b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      CHECK(type->Is(type));
8185b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
820c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Transitivity: T1->Is(T2) and T2->Is(T3) implies T1->Is(T3)
8215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
8225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
8235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
8245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type1 = *it1;
8255b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type2 = *it2;
8265b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type3 = *it3;
827202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org          CHECK(!(type1->Is(type2) && type2->Is(type3)) || type1->Is(type3));
8285b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        }
8295b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
8305b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
8316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
832c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Antisymmetry: T1->Is(T2) and T2->Is(T1) iff T1 = T2
833c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
834c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
835c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
836c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
837c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK((type1->Is(type2) && type2->Is(type1)) == Equal(type1, type2));
838c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
839c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
840c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
841202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V1)->Is(Constant(V2)) iff V1 = V2
842202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
843202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
844c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
845c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
846c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type1 = T.Constant(value1);
847c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type2 = T.Constant(value2);
848c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type1->Is(const_type2) == (*value1 == *value2));
849202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
850202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
851202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
852202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Class(M1)->Is(Class(M2)) iff M1 = M2
853202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
854202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
855202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
856202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
857c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type1 = T.Class(map1);
858c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type2 = T.Class(map2);
859c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(class_type1->Is(class_type2) == (*map1 == *map2));
860202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
861202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
862202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
863c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Is(Class(M)) never
864202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
865202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
866202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
867202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
868c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle constant_type = T.Constant(value);
869c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
870c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!constant_type->Is(class_type));
871202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
872202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
873202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
874c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Class(M)->Is(Constant(V)) never
875202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
876202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
877202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
878202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
879c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle constant_type = T.Constant(value);
880c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
881c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!class_type->Is(constant_type));
882202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
883202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
8846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
885202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Basic types
8866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Boolean, T.Null);
8876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Undefined, T.Null);
8886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Boolean, T.Undefined);
8896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
8904452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.SignedSmall, T.Number);
8916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Signed32, T.Number);
8924452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.SignedSmall, T.Signed32);
8937e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckUnordered(T.SignedSmall, T.MinusZero);
8947e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckUnordered(T.Signed32, T.Unsigned32);
8956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
8966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.UniqueName, T.Name);
8976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.String, T.Name);
8986d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.InternalizedString, T.String);
8996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.InternalizedString, T.UniqueName);
9006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.InternalizedString, T.Name);
9016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Symbol, T.UniqueName);
9026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Symbol, T.Name);
9036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.String, T.UniqueName);
9046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.String, T.Symbol);
9056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.InternalizedString, T.Symbol);
9066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
9076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Object, T.Receiver);
9086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Array, T.Object);
9096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Function, T.Object);
9106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Proxy, T.Receiver);
9116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Object, T.Proxy);
9126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Array, T.Function);
9136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
914202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Structural types
9156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ObjectClass, T.Object);
9166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ArrayClass, T.Object);
9179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.ArrayClass, T.Array);
918c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckSub(T.UninitializedClass, T.Internal);
9196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectClass, T.ArrayClass);
920c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedClass, T.Null);
921c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedClass, T.Undefined);
9226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
9234452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.SmiConstant, T.SignedSmall);
9246d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.SmiConstant, T.Signed32);
9256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.SmiConstant, T.Number);
9266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ObjectConstant1, T.Object);
9276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.ObjectConstant2, T.Object);
928202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckSub(T.ArrayConstant, T.Object);
929202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckSub(T.ArrayConstant, T.Array);
930c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckSub(T.UninitializedConstant, T.Internal);
9316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ObjectConstant2);
932202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ArrayConstant);
933c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedConstant, T.Null);
934c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.UninitializedConstant, T.Undefined);
9356d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
9366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ObjectClass);
9376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant2, T.ObjectClass);
9386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant1, T.ArrayClass);
9396d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectConstant2, T.ArrayClass);
940202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckUnordered(T.ArrayConstant, T.ObjectClass);
9419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
9427e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckSub(T.NumberArray, T.Array);
9437e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckSub(T.NumberArray, T.Object);
9449fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.StringArray, T.AnyArray);
9459fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
9469fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.MethodFunction, T.Function);
9479fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.NumberFunction1, T.Object);
9489fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.SignedFunction1, T.NumberFunction1);
9499fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.NumberFunction1, T.NumberFunction2);
9501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
951dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
9525b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  void NowIs() {
953c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Least Element (Bottom): None->NowIs(T)
9545b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
9555b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
956c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(T.None->NowIs(type));
9575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9585b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
959c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Greatest Element (Top): T->NowIs(Any)
9605b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
9615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
962c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(type->NowIs(T.Any));
9635b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9645b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
965c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Bottom Uniqueness: T->NowIs(None) implies T = None
9665b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
9675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
968c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (type->NowIs(T.None)) CheckEqual(type, T.None);
9695b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
971c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Top Uniqueness: Any->NowIs(T) implies T = Any
9725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
9735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
974c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      if (T.Any->NowIs(type)) CheckEqual(type, T.Any);
9755b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
977c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Reflexivity: T->NowIs(T)
9785b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
9795b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      TypeHandle type = *it;
9805b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      CHECK(type->NowIs(type));
9815b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9825b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
983c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Transitivity: T1->NowIs(T2) and T2->NowIs(T3) implies T1->NowIs(T3)
9845b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
9855b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
9865b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
9875b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type1 = *it1;
9885b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type2 = *it2;
9895b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org          TypeHandle type3 = *it3;
990c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->NowIs(type2) && type2->NowIs(type3)) ||
9915b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org                type1->NowIs(type3));
9925b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        }
9935b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
9945b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
9955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
996c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Antisymmetry: T1->NowIs(T2) and T2->NowIs(T1) iff T1 = T2
997c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
998c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
999c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1000c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1001c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK((type1->NowIs(type2) && type2->NowIs(type1)) ==
1002c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              Equal(type1, type2));
1003c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1004c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1005c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1006c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T1->Is(T2) implies T1->NowIs(T2)
10075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
10085b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
10095b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type1 = *it1;
10105b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type2 = *it2;
10115b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        CHECK(!type1->Is(type2) || type1->NowIs(type2));
10125b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
10135b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
10145b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1015202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V1)->NowIs(Constant(V2)) iff V1 = V2
1016202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
1017202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
1018c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
1019c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
1020c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type1 = T.Constant(value1);
1021c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type2 = T.Constant(value2);
1022c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type1->NowIs(const_type2) == (*value1 == *value2));
1023202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1024202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1025202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1026202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Class(M1)->NowIs(Class(M2)) iff M1 = M2
1027202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
1028202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
1029202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
1030202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
1031c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type1 = T.Class(map1);
1032c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type2 = T.Class(map2);
1033c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(class_type1->NowIs(class_type2) == (*map1 == *map2));
1034202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1035202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1036202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1037202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V)->NowIs(Class(M)) iff V has map M
1038202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1039202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1040202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1041202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1042c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1043c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1044202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK((value->IsHeapObject() &&
1045202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org               i::HeapObject::cast(*value)->map() == *map)
1046c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org              == const_type->NowIs(class_type));
1047202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1048202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1049202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1050c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Class(M)->NowIs(Constant(V)) never
1051202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1052202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1053202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1054202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1055c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1056c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1057c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!class_type->NowIs(const_type));
1058202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1059202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
10605b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
10615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
10625b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  void Contains() {
1063c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T->Contains(V) iff Constant(V)->Is(T)
1064202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1065202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1066202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1067202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1068c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1069c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type->Contains(value) == const_type->Is(type));
1070202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1071202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1072202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1073c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Of(V)->Is(T) implies T->Contains(V)
10745b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1075202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
10765b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type = *it;
1077202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1078c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle of_type = T.Of(value);
1079c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!of_type->Is(type) || type->Contains(value));
1080202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1081202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1082202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  }
1083202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1084202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  void NowContains() {
1085c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T->NowContains(V) iff Constant(V)->NowIs(T)
1086202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1087202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1088202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1089202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1090c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1091c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type->NowContains(value) == const_type->NowIs(type));
1092202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1093202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1094202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1095c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T->Contains(V) implies T->NowContains(V)
1096202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1097202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1098202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1099202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1100202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!type->Contains(value) || type->NowContains(value));
11015b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
11025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1104c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // NowOf(V)->Is(T) implies T->NowContains(V)
11055b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1106202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
11075b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type = *it;
1108202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1109c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.Of(value);
1110c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!nowof_type->NowIs(type) || type->NowContains(value));
1111202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1112202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1113202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1114c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // NowOf(V)->NowIs(T) implies T->NowContains(V)
1115202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1116202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1117202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type = *it;
1118202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1119c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle nowof_type = T.Of(value);
1120c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!nowof_type->NowIs(type) || type->NowContains(value));
11215b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
11225b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11235b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  }
11245b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
11256d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  void Maybe() {
1126202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // T->Maybe(Any) iff T inhabited
1127202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1128202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      TypeHandle type = *it;
1129202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      CHECK(type->Maybe(T.Any) == type->IsInhabited());
1130202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1131202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1132202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // T->Maybe(None) never
1133202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1134202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      TypeHandle type = *it;
1135202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      CHECK(!type->Maybe(T.None));
1136202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1137202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1138c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Reflexivity upto Inhabitation: T->Maybe(T) iff T inhabited
1139c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1140c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1141c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CHECK(type->Maybe(type) == type->IsInhabited());
1142c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1143c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1144c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Symmetry: T1->Maybe(T2) iff T2->Maybe(T1)
11455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
11465b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
11475b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type1 = *it1;
11485b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type2 = *it2;
11495b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        CHECK(type1->Maybe(type2) == type2->Maybe(type1));
11505b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
11515b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
11525b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1153c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T1->Maybe(T2) implies T1, T2 inhabited
11545b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
11555b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
11565b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type1 = *it1;
11575b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org        TypeHandle type2 = *it2;
1158202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!type1->Maybe(type2) ||
1159202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org              (type1->IsInhabited() && type2->IsInhabited()));
1160202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1161202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1162202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1163196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    // T1->Maybe(T2) implies Intersect(T1, T2) inhabited
1164c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1165c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1166c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1167c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1168c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1169196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org        CHECK(!type1->Maybe(type2) || intersect12->IsInhabited());
1170c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1171c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1172c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1173c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // T1->Is(T2) and T1 inhabited implies T1->Maybe(T2)
1174202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1175202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1176202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type1 = *it1;
1177202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        TypeHandle type2 = *it2;
1178202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        CHECK(!(type1->Is(type2) && type1->IsInhabited()) ||
1179202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org              type1->Maybe(type2));
1180202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1181202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1182202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1183202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Constant(V1)->Maybe(Constant(V2)) iff V1 = V2
1184202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (ValueIterator vt1 = T.values.begin(); vt1 != T.values.end(); ++vt1) {
1185202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt2 = T.values.begin(); vt2 != T.values.end(); ++vt2) {
1186c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value1 = *vt1;
1187c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        Handle<i::Object> value2 = *vt2;
1188c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type1 = T.Constant(value1);
1189c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type2 = T.Constant(value2);
1190c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(const_type1->Maybe(const_type2) == (*value1 == *value2));
1191202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1192202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1193202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1194202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Class(M1)->Maybe(Class(M2)) iff M1 = M2
1195202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt1 = T.maps.begin(); mt1 != T.maps.end(); ++mt1) {
1196202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (MapIterator mt2 = T.maps.begin(); mt2 != T.maps.end(); ++mt2) {
1197202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map1 = *mt1;
1198202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map2 = *mt2;
1199c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type1 = T.Class(map1);
1200c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type2 = T.Class(map2);
1201c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(class_type1->Maybe(class_type2) == (*map1 == *map2));
12025b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org      }
12035b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org    }
12045b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1205c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Constant(V)->Maybe(Class(M)) never
1206202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1207202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1208202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1209202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1210c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1211c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1212c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!const_type->Maybe(class_type));
1213202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1214202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
12154452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
1216c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Class(M)->Maybe(Constant(V)) never
1217202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (MapIterator mt = T.maps.begin(); mt != T.maps.end(); ++mt) {
1218202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      for (ValueIterator vt = T.values.begin(); vt != T.values.end(); ++vt) {
1219202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Map> map = *mt;
1220202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        Handle<i::Object> value = *vt;
1221c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle const_type = T.Constant(value);
1222c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle class_type = T.Class(map);
1223c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(!class_type->Maybe(const_type));
1224202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org      }
1225202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    }
1226202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1227202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Basic types
12284452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Boolean, T.Null, T.Semantic);
12294452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Undefined, T.Null, T.Semantic);
12304452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Boolean, T.Undefined, T.Semantic);
12314452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
12324452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.SignedSmall, T.Number, T.Semantic);
12337e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckOverlap(T.NaN, T.Number, T.Semantic);
12347e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckDisjoint(T.Signed32, T.NaN, T.Semantic);
12354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
12364452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.UniqueName, T.Name, T.Semantic);
12374452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.String, T.Name, T.Semantic);
12384452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.InternalizedString, T.String, T.Semantic);
12394452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.InternalizedString, T.UniqueName, T.Semantic);
12404452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.InternalizedString, T.Name, T.Semantic);
12414452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Symbol, T.UniqueName, T.Semantic);
12424452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Symbol, T.Name, T.Semantic);
12434452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.String, T.UniqueName, T.Semantic);
12444452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.String, T.Symbol, T.Semantic);
12454452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.InternalizedString, T.Symbol, T.Semantic);
12464452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
12474452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Object, T.Receiver, T.Semantic);
12484452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Array, T.Object, T.Semantic);
12494452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Function, T.Object, T.Semantic);
12504452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Proxy, T.Receiver, T.Semantic);
12514452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Object, T.Proxy, T.Semantic);
12524452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Array, T.Function, T.Semantic);
12534452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
1254202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    // Structural types
12554452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ObjectClass, T.Object, T.Semantic);
12564452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ArrayClass, T.Object, T.Semantic);
12574452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ObjectClass, T.ObjectClass, T.Semantic);
12584452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ArrayClass, T.ArrayClass, T.Semantic);
12594452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.ObjectClass, T.ArrayClass, T.Semantic);
12604452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
12614452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.SmiConstant, T.SignedSmall, T.Semantic);
12624452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.SmiConstant, T.Signed32, T.Semantic);
12634452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.SmiConstant, T.Number, T.Semantic);
12644452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ObjectConstant1, T.Object, T.Semantic);
12654452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ObjectConstant2, T.Object, T.Semantic);
1266202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckOverlap(T.ArrayConstant, T.Object, T.Semantic);
1267202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckOverlap(T.ArrayConstant, T.Array, T.Semantic);
12684452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.ObjectConstant1, T.ObjectConstant1, T.Semantic);
12694452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ObjectConstant2, T.Semantic);
1270202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ArrayConstant, T.Semantic);
12714452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org
12724452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ObjectClass, T.Semantic);
12734452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.ObjectConstant2, T.ObjectClass, T.Semantic);
12744452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.ObjectConstant1, T.ArrayClass, T.Semantic);
12754452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.ObjectConstant2, T.ArrayClass, T.Semantic);
1276202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckDisjoint(T.ArrayConstant, T.ObjectClass, T.Semantic);
12779fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
12787e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckOverlap(T.NumberArray, T.Array, T.Semantic);
12797e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckDisjoint(T.NumberArray, T.AnyArray, T.Semantic);
12807e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckDisjoint(T.NumberArray, T.StringArray, T.Semantic);
12819fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
12829fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckOverlap(T.MethodFunction, T.Function, T.Semantic);
12839fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckDisjoint(T.SignedFunction1, T.NumberFunction1, T.Semantic);
12849fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckDisjoint(T.SignedFunction1, T.NumberFunction2, T.Semantic);
12859fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckDisjoint(T.NumberFunction1, T.NumberFunction2, T.Semantic);
12869fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckDisjoint(T.SignedFunction1, T.MethodFunction, T.Semantic);
12876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
12886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
12899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Union1() {
1290c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Identity: Union(T, None) = T
1291c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1292c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1293c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle union_type = T.Union(type, T.None);
1294c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(union_type, type);
1295c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1296c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1297c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Domination: Union(T, Any) = Any
1298c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1299c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1300c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle union_type = T.Union(type, T.Any);
1301c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(union_type, T.Any);
1302c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1303c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1304c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Idempotence: Union(T, T) = T
1305c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1306c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1307c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle union_type = T.Union(type, type);
1308c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(union_type, type);
1309c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
13106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1311c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Commutativity: Union(T1, T2) = Union(T2, T1)
1312c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1313c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1314c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1315c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1316c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
1317c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union21 = T.Union(type2, type1);
1318c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CheckEqual(union12, union21);
1319c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1320c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1321c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1322c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Associativity: Union(T1, Union(T2, T3)) = Union(Union(T1, T2), T3)
1323c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1324c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1325c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1326c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1327c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1328c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1329c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union12 = T.Union(type1, type2);
1330c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1331c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union1_23 = T.Union(type1, union23);
1332c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union12_3 = T.Union(union12, type3);
1333c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CheckEqual(union1_23, union12_3);
1334c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1335c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1336c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1337c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1338c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Meet: T1->Is(Union(T1, T2)) and T2->Is(Union(T1, T2))
1339c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1340c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1341c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1342c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1343c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
1344c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type1->Is(union12));
1345c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(type2->Is(union12));
1346c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1347c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1348c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1349c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Upper Boundedness: T1->Is(T2) implies Union(T1, T2) = T2
1350c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1351c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1352c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1353c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1354c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle union12 = T.Union(type1, type2);
1355c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        if (type1->Is(type2)) CheckEqual(union12, type2);
1356c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1357c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
13589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
1359c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
13609fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Union2() {
1361c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) implies Union(T1, T3)->Is(Union(T2, T3))
1362c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1363c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1364c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1365c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1366c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1367c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1368c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union13 = T.Union(type1, type3);
1369c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1370c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!type1->Is(type2) || union13->Is(union23));
1371c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1372c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1373c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1374c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1375c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T3) and T2->Is(T3) implies Union(T1, T2)->Is(T3)
1376c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1377c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1378c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1379c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1380c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1381c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1382c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union12 = T.Union(type1, type2);
1383c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type3) && type2->Is(type3)) || union12->Is(type3));
1384c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1385c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1386c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1387c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1388c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) or T1->Is(T3) implies T1->Is(Union(T2, T3))
1389c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1390c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1391c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1392c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1393c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1394c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1395c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1396c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type2) || type1->Is(type3)) || type1->Is(union23));
1397c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1398c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1399c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
14006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-class
14026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectClass, T.ArrayClass), T.Object);
14036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Union(T.ObjectClass, T.ArrayClass), T.Array);
14044452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Union(T.ObjectClass, T.ArrayClass), T.Array, T.Semantic);
14054452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Union(T.ObjectClass, T.ArrayClass), T.Number, T.Semantic);
14066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Constant-constant
14086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectConstant1, T.ObjectConstant2), T.Object);
1409c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array);
14106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(
14116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ObjectConstant2), T.ObjectClass);
14124452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(
1413202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayConstant), T.Array, T.Semantic);
14144452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(
1415202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayConstant), T.Number, T.Semantic);
14164452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(
1417c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayConstant), T.ObjectClass, T.Semantic);
14186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-array
14209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK(this->IsBitset(T.Union(T.AnyArray, T.Array)));
14217e6132b924829c353864933f29124419916db550machenbach@chromium.org    CHECK(this->IsUnion(T.Union(T.NumberArray, T.Number)));
14229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
14239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(T.Union(T.AnyArray, T.Array), T.Array);
14249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.Union(T.AnyArray, T.String), T.Array);
14257e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckOverlap(T.Union(T.NumberArray, T.String), T.Object, T.Semantic);
14267e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckDisjoint(T.Union(T.NumberArray, T.String), T.Number, T.Semantic);
14279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
14289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-function
14299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK(this->IsBitset(T.Union(T.MethodFunction, T.Function)));
14309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CHECK(this->IsUnion(T.Union(T.NumberFunction1, T.Number)));
14319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
14329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(T.Union(T.MethodFunction, T.Function), T.Function);
14339fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckUnordered(T.Union(T.NumberFunction1, T.String), T.Function);
14349fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckOverlap(T.Union(T.NumberFunction2, T.String), T.Object, T.Semantic);
14359fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckDisjoint(T.Union(T.NumberFunction1, T.String), T.Number, T.Semantic);
14369fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
14376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-class
14384452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(
14394452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Union(T.ObjectClass, T.SignedSmall), T.Union(T.Object, T.Number));
14406d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectClass, T.Array), T.Object);
14416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Union(T.ObjectClass, T.String), T.Array);
14424452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Union(T.ObjectClass, T.String), T.Object, T.Semantic);
14434452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Union(T.ObjectClass, T.String), T.Number, T.Semantic);
14446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-constant
14466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
14476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.Signed32), T.Union(T.Object, T.Number));
14486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectConstant1, T.Array), T.Object);
14496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.Union(T.ObjectConstant1, T.String), T.Array);
14504452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckOverlap(T.Union(T.ObjectConstant1, T.String), T.Object, T.Semantic);
14514452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(T.Union(T.ObjectConstant1, T.String), T.Number, T.Semantic);
14526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-constant
14546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(T.Union(T.ObjectConstant1, T.ArrayClass), T.Object);
14556d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckUnordered(T.ObjectClass, T.Union(T.ObjectConstant1, T.ArrayClass));
14566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
14576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayClass), T.Union(T.Array, T.Object));
1458202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    CheckUnordered(T.Union(T.ObjectConstant1, T.ArrayClass), T.ArrayConstant);
14594452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(
14604452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectConstant2,
14614452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Semantic);
14624452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckDisjoint(
14634452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ArrayClass), T.ObjectClass, T.Semantic);
14646d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-union
14666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
14677e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.NaN,
14686d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number));
14696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
14707e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Union(T.Union(T.ArrayClass, T.ObjectConstant1), T.Signed32),
14716d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.Union(T.Number, T.ArrayClass)));
14726d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-union
14746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckSub(
14756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectClass, T.Union(T.ObjectConstant1, T.ObjectClass)),
14766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Object);
14776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
14786d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.Union(T.ArrayClass, T.ObjectConstant2), T.ArrayClass),
14796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ArrayClass, T.ObjectConstant2));
14806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Constant-union
14826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
14836d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
14846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)),
14856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
14866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
14876d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
1488202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org            T.Union(T.ArrayConstant, T.ObjectConstant2), T.ObjectConstant1),
14896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
1490202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org            T.ObjectConstant2, T.Union(T.ArrayConstant, T.ObjectConstant1)));
14916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
14929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Array-union
14939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
14947e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Union(T.AnyArray, T.Union(T.NumberArray, T.AnyArray)),
14957e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Union(T.AnyArray, T.NumberArray));
14967e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckSub(T.Union(T.AnyArray, T.NumberArray), T.Array);
14979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
14989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Function-union
14999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
15009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Union(T.NumberFunction1, T.NumberFunction2),
15019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Union(T.NumberFunction2, T.NumberFunction1));
15029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.Union(T.SignedFunction1, T.MethodFunction), T.Function);
15039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
15046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Union-union
15056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
15066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
15076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant2, T.ObjectConstant1),
15086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant1, T.ObjectConstant2)),
15096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
15106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
15116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(
15124452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org            T.Union(T.Number, T.ArrayClass),
15134452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org            T.Union(T.SignedSmall, T.Array)),
15146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.Number, T.Array));
15156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
15166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
15179fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Intersect1() {
1518c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Identity: Intersect(T, Any) = T
1519c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1520c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1521c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle intersect_type = T.Intersect(type, T.Any);
1522c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(intersect_type, type);
1523c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15246d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1525c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Domination: Intersect(T, None) = None
1526c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1527c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1528c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle intersect_type = T.Intersect(type, T.None);
1529c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(intersect_type, T.None);
1530c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1532c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Idempotence: Intersect(T, T) = T
1533c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1534c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type = *it;
1535c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle intersect_type = T.Intersect(type, type);
1536c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(intersect_type, type);
1537c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1539c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Commutativity: Intersect(T1, T2) = Intersect(T2, T1)
1540c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1541c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1542c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1543c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1544c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1545c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect21 = T.Intersect(type2, type1);
1546c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CheckEqual(intersect12, intersect21);
1547c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1548c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15496d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1550c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Associativity:
1551c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Intersect(T1, Intersect(T2, T3)) = Intersect(Intersect(T1, T2), T3)
1552c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1553c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1554c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1555c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1556c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1557c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1558c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect12 = T.Intersect(type1, type2);
1559c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1560c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect1_23 = T.Intersect(type1, intersect23);
1561c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect12_3 = T.Intersect(intersect12, type3);
1562c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CheckEqual(intersect1_23, intersect12_3);
1563c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1564c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1565c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15666d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1567c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Join: Intersect(T1, T2)->Is(T1) and Intersect(T1, T2)->Is(T2)
1568c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1569c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1570c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1571c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1572c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1573c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(intersect12->Is(type1));
1574c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        CHECK(intersect12->Is(type2));
1575c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1576c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15776d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1578c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Lower Boundedness: T1->Is(T2) implies Intersect(T1, T2) = T1
1579c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1580c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1581c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type1 = *it1;
1582c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle type2 = *it2;
1583c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        TypeHandle intersect12 = T.Intersect(type1, type2);
1584c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        if (type1->Is(type2)) CheckEqual(intersect12, type1);
1585c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1586c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
15879fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  }
1588c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
15899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  void Intersect2() {
1590c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) implies Intersect(T1, T3)->Is(Intersect(T2, T3))
1591c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1592c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1593c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1594c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1595c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1596c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1597c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect13 = T.Intersect(type1, type3);
1598c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1599c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!type1->Is(type2) || intersect13->Is(intersect23));
1600c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1601c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1602c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
16036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1604c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T3) or T2->Is(T3) implies Intersect(T1, T2)->Is(T3)
1605c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1606c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1607c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1608c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1609c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1610c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1611c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect12 = T.Intersect(type1, type2);
1612c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type3) || type2->Is(type3)) ||
1613c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org                intersect12->Is(type3));
1614c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1615c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1616c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1617c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1618c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Monotonicity: T1->Is(T2) and T1->Is(T3) implies T1->Is(Intersect(T2, T3))
1619c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1620c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1621c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1622c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type1 = *it1;
1623c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type2 = *it2;
1624c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle type3 = *it3;
1625c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1626c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org          CHECK(!(type1->Is(type2) && type1->Is(type3)) ||
1627c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org                type1->Is(intersect23));
1628c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org        }
1629c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      }
1630c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    }
1631c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org
1632c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org    // Bitset-class
16336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(T.Intersect(T.ObjectClass, T.Object), T.ObjectClass);
16344452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.Intersect(T.ObjectClass, T.Array), T.Representation);
16354452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org    CheckSub(T.Intersect(T.ObjectClass, T.Number), T.Representation);
16366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16379fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-array
16387e6132b924829c353864933f29124419916db550machenbach@chromium.org    CheckEqual(T.Intersect(T.NumberArray, T.Object), T.NumberArray);
16399fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.Intersect(T.AnyArray, T.Function), T.Representation);
16409fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
16419fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Bitset-function
16429fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(T.Intersect(T.MethodFunction, T.Object), T.MethodFunction);
16439fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckSub(T.Intersect(T.NumberFunction1, T.Array), T.Representation);
16446d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Bitset-union
16466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.Object, T.Union(T.ObjectConstant1, T.ObjectClass)),
16486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant1, T.ObjectClass));
1649d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1650d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.ArrayClass, T.ObjectConstant1), T.Number)
1651d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
16526d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16539fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Class-constant
1654d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(!T.Intersect(T.ObjectConstant1, T.ObjectClass)->IsInhabited());
1655d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(!T.Intersect(T.ArrayClass, T.ObjectConstant2)->IsInhabited());
16569fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
16579fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Array-union
16589fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
16597e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.Intersect(T.NumberArray, T.Union(T.NumberArray, T.ArrayClass)),
16607e6132b924829c353864933f29124419916db550machenbach@chromium.org        T.NumberArray);
16619fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
16629fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Intersect(T.AnyArray, T.Union(T.Object, T.SmiConstant)),
16639fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.AnyArray);
1664d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1665d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.AnyArray, T.ArrayConstant), T.NumberArray)
1666d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
16679fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
16689fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    // Function-union
16699fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
16709fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Intersect(T.MethodFunction, T.Union(T.String, T.MethodFunction)),
16719fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.MethodFunction);
16729fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    CheckEqual(
16739fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.Intersect(T.NumberFunction1, T.Union(T.Object, T.SmiConstant)),
16749fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org        T.NumberFunction1);
1675d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1676d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.MethodFunction, T.Name), T.NumberFunction2)
1677d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
16789fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
16796d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Class-union
16806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16816d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.ArrayClass, T.Union(T.ObjectConstant2, T.ArrayClass)),
16826d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.ArrayClass);
16836d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.ArrayClass, T.Union(T.Object, T.SmiConstant)),
16856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.ArrayClass);
1686d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1687d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(T.Union(T.ObjectClass, T.ArrayConstant), T.ArrayClass)
1688d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            ->IsInhabited());
16896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
16906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Constant-union
16916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16926d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
16936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.ObjectConstant1, T.Union(T.ObjectConstant1, T.ObjectConstant2)),
16946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.ObjectConstant1);
16956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
16966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(T.SmiConstant, T.Union(T.Number, T.ObjectConstant2)),
16976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.SmiConstant);
1698d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    CHECK(
1699d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        !T.Intersect(
1700d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org            T.Union(T.ArrayConstant, T.ObjectClass), T.ObjectConstant1)
1701d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org                ->IsInhabited());
17026d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
17036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    // Union-union
17046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
17056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
17066d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.Number, T.ArrayClass),
17074452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org            T.Union(T.SignedSmall, T.Array)),
17084452a490cca1fd780af6b2a4ca946c5d0fd108bamachenbach@chromium.org        T.Union(T.SignedSmall, T.ArrayClass));
17096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
17106d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
17116d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.Number, T.ObjectClass),
17126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.Signed32, T.Array)),
17136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Signed32);
17146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
17156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
17166d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant2, T.ObjectConstant1),
17176d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(T.ObjectConstant1, T.ObjectConstant2)),
17186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
17196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org    CheckEqual(
17206d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Intersect(
17216d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(
17226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                T.Union(T.ObjectConstant2, T.ObjectConstant1), T.ArrayClass),
17236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org            T.Union(
17246d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org                T.ObjectConstant1,
1725202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org                T.Union(T.ArrayConstant, T.ObjectConstant2))),
17266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org        T.Union(T.ObjectConstant2, T.ObjectConstant1));
17276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  }
1728af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1729e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  void Distributivity1() {
1730d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Distributivity:
1731d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Union(T1, Intersect(T2, T3)) = Intersect(Union(T1, T2), Union(T1, T3))
1732d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1733d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1734d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1735d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type1 = *it1;
1736d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type2 = *it2;
1737d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type3 = *it3;
1738d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union12 = T.Union(type1, type2);
1739d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union13 = T.Union(type1, type3);
1740d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect23 = T.Intersect(type2, type3);
1741d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union1_23 = T.Union(type1, intersect23);
1742d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect12_13 = T.Intersect(union12, union13);
1743d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          CHECK(Equal(union1_23, intersect12_13));
1744d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        }
1745d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      }
1746d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
1747e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  }
1748d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1749e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  void Distributivity2() {
1750d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Distributivity:
1751d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    // Intersect(T1, Union(T2, T3)) = Union(Intersect(T1, T2), Intersect(T1,T3))
1752d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1753d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1754d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) {
1755d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type1 = *it1;
1756d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type2 = *it2;
1757d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle type3 = *it3;
1758d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect12 = T.Intersect(type1, type2);
1759d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect13 = T.Intersect(type1, type3);
1760d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union23 = T.Union(type2, type3);
1761d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle intersect1_23 = T.Intersect(type1, union23);
1762d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          TypeHandle union12_13 = T.Union(intersect12, intersect13);
1763d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org          CHECK(Equal(intersect1_23, union12_13));
1764d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org        }
1765d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      }
1766d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    }
1767d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  }
1768d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1769af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  template<class Type2, class TypeHandle2, class Region2, class Rep2>
1770af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  void Convert() {
1771af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    Types<Type2, TypeHandle2, Region2> T2(
1772af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org        Rep2::ToRegion(&zone, isolate), isolate);
1773202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org    for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
1774c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type1 = *it;
1775c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle2 type2 = T2.template Convert<Type>(type1);
1776c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      TypeHandle type3 = T.template Convert<Type2>(type2);
1777c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org      CheckEqual(type1, type3);
1778af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    }
1779af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  }
1780eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org
1781eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  void HTypeFromType() {
1782eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
1783eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org      for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
1784eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        TypeHandle type1 = *it1;
1785eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        TypeHandle type2 = *it2;
1786eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        HType htype1 = HType::FromType<Type>(type1);
1787eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        HType htype2 = HType::FromType<Type>(type2);
1788eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org        CHECK(!type1->Is(type2) || htype1.IsSubtypeOf(htype2));
1789eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org      }
1790eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    }
1791eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  }
1792dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org};
1793dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
17946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<Type, Type*, Zone, ZoneRep> ZoneTests;
17956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgtypedef Tests<HeapType, Handle<HeapType>, Isolate, HeapRep> HeapTests;
17966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org
1797dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
17989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(BitsetType) {
1799dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
18006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Bitset();
18016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Bitset();
1802dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1803dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1804dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
18059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ClassType) {
1806dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
18076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Class();
18086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Class();
1809dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1810dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1811dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
18129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ConstantType) {
1813dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
18146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Constant();
18156d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Constant();
1816dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1817dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1818dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
18199fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(ArrayType) {
18209fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
18219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Array();
18229fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Array();
18239fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
18249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18259fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(FunctionType) {
18279fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
18289fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Function();
18299fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Function();
18309fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
18319fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18329fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
1833202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(Of) {
1834202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  CcTest::InitializeVM();
1835202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ZoneTests().Of();
1836202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  HeapTests().Of();
1837202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}
1838202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1839202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1840202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowOf) {
1841202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  CcTest::InitializeVM();
1842202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ZoneTests().NowOf();
1843202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  HeapTests().NowOf();
1844202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}
1845202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1846202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1847d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.orgTEST(Bounds) {
1848d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CcTest::InitializeVM();
1849d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  ZoneTests().Bounds();
1850d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  HeapTests().Bounds();
1851d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
1852d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1853d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1854dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Is) {
1855dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
18566d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Is();
18576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Is();
1858dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1859dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1860dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
18615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(NowIs) {
18625b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CcTest::InitializeVM();
18635b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  ZoneTests().NowIs();
18645b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  HeapTests().NowIs();
18655b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
18665b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
18675b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
18685b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orgTEST(Contains) {
18695b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  CcTest::InitializeVM();
18705b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  ZoneTests().Contains();
18715b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  HeapTests().Contains();
18725b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
18735b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
18745b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
1875202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.orgTEST(NowContains) {
1876202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  CcTest::InitializeVM();
1877202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  ZoneTests().NowContains();
1878202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org  HeapTests().NowContains();
1879202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org}
1880202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1881202b1d8cd93e567672cc92f48fedc35989c47312machenbach@chromium.org
1882dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.orgTEST(Maybe) {
1883dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
18846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  ZoneTests().Maybe();
18856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  HeapTests().Maybe();
1886dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
1887dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
1888dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org
18899fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union1) {
18909fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
18919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Union1();
18929fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Union1();
18939fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
18949fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18959fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
18969fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Union2) {
18979fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  CcTest::InitializeVM();
18989fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Union2();
18999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Union2();
19009fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org}
19019fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
19029fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org
19039fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Intersect1) {
1904dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  CcTest::InitializeVM();
19059fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Intersect1();
19069fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Intersect1();
1907dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org}
19081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
19091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
19109fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.orgTEST(Intersect2) {
19111510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  CcTest::InitializeVM();
19129fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  ZoneTests().Intersect2();
19139fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org  HeapTests().Intersect2();
19141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
1915af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1916af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1917e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.orgTEST(Distributivity1) {
1918e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  CcTest::InitializeVM();
1919e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  ZoneTests().Distributivity1();
1920e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  HeapTests().Distributivity1();
1921e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org}
1922e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
1923e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org
1924e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.orgTEST(Distributivity2) {
1925d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  CcTest::InitializeVM();
1926e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  ZoneTests().Distributivity2();
1927e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org  HeapTests().Distributivity2();
1928d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org}
1929d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1930d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org
1931af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.orgTEST(Convert) {
1932af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  CcTest::InitializeVM();
1933af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
1934af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org  HeapTests().Convert<Type, Type*, Zone, ZoneRep>();
1935af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org}
1936eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org
1937eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org
1938eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.orgTEST(HTypeFromType) {
1939eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  CcTest::InitializeVM();
1940eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  ZoneTests().HTypeFromType();
1941eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  HeapTests().HTypeFromType();
1942eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org}
1943