| OLD | NEW |
| 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 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 TypeHandle type = *it; | 583 TypeHandle type = *it; |
| 584 TypeHandle const_type = T.Constant(value); | 584 TypeHandle const_type = T.Constant(value); |
| 585 TypeHandle nowof_type = T.NowOf(value); | 585 TypeHandle nowof_type = T.NowOf(value); |
| 586 CHECK(!const_type->Is(type) || | 586 CHECK(!const_type->Is(type) || |
| 587 nowof_type->Is(type) || type->Maybe(const_type)); | 587 nowof_type->Is(type) || type->Maybe(const_type)); |
| 588 } | 588 } |
| 589 } | 589 } |
| 590 } | 590 } |
| 591 | 591 |
| 592 void MinMax() { | 592 void MinMax() { |
| 593 Factory* fac = isolate->factory(); |
| 594 |
| 593 // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b). | 595 // If b is regular numeric bitset, then Range(b->Min(), b->Max())->Is(b). |
| 594 // TODO(neis): Need to ignore representation for this to be true. | 596 // TODO(neis): Need to ignore representation for this to be true. |
| 595 /* | 597 /* |
| 596 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 598 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 597 TypeHandle type = *it; | 599 TypeHandle type = *it; |
| 598 if (this->IsBitset(type) && type->Is(T.Number) && | 600 if (this->IsBitset(type) && type->Is(T.Number) && |
| 599 !type->Is(T.None) && !type->Is(T.NaN)) { | 601 !type->Is(T.None) && !type->Is(T.NaN)) { |
| 600 TypeHandle range = T.Range( | 602 TypeHandle range = T.Range( |
| 601 isolate->factory()->NewNumber(type->Min()), | 603 isolate->factory()->NewNumber(type->Min()), |
| 602 isolate->factory()->NewNumber(type->Max())); | 604 isolate->factory()->NewNumber(type->Max())); |
| 603 CHECK(range->Is(type)); | 605 CHECK(range->Is(type)); |
| 604 } | 606 } |
| 605 } | 607 } |
| 606 */ | 608 */ |
| 607 | 609 |
| 608 // If b is regular numeric bitset, then b->Min() and b->Max() are integers. | 610 // If b is regular numeric bitset, then b->Min() and b->Max() are integers. |
| 609 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 611 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 610 TypeHandle type = *it; | 612 TypeHandle type = *it; |
| 611 if (this->IsBitset(type) && type->Is(T.Number) && | 613 if (this->IsBitset(type) && type->Is(T.Number) && !type->Is(T.NaN)) { |
| 612 !type->Is(T.None) && !type->Is(T.NaN)) { | |
| 613 CHECK(IsInteger(type->Min()) && IsInteger(type->Max())); | 614 CHECK(IsInteger(type->Min()) && IsInteger(type->Max())); |
| 614 } | 615 } |
| 615 } | 616 } |
| 616 | 617 |
| 617 // If b1 and b2 are regular numeric bitsets with b1->Is(b2), then | 618 // If b1 and b2 are regular numeric bitsets with b1->Is(b2), then |
| 618 // b1->Min() >= b2->Min() and b1->Max() <= b2->Max(). | 619 // b1->Min() >= b2->Min() and b1->Max() <= b2->Max(). |
| 619 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { | 620 for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
| 620 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { | 621 for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
| 621 TypeHandle type1 = *it1; | 622 TypeHandle type1 = *it1; |
| 622 TypeHandle type2 = *it2; | 623 TypeHandle type2 = *it2; |
| 623 if (this->IsBitset(type1) && type1->Is(type2) && type2->Is(T.Number) && | 624 if (this->IsBitset(type1) && type1->Is(type2) && type2->Is(T.Number) && |
| 624 !type1->Is(T.NaN) && !type2->Is(T.NaN)) { | 625 !type1->Is(T.NaN) && !type2->Is(T.NaN)) { |
| 625 CHECK(type1->Min() >= type2->Min()); | 626 CHECK(type1->Min() >= type2->Min()); |
| 626 CHECK(type1->Max() <= type2->Max()); | 627 CHECK(type1->Max() <= type2->Max()); |
| 627 } | 628 } |
| 628 } | 629 } |
| 629 } | 630 } |
| 630 | 631 |
| 631 // Lub(Range(x,y))->Min() <= x and y <= Lub(Range(x,y))->Max() | 632 // Lub(Range(x,y))->Min() <= x and y <= Lub(Range(x,y))->Max() |
| 632 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 633 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 633 TypeHandle type = *it; | 634 TypeHandle type = *it; |
| 634 if (type->IsRange()) { | 635 if (type->IsRange()) { |
| 635 TypeHandle lub = Rep::BitsetType::New( | 636 TypeHandle lub = Rep::BitsetType::New( |
| 636 Rep::BitsetType::Lub(type), T.region()); | 637 Rep::BitsetType::Lub(type), T.region()); |
| 637 CHECK(lub->Min() <= type->Min() && type->Max() <= lub->Max()); | 638 CHECK(lub->Min() <= type->Min() && type->Max() <= lub->Max()); |
| 638 } | 639 } |
| 639 } | 640 } |
| 641 |
| 642 // Rangification: If T->Is(Range(-inf,+inf)) and !T->Is(None), then |
| 643 // T->Is(Range(T->Min(), T->Max())). |
| 644 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 645 TypeHandle type = *it; |
| 646 CHECK(!(type->Is(T.Integer) && !type->Is(T.None)) || |
| 647 type->Is(T.Range(fac->NewNumber(type->Min()), |
| 648 fac->NewNumber(type->Max())))); |
| 649 } |
| 640 } | 650 } |
| 641 | 651 |
| 642 void BitsetGlb() { | 652 void BitsetGlb() { |
| 643 // Lower: (T->BitsetGlb())->Is(T) | 653 // Lower: (T->BitsetGlb())->Is(T) |
| 644 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { | 654 for (TypeIterator it = T.types.begin(); it != T.types.end(); ++it) { |
| 645 TypeHandle type = *it; | 655 TypeHandle type = *it; |
| 646 TypeHandle glb = | 656 TypeHandle glb = |
| 647 Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region()); | 657 Rep::BitsetType::New(Rep::BitsetType::Glb(type), T.region()); |
| 648 CHECK(glb->Is(type)); | 658 CHECK(glb->Is(type)); |
| 649 } | 659 } |
| (...skipping 1375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2025 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); | 2035 ZoneTests().Convert<HeapType, Handle<HeapType>, Isolate, HeapRep>(); |
| 2026 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); | 2036 HeapTests().Convert<Type, Type*, Zone, ZoneRep>(); |
| 2027 } | 2037 } |
| 2028 | 2038 |
| 2029 | 2039 |
| 2030 TEST(HTypeFromType) { | 2040 TEST(HTypeFromType) { |
| 2031 CcTest::InitializeVM(); | 2041 CcTest::InitializeVM(); |
| 2032 ZoneTests().HTypeFromType(); | 2042 ZoneTests().HTypeFromType(); |
| 2033 HeapTests().HTypeFromType(); | 2043 HeapTests().HTypeFromType(); |
| 2034 } | 2044 } |
| OLD | NEW |