Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: test/cctest/test-types.cc

Issue 658743002: Refine typing of addition, subtraction, multiplication, and division. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rangify (unions of) constants to get monotonicity. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/compiler/test-typer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <vector> 5 #include <vector>
6 6
7 #include "src/hydrogen-types.h" 7 #include "src/hydrogen-types.h"
8 #include "src/isolate-inl.h" 8 #include "src/isolate-inl.h"
9 #include "src/types.h" 9 #include "src/types.h"
10 #include "test/cctest/cctest.h" 10 #include "test/cctest/cctest.h"
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 integers.push_back(isolate->factory()->NewNumber(+V8_INFINITY)); 152 integers.push_back(isolate->factory()->NewNumber(+V8_INFINITY));
153 integers.push_back(isolate->factory()->NewNumber(-rng_->NextInt(10))); 153 integers.push_back(isolate->factory()->NewNumber(-rng_->NextInt(10)));
154 integers.push_back(isolate->factory()->NewNumber(+rng_->NextInt(10))); 154 integers.push_back(isolate->factory()->NewNumber(+rng_->NextInt(10)));
155 for (int i = 0; i < 10; ++i) { 155 for (int i = 0; i < 10; ++i) {
156 double x = rng_->NextInt(); 156 double x = rng_->NextInt();
157 integers.push_back(isolate->factory()->NewNumber(x)); 157 integers.push_back(isolate->factory()->NewNumber(x));
158 x *= rng_->NextInt(); 158 x *= rng_->NextInt();
159 if (!IsMinusZero(x)) integers.push_back(isolate->factory()->NewNumber(x)); 159 if (!IsMinusZero(x)) integers.push_back(isolate->factory()->NewNumber(x));
160 } 160 }
161 161
162 Integer = Type::Range(
163 isolate->factory()->NewNumber(-V8_INFINITY),
164 isolate->factory()->NewNumber(-V8_INFINITY), region);
165
162 NumberArray = Type::Array(Number, region); 166 NumberArray = Type::Array(Number, region);
163 StringArray = Type::Array(String, region); 167 StringArray = Type::Array(String, region);
164 AnyArray = Type::Array(Any, region); 168 AnyArray = Type::Array(Any, region);
165 169
166 SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region); 170 SignedFunction1 = Type::Function(SignedSmall, SignedSmall, region);
167 NumberFunction1 = Type::Function(Number, Number, region); 171 NumberFunction1 = Type::Function(Number, Number, region);
168 NumberFunction2 = Type::Function(Number, Number, Number, region); 172 NumberFunction2 = Type::Function(Number, Number, Number, region);
169 MethodFunction = Type::Function(String, Object, 0, region); 173 MethodFunction = Type::Function(String, Object, 0, region);
170 174
171 for (int i = 0; i < 30; ++i) { 175 for (int i = 0; i < 30; ++i) {
(...skipping 10 matching lines...) Expand all
182 Handle<i::HeapNumber> signed32; 186 Handle<i::HeapNumber> signed32;
183 Handle<i::JSObject> object1; 187 Handle<i::JSObject> object1;
184 Handle<i::JSObject> object2; 188 Handle<i::JSObject> object2;
185 Handle<i::JSArray> array; 189 Handle<i::JSArray> array;
186 Handle<i::Oddball> uninitialized; 190 Handle<i::Oddball> uninitialized;
187 191
188 #define DECLARE_TYPE(name, value) TypeHandle name; 192 #define DECLARE_TYPE(name, value) TypeHandle name;
189 BITSET_TYPE_LIST(DECLARE_TYPE) 193 BITSET_TYPE_LIST(DECLARE_TYPE)
190 #undef DECLARE_TYPE 194 #undef DECLARE_TYPE
191 195
196 TypeHandle Integer;
197
192 TypeHandle ObjectClass; 198 TypeHandle ObjectClass;
193 TypeHandle ArrayClass; 199 TypeHandle ArrayClass;
194 TypeHandle NumberClass; 200 TypeHandle NumberClass;
195 TypeHandle UninitializedClass; 201 TypeHandle UninitializedClass;
196 202
197 TypeHandle SmiConstant; 203 TypeHandle SmiConstant;
198 TypeHandle Signed32Constant; 204 TypeHandle Signed32Constant;
199 TypeHandle ObjectConstant1; 205 TypeHandle ObjectConstant1;
200 TypeHandle ObjectConstant2; 206 TypeHandle ObjectConstant2;
201 TypeHandle ArrayConstant; 207 TypeHandle ArrayConstant;
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 i::Handle<i::Object> max2 = *j2; 652 i::Handle<i::Object> max2 = *j2;
647 if (min1->Number() > max1->Number()) std::swap(min1, max1); 653 if (min1->Number() > max1->Number()) std::swap(min1, max1);
648 if (min2->Number() > max2->Number()) std::swap(min2, max2); 654 if (min2->Number() > max2->Number()) std::swap(min2, max2);
649 TypeHandle type1 = T.Range(min1, max1); 655 TypeHandle type1 = T.Range(min1, max1);
650 TypeHandle type2 = T.Range(min2, max2); 656 TypeHandle type2 = T.Range(min2, max2);
651 CHECK(Equal(type1, type2) == (*min1 == *min2 && *max1 == *max2)); 657 CHECK(Equal(type1, type2) == (*min1 == *min2 && *max1 == *max2));
652 } 658 }
653 } 659 }
654 } 660 }
655 } 661 }
662
663 // Weakening:
664 // 1.) Range(x,y)->Is(Range(x,y)->Weaken())
665 // 2.) Range(x,y)->Weaken()->IsRange() iff Range(x,y)->Maybe(OtherNumber)
666 for (ValueIterator i = T.integers.begin(); i != T.integers.end(); ++i) {
667 for (ValueIterator j = T.integers.begin(); j != T.integers.end(); ++j) {
668 i::Handle<i::Object> min = *i;
669 i::Handle<i::Object> max = *j;
670 if (min->Number() > max->Number()) std::swap(min, max);
671 typename Type::RangeType* range = T.Range(min, max)->AsRange();
672 CHECK(range->Is(range->Weaken(T.region())));
673 CHECK(range->Weaken(T.region())->IsRange() ==
674 range->Maybe(T.OtherNumber));
675 }
676 }
656 } 677 }
657 678
658 void Context() { 679 void Context() {
659 // Constructor 680 // Constructor
660 for (int i = 0; i < 20; ++i) { 681 for (int i = 0; i < 20; ++i) {
661 TypeHandle type = T.Random(); 682 TypeHandle type = T.Random();
662 TypeHandle context = T.Context(type); 683 TypeHandle context = T.Context(type);
663 CHECK(context->Iscontext()); 684 CHECK(context->Iscontext());
664 } 685 }
665 686
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 TypeHandle type = *it; 881 TypeHandle type = *it;
861 TypeHandle const_type = T.Constant(value); 882 TypeHandle const_type = T.Constant(value);
862 TypeHandle nowof_type = T.NowOf(value); 883 TypeHandle nowof_type = T.NowOf(value);
863 CHECK(!const_type->Is(type) || 884 CHECK(!const_type->Is(type) ||
864 nowof_type->Is(type) || type->Maybe(const_type)); 885 nowof_type->Is(type) || type->Maybe(const_type));
865 } 886 }
866 } 887 }
867 } 888 }
868 889
869 void MinMax() { 890 void MinMax() {
891 Factory* fac = isolate->factory();
892
870 // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b). 893 // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b).
871 // TODO(neis): Need to ignore representation for this to be true. 894 // TODO(neis): Need to ignore representation for this to be true.
872 /* 895 /*
873 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 896 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
874 TypeHandle type = *it; 897 TypeHandle type = *it;
875 if (this->IsBitset(type) && type->Is(T.Number) && 898 if (this->IsBitset(type) && type->Is(T.Number) &&
876 !type->Is(T.None) && !type->Is(T.NaN)) { 899 !type->Is(T.None) && !type->Is(T.NaN)) {
877 TypeHandle range = T.Range( 900 TypeHandle range = T.Range(
878 isolate->factory()->NewNumber(type->Min()), 901 isolate->factory()->NewNumber(type->Min()),
879 isolate->factory()->NewNumber(type->Max())); 902 isolate->factory()->NewNumber(type->Max()));
880 CHECK(range->Is(type)); 903 CHECK(range->Is(type));
881 } 904 }
882 } 905 }
883 */ 906 */
884 907
885 // If b is regular numeric bitset, then b->Min() and b->Max() are integers. 908 // If b is regular numeric bitset, then b->Min() and b->Max() are integers.
886 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 909 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
887 TypeHandle type = *it; 910 TypeHandle type = *it;
888 if (this->IsBitset(type) && type->Is(T.Number) && 911 if (this->IsBitset(type) && type->Is(T.Number) && !type->Is(T.NaN)) {
889 !type->Is(T.None) && !type->Is(T.NaN)) {
890 CHECK(IsInteger(type->Min()) && IsInteger(type->Max())); 912 CHECK(IsInteger(type->Min()) && IsInteger(type->Max()));
891 } 913 }
892 } 914 }
893 915
894 // If b1 and b2 are regular numeric bitsets with b1->Is(b2), then 916 // If b1 and b2 are regular numeric bitsets with b1->Is(b2), then
895 // b1->Min() >= b2->Min() and b1->Max() <= b2->Max(). 917 // b1->Min() >= b2->Min() and b1->Max() <= b2->Max().
896 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { 918 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) {
897 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { 919 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) {
898 TypeHandle type1 = *it1; 920 TypeHandle type1 = *it1;
899 TypeHandle type2 = *it2; 921 TypeHandle type2 = *it2;
900 if (this->IsBitset(type1) && type1->Is(type2) && type2->Is(T.Number) && 922 if (this->IsBitset(type1) && type1->Is(type2) && type2->Is(T.Number) &&
901 !type1->Is(T.NaN) && !type2->Is(T.NaN)) { 923 !type1->Is(T.NaN) && !type2->Is(T.NaN)) {
902 CHECK(type1->Min() >= type2->Min()); 924 CHECK(type1->Min() >= type2->Min());
903 CHECK(type1->Max() <= type2->Max()); 925 CHECK(type1->Max() <= type2->Max());
904 } 926 }
905 } 927 }
906 } 928 }
907 929
908 // Lub(Range(x,y))->Min() <= x and y <= Lub(Range(x,y))->Max() 930 // Lub(Range(x,y))->Min() <= x and y <= Lub(Range(x,y))->Max()
909 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 931 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
910 TypeHandle type = *it; 932 TypeHandle type = *it;
911 if (type->IsRange()) { 933 if (type->IsRange()) {
912 TypeHandle lub = Rep::BitsetType::New( 934 TypeHandle lub = Rep::BitsetType::New(
913 Rep::BitsetType::Lub(type), T.region()); 935 Rep::BitsetType::Lub(type), T.region());
914 CHECK(lub->Min() <= type->Min() && type->Max() <= lub->Max()); 936 CHECK(lub->Min() <= type->Min() && type->Max() <= lub->Max());
915 } 937 }
916 } 938 }
939
940 // Rangification: If T->Is(Range(-inf,+inf)) and !T->Is(None), then
941 // T->Is(Range(T->Min(), T->Max())).
942 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
943 TypeHandle type = *it;
944 CHECK(
945 !(type->Is(T.Integer) && !type->Is(T.None)) ||
946 type->Is(T.Range(
947 fac->NewNumber(type->Min()), fac->NewNumber(type->Max()))));
948 }
917 } 949 }
918 950
919 void BitsetGlb() { 951 void BitsetGlb() {
920 // Lower: (T->BitsetGlb())->Is(T) 952 // Lower: (T->BitsetGlb())->Is(T)
921 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { 953 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) {
922 TypeHandle type = *it; 954 TypeHandle type = *it;
923 TypeHandle glb = 955 TypeHandle glb =
924 Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region()); 956 Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region());
925 CHECK(glb->Is(type)); 957 CHECK(glb->Is(type));
926 } 958 }
(...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after
2302 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); 2334 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>();
2303 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); 2335 HeapTests().Convert<Type, Type*, Zone, ZoneRep>();
2304 } 2336 }
2305 2337
2306 2338
2307 TEST(HTypeFromType) { 2339 TEST(HTypeFromType) {
2308 CcTest::InitializeVM(); 2340 CcTest::InitializeVM();
2309 ZoneTests().HTypeFromType(); 2341 ZoneTests().HTypeFromType();
2310 HeapTests().HTypeFromType(); 2342 HeapTests().HTypeFromType();
2311 } 2343 }
OLDNEW
« no previous file with comments | « test/cctest/compiler/test-typer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698