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

Side by Side Diff: src/compiler/typer.cc

Issue 2320473003: [turbofan] Typer changes to avoid Type representation dimension (Closed)
Patch Set: A few more changes. Created 4 years, 3 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
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 "src/compiler/typer.h" 5 #include "src/compiler/typer.h"
6 6
7 #include <iomanip> 7 #include <iomanip>
8 8
9 #include "src/base/flags.h" 9 #include "src/base/flags.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 509
510 510
511 Type* Typer::Visitor::ObjectIsReceiver(Type* type, Typer* t) { 511 Type* Typer::Visitor::ObjectIsReceiver(Type* type, Typer* t) {
512 if (type->Is(Type::Receiver())) return t->singleton_true_; 512 if (type->Is(Type::Receiver())) return t->singleton_true_;
513 if (!type->Maybe(Type::Receiver())) return t->singleton_false_; 513 if (!type->Maybe(Type::Receiver())) return t->singleton_false_;
514 return Type::Boolean(); 514 return Type::Boolean();
515 } 515 }
516 516
517 517
518 Type* Typer::Visitor::ObjectIsSmi(Type* type, Typer* t) { 518 Type* Typer::Visitor::ObjectIsSmi(Type* type, Typer* t) {
519 if (type->Is(Type::TaggedSigned())) return t->singleton_true_; 519 if (!type->Maybe(Type::SignedSmall())) return t->singleton_false_;
520 if (type->Is(Type::TaggedPointer())) return t->singleton_false_;
521 return Type::Boolean(); 520 return Type::Boolean();
522 } 521 }
523 522
524 Type* Typer::Visitor::ObjectIsString(Type* type, Typer* t) { 523 Type* Typer::Visitor::ObjectIsString(Type* type, Typer* t) {
525 if (type->Is(Type::String())) return t->singleton_true_; 524 if (type->Is(Type::String())) return t->singleton_true_;
526 if (!type->Maybe(Type::String())) return t->singleton_false_; 525 if (!type->Maybe(Type::String())) return t->singleton_false_;
527 return Type::Boolean(); 526 return Type::Boolean();
528 } 527 }
529 528
530 Type* Typer::Visitor::ObjectIsUndetectable(Type* type, Typer* t) { 529 Type* Typer::Visitor::ObjectIsUndetectable(Type* type, Typer* t) {
(...skipping 1049 matching lines...) Expand 10 before | Expand all | Expand 10 after
1580 Type* arg = Operand(node, 0); 1579 Type* arg = Operand(node, 0);
1581 return Type::Intersect(arg, Type::String(), zone()); 1580 return Type::Intersect(arg, Type::String(), zone());
1582 } 1581 }
1583 1582
1584 Type* Typer::Visitor::TypeCheckIf(Node* node) { 1583 Type* Typer::Visitor::TypeCheckIf(Node* node) {
1585 UNREACHABLE(); 1584 UNREACHABLE();
1586 return nullptr; 1585 return nullptr;
1587 } 1586 }
1588 1587
1589 Type* Typer::Visitor::TypeCheckTaggedPointer(Node* node) { 1588 Type* Typer::Visitor::TypeCheckTaggedPointer(Node* node) {
1590 Type* arg = Operand(node, 0); 1589 Type* type = Operand(node, 0);
1591 return Type::Intersect(arg, Type::TaggedPointer(), zone()); 1590 return type;
1592 } 1591 }
1593 1592
1594 Type* Typer::Visitor::TypeCheckTaggedSigned(Node* node) { 1593 Type* Typer::Visitor::TypeCheckTaggedSigned(Node* node) {
1595 Type* arg = Operand(node, 0); 1594 Type* arg = Operand(node, 0);
1596 return Type::Intersect(arg, typer_->cache_.kSmi, zone()); 1595 return Type::Intersect(arg, typer_->cache_.kSmi, zone());
1597 } 1596 }
1598 1597
1599 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) { 1598 Type* Typer::Visitor::TypeCheckFloat64Hole(Node* node) {
1600 Type* type = Operand(node, 0); 1599 Type* type = Operand(node, 0);
1601 return type; 1600 return type;
1602 } 1601 }
1603 1602
1604 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) { 1603 Type* Typer::Visitor::TypeCheckTaggedHole(Node* node) {
1605 Type* type = Operand(node, 0); 1604 Type* type = Operand(node, 0);
1606 type = Type::Intersect(type, Type::NonInternal(), zone()); 1605 type = Type::Intersect(type, Type::NonInternal(), zone());
1607 return type; 1606 return type;
1608 } 1607 }
1609 1608
1610 Type* Typer::Visitor::TypeConvertTaggedHoleToUndefined(Node* node) { 1609 Type* Typer::Visitor::TypeConvertTaggedHoleToUndefined(Node* node) {
1611 Type* type = Operand(node, 0); 1610 Type* type = Operand(node, 0);
1612 if (type->Maybe(Type::Hole())) { 1611 if (type->Maybe(Type::Hole())) {
1613 // Turn "the hole" into undefined. 1612 // Turn "the hole" into undefined.
1614 type = Type::Intersect(type, Type::NonInternal(), zone()); 1613 type = Type::Intersect(type, Type::NonInternal(), zone());
1615 type = Type::Union(type, Type::Undefined(), zone()); 1614 type = Type::Union(type, Type::Undefined(), zone());
1616 } 1615 }
1617 return type; 1616 return type;
1618 } 1617 }
1619 1618
1620 Type* Typer::Visitor::TypeAllocate(Node* node) { return Type::TaggedPointer(); } 1619 Type* Typer::Visitor::TypeAllocate(Node* node) { return Type::Any(); }
1621 1620
1622 Type* Typer::Visitor::TypeLoadField(Node* node) { 1621 Type* Typer::Visitor::TypeLoadField(Node* node) {
1623 return FieldAccessOf(node->op()).type; 1622 return FieldAccessOf(node->op()).type;
1624 } 1623 }
1625 1624
1626 Type* Typer::Visitor::TypeLoadBuffer(Node* node) { 1625 Type* Typer::Visitor::TypeLoadBuffer(Node* node) {
1627 // TODO(bmeurer): This typing is not yet correct. Since we can still access 1626 // TODO(bmeurer): This typing is not yet correct. Since we can still access
1628 // out of bounds, the type in the general case has to include Undefined. 1627 // out of bounds, the type in the general case has to include Undefined.
1629 switch (BufferAccessOf(node->op()).external_array_type()) { 1628 switch (BufferAccessOf(node->op()).external_array_type()) {
1630 #define TYPED_ARRAY_CASE(ElemType, type, TYPE, ctype, size) \ 1629 #define TYPED_ARRAY_CASE(ElemType, type, TYPE, ctype, size) \
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1711 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { 1710 Type* Typer::Visitor::TypeConstant(Handle<Object> value) {
1712 if (Type::IsInteger(*value)) { 1711 if (Type::IsInteger(*value)) {
1713 return Type::Range(value->Number(), value->Number(), zone()); 1712 return Type::Range(value->Number(), value->Number(), zone());
1714 } 1713 }
1715 return Type::Constant(value, zone()); 1714 return Type::Constant(value, zone());
1716 } 1715 }
1717 1716
1718 } // namespace compiler 1717 } // namespace compiler
1719 } // namespace internal 1718 } // namespace internal
1720 } // namespace v8 1719 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698