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

Side by Side Diff: src/hydrogen-instructions.cc

Issue 8404030: Version 3.7.1 (Closed) Base URL: http://v8.googlecode.com/svn/trunk/
Patch Set: Created 9 years, 1 month 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 | « src/hydrogen-instructions.h ('k') | src/ia32/assembler-ia32-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
580 580
581 #ifdef DEBUG 581 #ifdef DEBUG
582 void HInstruction::Verify() { 582 void HInstruction::Verify() {
583 // Verify that input operands are defined before use. 583 // Verify that input operands are defined before use.
584 HBasicBlock* cur_block = block(); 584 HBasicBlock* cur_block = block();
585 for (int i = 0; i < OperandCount(); ++i) { 585 for (int i = 0; i < OperandCount(); ++i) {
586 HValue* other_operand = OperandAt(i); 586 HValue* other_operand = OperandAt(i);
587 HBasicBlock* other_block = other_operand->block(); 587 HBasicBlock* other_block = other_operand->block();
588 if (cur_block == other_block) { 588 if (cur_block == other_block) {
589 if (!other_operand->IsPhi()) { 589 if (!other_operand->IsPhi()) {
590 HInstruction* cur = cur_block->first(); 590 HInstruction* cur = this->previous();
591 while (cur != NULL) { 591 while (cur != NULL) {
592 ASSERT(cur != this); // We should reach other_operand before!
593 if (cur == other_operand) break; 592 if (cur == other_operand) break;
594 cur = cur->next(); 593 cur = cur->previous();
595 } 594 }
596 // Must reach other operand in the same block! 595 // Must reach other operand in the same block!
597 ASSERT(cur == other_operand); 596 ASSERT(cur == other_operand);
598 } 597 }
599 } else { 598 } else {
600 // If the following assert fires, you may have forgotten an 599 // If the following assert fires, you may have forgotten an
601 // AddInstruction. 600 // AddInstruction.
602 ASSERT(other_block->Dominates(cur_block)); 601 ASSERT(other_block->Dominates(cur_block));
603 } 602 }
604 } 603 }
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 if (to_ == JS_FUNCTION_TYPE) stream->Add(" function"); 775 if (to_ == JS_FUNCTION_TYPE) stream->Add(" function");
777 break; 776 break;
778 default: 777 default:
779 break; 778 break;
780 } 779 }
781 } 780 }
782 781
783 782
784 void HTypeofIsAndBranch::PrintDataTo(StringStream* stream) { 783 void HTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
785 value()->PrintNameTo(stream); 784 value()->PrintNameTo(stream);
786 stream->Add(" == "); 785 stream->Add(" == %o", *type_literal_);
787 stream->Add(type_literal_->GetFlatContent().ToAsciiVector());
788 HControlInstruction::PrintDataTo(stream); 786 HControlInstruction::PrintDataTo(stream);
789 } 787 }
790 788
791 789
790 HValue* HConstant::Canonicalize() {
791 return HasNoUses() && !IsBlockEntry() ? NULL : this;
792 }
793
794
795 HValue* HTypeof::Canonicalize() {
796 return HasNoUses() && !IsBlockEntry() ? NULL : this;
797 }
798
799
792 void HTypeof::PrintDataTo(StringStream* stream) { 800 void HTypeof::PrintDataTo(StringStream* stream) {
793 value()->PrintNameTo(stream); 801 value()->PrintNameTo(stream);
794 } 802 }
795 803
796 804
797 void HChange::PrintDataTo(StringStream* stream) { 805 void HChange::PrintDataTo(StringStream* stream) {
798 HUnaryOperation::PrintDataTo(stream); 806 HUnaryOperation::PrintDataTo(stream);
799 stream->Add(" %s to %s", from().Mnemonic(), to().Mnemonic()); 807 stream->Add(" %s to %s", from().Mnemonic(), to().Mnemonic());
800 808
801 if (CanTruncateToInt32()) stream->Add(" truncating-int32"); 809 if (CanTruncateToInt32()) stream->Add(" truncating-int32");
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 1139
1132 1140
1133 void HPhi::AddIndirectUsesTo(int* dest) { 1141 void HPhi::AddIndirectUsesTo(int* dest) {
1134 for (int i = 0; i < Representation::kNumRepresentations; i++) { 1142 for (int i = 0; i < Representation::kNumRepresentations; i++) {
1135 dest[i] += indirect_uses_[i]; 1143 dest[i] += indirect_uses_[i];
1136 } 1144 }
1137 } 1145 }
1138 1146
1139 1147
1140 void HSimulate::PrintDataTo(StringStream* stream) { 1148 void HSimulate::PrintDataTo(StringStream* stream) {
1141 stream->Add("id=%d ", ast_id()); 1149 stream->Add("id=%d", ast_id());
1142 if (pop_count_ > 0) stream->Add("pop %d", pop_count_); 1150 if (pop_count_ > 0) stream->Add(" pop %d", pop_count_);
1143 if (values_.length() > 0) { 1151 if (values_.length() > 0) {
1144 if (pop_count_ > 0) stream->Add(" /"); 1152 if (pop_count_ > 0) stream->Add(" /");
1145 for (int i = 0; i < values_.length(); ++i) { 1153 for (int i = 0; i < values_.length(); ++i) {
1146 if (!HasAssignedIndexAt(i)) { 1154 if (i > 0) stream->Add(",");
1155 if (HasAssignedIndexAt(i)) {
1156 stream->Add(" var[%d] = ", GetAssignedIndexAt(i));
1157 } else {
1147 stream->Add(" push "); 1158 stream->Add(" push ");
1148 } else {
1149 stream->Add(" var[%d] = ", GetAssignedIndexAt(i));
1150 } 1159 }
1151 values_[i]->PrintNameTo(stream); 1160 values_[i]->PrintNameTo(stream);
1152 } 1161 }
1153 } 1162 }
1154 } 1163 }
1155 1164
1156 1165
1157 void HDeoptimize::PrintDataTo(StringStream* stream) { 1166 void HDeoptimize::PrintDataTo(StringStream* stream) {
1158 if (OperandCount() == 0) return; 1167 if (OperandCount() == 0) return;
1159 OperandAt(0)->PrintNameTo(stream); 1168 OperandAt(0)->PrintNameTo(stream);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 String::cast(*handle())->length() == 0) return false; 1229 String::cast(*handle())->length() == 0) return false;
1221 return true; 1230 return true;
1222 } 1231 }
1223 1232
1224 void HConstant::PrintDataTo(StringStream* stream) { 1233 void HConstant::PrintDataTo(StringStream* stream) {
1225 handle()->ShortPrint(stream); 1234 handle()->ShortPrint(stream);
1226 } 1235 }
1227 1236
1228 1237
1229 bool HArrayLiteral::IsCopyOnWrite() const { 1238 bool HArrayLiteral::IsCopyOnWrite() const {
1230 return constant_elements()->map() == HEAP->fixed_cow_array_map(); 1239 Handle<FixedArray> constant_elements = this->constant_elements();
1240 FixedArrayBase* constant_elements_values =
1241 FixedArrayBase::cast(constant_elements->get(1));
1242 return constant_elements_values->map() == HEAP->fixed_cow_array_map();
1231 } 1243 }
1232 1244
1233 1245
1234 void HBinaryOperation::PrintDataTo(StringStream* stream) { 1246 void HBinaryOperation::PrintDataTo(StringStream* stream) {
1235 left()->PrintNameTo(stream); 1247 left()->PrintNameTo(stream);
1236 stream->Add(" "); 1248 stream->Add(" ");
1237 right()->PrintNameTo(stream); 1249 right()->PrintNameTo(stream);
1238 if (CheckFlag(kCanOverflow)) stream->Add(" !"); 1250 if (CheckFlag(kCanOverflow)) stream->Add(" !");
1239 if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?"); 1251 if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?");
1240 } 1252 }
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1385 name_(name), 1397 name_(name),
1386 need_generic_(false) { 1398 need_generic_(false) {
1387 SetOperandAt(0, context); 1399 SetOperandAt(0, context);
1388 SetOperandAt(1, object); 1400 SetOperandAt(1, object);
1389 set_representation(Representation::Tagged()); 1401 set_representation(Representation::Tagged());
1390 SetFlag(kDependsOnMaps); 1402 SetFlag(kDependsOnMaps);
1391 for (int i = 0; 1403 for (int i = 0;
1392 i < types->length() && types_.length() < kMaxLoadPolymorphism; 1404 i < types->length() && types_.length() < kMaxLoadPolymorphism;
1393 ++i) { 1405 ++i) {
1394 Handle<Map> map = types->at(i); 1406 Handle<Map> map = types->at(i);
1395 LookupResult lookup; 1407 LookupResult lookup(map->GetIsolate());
1396 map->LookupInDescriptors(NULL, *name, &lookup); 1408 map->LookupInDescriptors(NULL, *name, &lookup);
1397 if (lookup.IsProperty()) { 1409 if (lookup.IsProperty()) {
1398 switch (lookup.type()) { 1410 switch (lookup.type()) {
1399 case FIELD: { 1411 case FIELD: {
1400 int index = lookup.GetLocalFieldIndexFromMap(*map); 1412 int index = lookup.GetLocalFieldIndexFromMap(*map);
1401 if (index < 0) { 1413 if (index < 0) {
1402 SetFlag(kDependsOnInobjectFields); 1414 SetFlag(kDependsOnInobjectFields);
1403 } else { 1415 } else {
1404 SetFlag(kDependsOnBackingStoreFields); 1416 SetFlag(kDependsOnBackingStoreFields);
1405 } 1417 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 } 1450 }
1439 } 1451 }
1440 if (!found) return false; 1452 if (!found) return false;
1441 } 1453 }
1442 return true; 1454 return true;
1443 } 1455 }
1444 1456
1445 1457
1446 void HLoadNamedFieldPolymorphic::PrintDataTo(StringStream* stream) { 1458 void HLoadNamedFieldPolymorphic::PrintDataTo(StringStream* stream) {
1447 object()->PrintNameTo(stream); 1459 object()->PrintNameTo(stream);
1448 stream->Add(" ."); 1460 stream->Add(".");
1449 stream->Add(*String::cast(*name())->ToCString()); 1461 stream->Add(*String::cast(*name())->ToCString());
1450 } 1462 }
1451 1463
1452 1464
1453 void HLoadNamedGeneric::PrintDataTo(StringStream* stream) { 1465 void HLoadNamedGeneric::PrintDataTo(StringStream* stream) {
1454 object()->PrintNameTo(stream); 1466 object()->PrintNameTo(stream);
1455 stream->Add(" ."); 1467 stream->Add(".");
1456 stream->Add(*String::cast(*name())->ToCString()); 1468 stream->Add(*String::cast(*name())->ToCString());
1457 } 1469 }
1458 1470
1459 1471
1460 void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { 1472 void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
1461 object()->PrintNameTo(stream); 1473 object()->PrintNameTo(stream);
1462 stream->Add("["); 1474 stream->Add("[");
1463 key()->PrintNameTo(stream); 1475 key()->PrintNameTo(stream);
1464 stream->Add("]"); 1476 stream->Add("]");
1465 } 1477 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 ASSERT(name()->IsString()); 1554 ASSERT(name()->IsString());
1543 stream->Add(*String::cast(*name())->ToCString()); 1555 stream->Add(*String::cast(*name())->ToCString());
1544 stream->Add(" = "); 1556 stream->Add(" = ");
1545 value()->PrintNameTo(stream); 1557 value()->PrintNameTo(stream);
1546 } 1558 }
1547 1559
1548 1560
1549 void HStoreNamedField::PrintDataTo(StringStream* stream) { 1561 void HStoreNamedField::PrintDataTo(StringStream* stream) {
1550 object()->PrintNameTo(stream); 1562 object()->PrintNameTo(stream);
1551 stream->Add("."); 1563 stream->Add(".");
1552 ASSERT(name()->IsString());
1553 stream->Add(*String::cast(*name())->ToCString()); 1564 stream->Add(*String::cast(*name())->ToCString());
1554 stream->Add(" = "); 1565 stream->Add(" = ");
1555 value()->PrintNameTo(stream); 1566 value()->PrintNameTo(stream);
1567 stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : "");
1556 if (!transition().is_null()) { 1568 if (!transition().is_null()) {
1557 stream->Add(" (transition map %p)", *transition()); 1569 stream->Add(" (transition map %p)", *transition());
1558 } 1570 }
1559 } 1571 }
1560 1572
1561 1573
1562 void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) { 1574 void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
1563 object()->PrintNameTo(stream); 1575 object()->PrintNameTo(stream);
1564 stream->Add("["); 1576 stream->Add("[");
1565 key()->PrintNameTo(stream); 1577 key()->PrintNameTo(stream);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1626 UNREACHABLE(); 1638 UNREACHABLE();
1627 break; 1639 break;
1628 } 1640 }
1629 stream->Add("["); 1641 stream->Add("[");
1630 key()->PrintNameTo(stream); 1642 key()->PrintNameTo(stream);
1631 stream->Add("] = "); 1643 stream->Add("] = ");
1632 value()->PrintNameTo(stream); 1644 value()->PrintNameTo(stream);
1633 } 1645 }
1634 1646
1635 1647
1648 void HTransitionElementsKind::PrintDataTo(StringStream* stream) {
1649 object()->PrintNameTo(stream);
1650 stream->Add(" %p -> %p", *original_map(), *transitioned_map());
1651 }
1652
1653
1636 void HLoadGlobalCell::PrintDataTo(StringStream* stream) { 1654 void HLoadGlobalCell::PrintDataTo(StringStream* stream) {
1637 stream->Add("[%p]", *cell()); 1655 stream->Add("[%p]", *cell());
1638 if (!details_.IsDontDelete()) stream->Add(" (deleteable)"); 1656 if (!details_.IsDontDelete()) stream->Add(" (deleteable)");
1639 if (details_.IsReadOnly()) stream->Add(" (read-only)"); 1657 if (details_.IsReadOnly()) stream->Add(" (read-only)");
1640 } 1658 }
1641 1659
1642 1660
1643 bool HLoadGlobalCell::RequiresHoleCheck() { 1661 bool HLoadGlobalCell::RequiresHoleCheck() {
1644 if (details_.IsDontDelete() && !details_.IsReadOnly()) return false; 1662 if (details_.IsDontDelete() && !details_.IsReadOnly()) return false;
1645 for (HUseIterator it(uses()); !it.Done(); it.Advance()) { 1663 for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1739 HType HDeleteProperty::CalculateInferredType() { 1757 HType HDeleteProperty::CalculateInferredType() {
1740 return HType::Boolean(); 1758 return HType::Boolean();
1741 } 1759 }
1742 1760
1743 1761
1744 HType HInstanceOfKnownGlobal::CalculateInferredType() { 1762 HType HInstanceOfKnownGlobal::CalculateInferredType() {
1745 return HType::Boolean(); 1763 return HType::Boolean();
1746 } 1764 }
1747 1765
1748 1766
1767 HType HChange::CalculateInferredType() {
1768 if (from().IsDouble() && to().IsTagged()) return HType::HeapNumber();
1769 return type();
1770 }
1771
1772
1749 HType HBitwiseBinaryOperation::CalculateInferredType() { 1773 HType HBitwiseBinaryOperation::CalculateInferredType() {
1750 return HType::TaggedNumber(); 1774 return HType::TaggedNumber();
1751 } 1775 }
1752 1776
1753 1777
1754 HType HArithmeticBinaryOperation::CalculateInferredType() { 1778 HType HArithmeticBinaryOperation::CalculateInferredType() {
1755 return HType::TaggedNumber(); 1779 return HType::TaggedNumber();
1756 } 1780 }
1757 1781
1758 1782
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1794 HType HShr::CalculateInferredType() { 1818 HType HShr::CalculateInferredType() {
1795 return HType::TaggedNumber(); 1819 return HType::TaggedNumber();
1796 } 1820 }
1797 1821
1798 1822
1799 HType HSar::CalculateInferredType() { 1823 HType HSar::CalculateInferredType() {
1800 return HType::TaggedNumber(); 1824 return HType::TaggedNumber();
1801 } 1825 }
1802 1826
1803 1827
1828 HType HStringCharFromCode::CalculateInferredType() {
1829 return HType::String();
1830 }
1831
1832
1833 HType HArrayLiteral::CalculateInferredType() {
1834 return HType::JSArray();
1835 }
1836
1837
1838 HType HObjectLiteral::CalculateInferredType() {
1839 return HType::JSObject();
1840 }
1841
1842
1843 HType HRegExpLiteral::CalculateInferredType() {
1844 return HType::JSObject();
1845 }
1846
1847
1848 HType HFunctionLiteral::CalculateInferredType() {
1849 return HType::JSObject();
1850 }
1851
1852
1804 HValue* HUnaryMathOperation::EnsureAndPropagateNotMinusZero( 1853 HValue* HUnaryMathOperation::EnsureAndPropagateNotMinusZero(
1805 BitVector* visited) { 1854 BitVector* visited) {
1806 visited->Add(id()); 1855 visited->Add(id());
1807 if (representation().IsInteger32() && 1856 if (representation().IsInteger32() &&
1808 !value()->representation().IsInteger32()) { 1857 !value()->representation().IsInteger32()) {
1809 if (value()->range() == NULL || value()->range()->CanBeMinusZero()) { 1858 if (value()->range() == NULL || value()->range()->CanBeMinusZero()) {
1810 SetFlag(kBailoutOnMinusZero); 1859 SetFlag(kBailoutOnMinusZero);
1811 } 1860 }
1812 } 1861 }
1813 if (RequiredInputRepresentation(0).IsInteger32() && 1862 if (RequiredInputRepresentation(0).IsInteger32() &&
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 1984
1936 1985
1937 void HCheckPrototypeMaps::Verify() { 1986 void HCheckPrototypeMaps::Verify() {
1938 HInstruction::Verify(); 1987 HInstruction::Verify();
1939 ASSERT(HasNoUses()); 1988 ASSERT(HasNoUses());
1940 } 1989 }
1941 1990
1942 #endif 1991 #endif
1943 1992
1944 } } // namespace v8::internal 1993 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.h ('k') | src/ia32/assembler-ia32-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698