OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1143 original_range->lower(), | 1143 original_range->lower(), |
1144 original_range->upper()); | 1144 original_range->upper()); |
1145 } | 1145 } |
1146 TraceRange("New information was [%d,%d]\n", | 1146 TraceRange("New information was [%d,%d]\n", |
1147 range->lower(), | 1147 range->lower(), |
1148 range->upper()); | 1148 range->upper()); |
1149 } | 1149 } |
1150 | 1150 |
1151 | 1151 |
1152 void TraceGVN(const char* msg, ...) { | 1152 void TraceGVN(const char* msg, ...) { |
1153 if (FLAG_trace_gvn) { | 1153 va_list arguments; |
1154 va_list arguments; | 1154 va_start(arguments, msg); |
1155 va_start(arguments, msg); | 1155 OS::VPrint(msg, arguments); |
1156 OS::VPrint(msg, arguments); | 1156 va_end(arguments); |
1157 va_end(arguments); | 1157 } |
1158 | |
1159 // Wrap TraceGVN in macros to avoid the expense of evaluating its arguments when | |
1160 // --trace-gvn is off. | |
1161 #define TRACE_GVN_1(msg, a1) \ | |
1162 if (FLAG_trace_gvn) { \ | |
1163 TraceGVN(msg, a1); \ | |
1158 } | 1164 } |
1159 } | 1165 |
1166 #define TRACE_GVN_2(msg, a1, a2) \ | |
1167 if (FLAG_trace_gvn) { \ | |
1168 TraceGVN(msg, a1, a2); \ | |
1169 } | |
1170 | |
1171 #define TRACE_GVN_3(msg, a1, a2, a3) \ | |
1172 if (FLAG_trace_gvn) { \ | |
1173 TraceGVN(msg, a1, a2, a3); \ | |
1174 } | |
1175 | |
1176 #define TRACE_GVN_4(msg, a1, a2, a3, a4) \ | |
1177 if (FLAG_trace_gvn) { \ | |
1178 TraceGVN(msg, a1, a2, a3, a4); \ | |
1179 } | |
1180 | |
1181 #define TRACE_GVN_5(msg, a1, a2, a3, a4, a5) \ | |
1182 if (FLAG_trace_gvn) { \ | |
1183 TraceGVN(msg, a1, a2, a3, a4, a5); \ | |
1184 } | |
1160 | 1185 |
1161 | 1186 |
1162 HValueMap::HValueMap(Zone* zone, const HValueMap* other) | 1187 HValueMap::HValueMap(Zone* zone, const HValueMap* other) |
1163 : array_size_(other->array_size_), | 1188 : array_size_(other->array_size_), |
1164 lists_size_(other->lists_size_), | 1189 lists_size_(other->lists_size_), |
1165 count_(other->count_), | 1190 count_(other->count_), |
1166 present_flags_(other->present_flags_), | 1191 present_flags_(other->present_flags_), |
1167 array_(zone->NewArray<HValueMapListElement>(other->array_size_)), | 1192 array_(zone->NewArray<HValueMapListElement>(other->array_size_)), |
1168 lists_(zone->NewArray<HValueMapListElement>(other->lists_size_)), | 1193 lists_(zone->NewArray<HValueMapListElement>(other->lists_size_)), |
1169 free_list_head_(other->free_list_head_) { | 1194 free_list_head_(other->free_list_head_) { |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1636 memcpy(result, underlying_buffer, string_len); | 1661 memcpy(result, underlying_buffer, string_len); |
1637 return SmartArrayPointer<char>(result); | 1662 return SmartArrayPointer<char>(result); |
1638 } | 1663 } |
1639 | 1664 |
1640 | 1665 |
1641 void HGlobalValueNumberer::LoopInvariantCodeMotion() { | 1666 void HGlobalValueNumberer::LoopInvariantCodeMotion() { |
1642 for (int i = graph_->blocks()->length() - 1; i >= 0; --i) { | 1667 for (int i = graph_->blocks()->length() - 1; i >= 0; --i) { |
1643 HBasicBlock* block = graph_->blocks()->at(i); | 1668 HBasicBlock* block = graph_->blocks()->at(i); |
1644 if (block->IsLoopHeader()) { | 1669 if (block->IsLoopHeader()) { |
1645 GVNFlagSet side_effects = loop_side_effects_[block->block_id()]; | 1670 GVNFlagSet side_effects = loop_side_effects_[block->block_id()]; |
1646 TraceGVN("Try loop invariant motion for block B%d %s\n", | 1671 TRACE_GVN_2("Try loop invariant motion for block B%d %s\n", |
1647 block->block_id(), | 1672 block->block_id(), |
1648 *GetGVNFlagsString(side_effects)); | 1673 *GetGVNFlagsString(side_effects)); |
1649 | 1674 |
1650 GVNFlagSet accumulated_first_time_depends; | 1675 GVNFlagSet accumulated_first_time_depends; |
1651 GVNFlagSet accumulated_first_time_changes; | 1676 GVNFlagSet accumulated_first_time_changes; |
1652 HBasicBlock* last = block->loop_information()->GetLastBackEdge(); | 1677 HBasicBlock* last = block->loop_information()->GetLastBackEdge(); |
1653 for (int j = block->block_id(); j <= last->block_id(); ++j) { | 1678 for (int j = block->block_id(); j <= last->block_id(); ++j) { |
1654 ProcessLoopBlock(graph_->blocks()->at(j), block, side_effects, | 1679 ProcessLoopBlock(graph_->blocks()->at(j), block, side_effects, |
1655 &accumulated_first_time_depends, | 1680 &accumulated_first_time_depends, |
1656 &accumulated_first_time_changes); | 1681 &accumulated_first_time_changes); |
1657 } | 1682 } |
1658 } | 1683 } |
1659 } | 1684 } |
1660 } | 1685 } |
1661 | 1686 |
1662 | 1687 |
1663 void HGlobalValueNumberer::ProcessLoopBlock( | 1688 void HGlobalValueNumberer::ProcessLoopBlock( |
1664 HBasicBlock* block, | 1689 HBasicBlock* block, |
1665 HBasicBlock* loop_header, | 1690 HBasicBlock* loop_header, |
1666 GVNFlagSet loop_kills, | 1691 GVNFlagSet loop_kills, |
1667 GVNFlagSet* first_time_depends, | 1692 GVNFlagSet* first_time_depends, |
1668 GVNFlagSet* first_time_changes) { | 1693 GVNFlagSet* first_time_changes) { |
1669 HBasicBlock* pre_header = loop_header->predecessors()->at(0); | 1694 HBasicBlock* pre_header = loop_header->predecessors()->at(0); |
1670 GVNFlagSet depends_flags = HValue::ConvertChangesToDependsFlags(loop_kills); | 1695 GVNFlagSet depends_flags = HValue::ConvertChangesToDependsFlags(loop_kills); |
1671 TraceGVN("Loop invariant motion for B%d %s\n", | 1696 TRACE_GVN_2("Loop invariant motion for B%d %s\n", |
1672 block->block_id(), | 1697 block->block_id(), |
1673 *GetGVNFlagsString(depends_flags)); | 1698 *GetGVNFlagsString(depends_flags)); |
1674 HInstruction* instr = block->first(); | 1699 HInstruction* instr = block->first(); |
1675 while (instr != NULL) { | 1700 while (instr != NULL) { |
1676 HInstruction* next = instr->next(); | 1701 HInstruction* next = instr->next(); |
1677 bool hoisted = false; | 1702 bool hoisted = false; |
1678 if (instr->CheckFlag(HValue::kUseGVN)) { | 1703 if (instr->CheckFlag(HValue::kUseGVN)) { |
1679 TraceGVN("Checking instruction %d (%s) %s. Loop %s\n", | 1704 TRACE_GVN_4("Checking instruction %d (%s) %s. Loop %s\n", |
1680 instr->id(), | 1705 instr->id(), |
1681 instr->Mnemonic(), | 1706 instr->Mnemonic(), |
1682 *GetGVNFlagsString(instr->gvn_flags()), | 1707 *GetGVNFlagsString(instr->gvn_flags()), |
1683 *GetGVNFlagsString(loop_kills)); | 1708 *GetGVNFlagsString(loop_kills)); |
1684 bool can_hoist = !instr->gvn_flags().ContainsAnyOf(depends_flags); | 1709 bool can_hoist = !instr->gvn_flags().ContainsAnyOf(depends_flags); |
1685 if (instr->IsTransitionElementsKind()) { | 1710 if (instr->IsTransitionElementsKind()) { |
1686 // It's possible to hoist transitions out of a loop as long as the | 1711 // It's possible to hoist transitions out of a loop as long as the |
1687 // hoisting wouldn't move the transition past a DependsOn of one of it's | 1712 // hoisting wouldn't move the transition past a DependsOn of one of it's |
1688 // changes or any instructions that might change an objects map or | 1713 // changes or any instructions that might change an objects map or |
1689 // elements contents. | 1714 // elements contents. |
1690 GVNFlagSet changes = instr->ChangesFlags(); | 1715 GVNFlagSet changes = instr->ChangesFlags(); |
1691 GVNFlagSet hoist_depends_blockers = | 1716 GVNFlagSet hoist_depends_blockers = |
1692 HValue::ConvertChangesToDependsFlags(changes); | 1717 HValue::ConvertChangesToDependsFlags(changes); |
1693 // In addition to not hoisting transitions above other instructions that | 1718 // In addition to not hoisting transitions above other instructions that |
1694 // change dependencies that the transition changes, it must not be | 1719 // change dependencies that the transition changes, it must not be |
1695 // hoisted above map changes and stores to an elements backing store | 1720 // hoisted above map changes and stores to an elements backing store |
1696 // that the transition might change. | 1721 // that the transition might change. |
1697 GVNFlagSet hoist_change_blockers = changes; | 1722 GVNFlagSet hoist_change_blockers = changes; |
1698 hoist_change_blockers.Add(kChangesMaps); | 1723 hoist_change_blockers.Add(kChangesMaps); |
1699 HTransitionElementsKind* trans = HTransitionElementsKind::cast(instr); | 1724 HTransitionElementsKind* trans = HTransitionElementsKind::cast(instr); |
1700 if (trans->original_map()->has_fast_double_elements()) { | 1725 if (trans->original_map()->has_fast_double_elements()) { |
1701 hoist_change_blockers.Add(kChangesDoubleArrayElements); | 1726 hoist_change_blockers.Add(kChangesDoubleArrayElements); |
1702 } | 1727 } |
1703 if (trans->transitioned_map()->has_fast_double_elements()) { | 1728 if (trans->transitioned_map()->has_fast_double_elements()) { |
1704 hoist_change_blockers.Add(kChangesArrayElements); | 1729 hoist_change_blockers.Add(kChangesArrayElements); |
1705 } | 1730 } |
1706 TraceGVN("Checking dependencies on HTransitionElementsKind %d (%s) " | 1731 if (FLAG_trace_gvn) { |
1707 "hoist blockers: %s %s; " | 1732 GVNFlagSet hoist_blockers = hoist_depends_blockers; |
1708 "first-time accumulated: %s %s\n", | 1733 hoist_blockers.Add(hoist_change_blockers); |
1709 instr->id(), | 1734 GVNFlagSet first_time = *first_time_changes; |
1710 instr->Mnemonic(), | 1735 first_time.Add(*first_time_depends); |
1711 *GetGVNFlagsString(hoist_depends_blockers), | 1736 TRACE_GVN_4("Checking dependencies on HTransitionElementsKind %d (%s) " |
Michael Starzinger
2012/04/26 08:53:47
This line is longer than 80 characters.
| |
1712 *GetGVNFlagsString(hoist_change_blockers), | 1737 "hoist blockers: %s; " |
1713 *GetGVNFlagsString(*first_time_depends), | 1738 "first-time accumulated: %s\n", |
1714 *GetGVNFlagsString(*first_time_changes)); | 1739 instr->id(), |
1740 instr->Mnemonic(), | |
1741 *GetGVNFlagsString(hoist_blockers), | |
1742 *GetGVNFlagsString(first_time)); | |
1743 } | |
1715 // It's possible to hoist transition from the current loop loop only if | 1744 // It's possible to hoist transition from the current loop loop only if |
1716 // they dominate all of the successor blocks in the same loop and there | 1745 // they dominate all of the successor blocks in the same loop and there |
1717 // are not any instructions that have Changes/DependsOn that intervene | 1746 // are not any instructions that have Changes/DependsOn that intervene |
1718 // between it and the beginning of the loop header. | 1747 // between it and the beginning of the loop header. |
1719 bool in_nested_loop = block != loop_header && | 1748 bool in_nested_loop = block != loop_header && |
1720 ((block->parent_loop_header() != loop_header) || | 1749 ((block->parent_loop_header() != loop_header) || |
1721 block->IsLoopHeader()); | 1750 block->IsLoopHeader()); |
1722 can_hoist = !in_nested_loop && | 1751 can_hoist = !in_nested_loop && |
1723 block->IsLoopSuccessorDominator() && | 1752 block->IsLoopSuccessorDominator() && |
1724 !first_time_depends->ContainsAnyOf(hoist_depends_blockers) && | 1753 !first_time_depends->ContainsAnyOf(hoist_depends_blockers) && |
1725 !first_time_changes->ContainsAnyOf(hoist_change_blockers); | 1754 !first_time_changes->ContainsAnyOf(hoist_change_blockers); |
1726 } | 1755 } |
1727 | 1756 |
1728 if (can_hoist) { | 1757 if (can_hoist) { |
1729 bool inputs_loop_invariant = true; | 1758 bool inputs_loop_invariant = true; |
1730 for (int i = 0; i < instr->OperandCount(); ++i) { | 1759 for (int i = 0; i < instr->OperandCount(); ++i) { |
1731 if (instr->OperandAt(i)->IsDefinedAfter(pre_header)) { | 1760 if (instr->OperandAt(i)->IsDefinedAfter(pre_header)) { |
1732 inputs_loop_invariant = false; | 1761 inputs_loop_invariant = false; |
1733 } | 1762 } |
1734 } | 1763 } |
1735 | 1764 |
1736 if (inputs_loop_invariant && ShouldMove(instr, loop_header)) { | 1765 if (inputs_loop_invariant && ShouldMove(instr, loop_header)) { |
1737 TraceGVN("Hoisting loop invariant instruction %d\n", instr->id()); | 1766 TRACE_GVN_1("Hoisting loop invariant instruction %d\n", instr->id()); |
1738 // Move the instruction out of the loop. | 1767 // Move the instruction out of the loop. |
1739 instr->Unlink(); | 1768 instr->Unlink(); |
1740 instr->InsertBefore(pre_header->end()); | 1769 instr->InsertBefore(pre_header->end()); |
1741 if (instr->HasSideEffects()) removed_side_effects_ = true; | 1770 if (instr->HasSideEffects()) removed_side_effects_ = true; |
1742 hoisted = true; | 1771 hoisted = true; |
1743 } | 1772 } |
1744 } | 1773 } |
1745 } | 1774 } |
1746 if (!hoisted) { | 1775 if (!hoisted) { |
1747 // If an instruction is not hoisted, we have to account for its side | 1776 // If an instruction is not hoisted, we have to account for its side |
1748 // effects when hoisting later HTransitionElementsKind instructions. | 1777 // effects when hoisting later HTransitionElementsKind instructions. |
1749 GVNFlagSet previous_depends = *first_time_depends; | 1778 GVNFlagSet previous_depends = *first_time_depends; |
1750 GVNFlagSet previous_changes = *first_time_changes; | 1779 GVNFlagSet previous_changes = *first_time_changes; |
1751 first_time_depends->Add(instr->DependsOnFlags()); | 1780 first_time_depends->Add(instr->DependsOnFlags()); |
1752 first_time_changes->Add(instr->ChangesFlags()); | 1781 first_time_changes->Add(instr->ChangesFlags()); |
1753 if (!(previous_depends == *first_time_depends)) { | 1782 if (!(previous_depends == *first_time_depends)) { |
1754 TraceGVN("Updated first-time accumulated %s\n", | 1783 TRACE_GVN_1("Updated first-time accumulated %s\n", |
1755 *GetGVNFlagsString(*first_time_depends)); | 1784 *GetGVNFlagsString(*first_time_depends)); |
1756 } | 1785 } |
1757 if (!(previous_changes == *first_time_changes)) { | 1786 if (!(previous_changes == *first_time_changes)) { |
1758 TraceGVN("Updated first-time accumulated %s\n", | 1787 TRACE_GVN_1("Updated first-time accumulated %s\n", |
1759 *GetGVNFlagsString(*first_time_changes)); | 1788 *GetGVNFlagsString(*first_time_changes)); |
1760 } | 1789 } |
1761 } | 1790 } |
1762 instr = next; | 1791 instr = next; |
1763 } | 1792 } |
1764 } | 1793 } |
1765 | 1794 |
1766 | 1795 |
1767 bool HGlobalValueNumberer::AllowCodeMotion() { | 1796 bool HGlobalValueNumberer::AllowCodeMotion() { |
1768 return info()->shared_info()->opt_count() + 1 < Compiler::kDefaultMaxOptCount; | 1797 return info()->shared_info()->opt_count() + 1 < Compiler::kDefaultMaxOptCount; |
1769 } | 1798 } |
(...skipping 23 matching lines...) Expand all Loading... | |
1793 dominator, block)); | 1822 dominator, block)); |
1794 } | 1823 } |
1795 } | 1824 } |
1796 return side_effects; | 1825 return side_effects; |
1797 } | 1826 } |
1798 | 1827 |
1799 | 1828 |
1800 void HGlobalValueNumberer::AnalyzeBlock(HBasicBlock* block, | 1829 void HGlobalValueNumberer::AnalyzeBlock(HBasicBlock* block, |
1801 HValueMap* map, | 1830 HValueMap* map, |
1802 HSideEffectMap* dominators) { | 1831 HSideEffectMap* dominators) { |
1803 TraceGVN("Analyzing block B%d%s\n", | 1832 TRACE_GVN_2("Analyzing block B%d%s\n", |
1804 block->block_id(), | 1833 block->block_id(), |
1805 block->IsLoopHeader() ? " (loop header)" : ""); | 1834 block->IsLoopHeader() ? " (loop header)" : ""); |
1806 | 1835 |
1807 // If this is a loop header kill everything killed by the loop. | 1836 // If this is a loop header kill everything killed by the loop. |
1808 if (block->IsLoopHeader()) { | 1837 if (block->IsLoopHeader()) { |
1809 map->Kill(loop_side_effects_[block->block_id()]); | 1838 map->Kill(loop_side_effects_[block->block_id()]); |
1810 } | 1839 } |
1811 | 1840 |
1812 // Go through all instructions of the current block. | 1841 // Go through all instructions of the current block. |
1813 HInstruction* instr = block->first(); | 1842 HInstruction* instr = block->first(); |
1814 while (instr != NULL) { | 1843 while (instr != NULL) { |
1815 HInstruction* next = instr->next(); | 1844 HInstruction* next = instr->next(); |
1816 GVNFlagSet flags = instr->ChangesFlags(); | 1845 GVNFlagSet flags = instr->ChangesFlags(); |
1817 if (!flags.IsEmpty()) { | 1846 if (!flags.IsEmpty()) { |
1818 // Clear all instructions in the map that are affected by side effects. | 1847 // Clear all instructions in the map that are affected by side effects. |
1819 // Store instruction as the dominating one for tracked side effects. | 1848 // Store instruction as the dominating one for tracked side effects. |
1820 map->Kill(flags); | 1849 map->Kill(flags); |
1821 dominators->Store(flags, instr); | 1850 dominators->Store(flags, instr); |
1822 TraceGVN("Instruction %d kills\n", instr->id()); | 1851 TRACE_GVN_2("Instruction %d %s\n", instr->id(), |
1852 *GetGVNFlagsString(flags)); | |
1823 } | 1853 } |
1824 if (instr->CheckFlag(HValue::kUseGVN)) { | 1854 if (instr->CheckFlag(HValue::kUseGVN)) { |
1825 ASSERT(!instr->HasObservableSideEffects()); | 1855 ASSERT(!instr->HasObservableSideEffects()); |
1826 HValue* other = map->Lookup(instr); | 1856 HValue* other = map->Lookup(instr); |
1827 if (other != NULL) { | 1857 if (other != NULL) { |
1828 ASSERT(instr->Equals(other) && other->Equals(instr)); | 1858 ASSERT(instr->Equals(other) && other->Equals(instr)); |
1829 TraceGVN("Replacing value %d (%s) with value %d (%s)\n", | 1859 TRACE_GVN_4("Replacing value %d (%s) with value %d (%s)\n", |
1830 instr->id(), | 1860 instr->id(), |
1831 instr->Mnemonic(), | 1861 instr->Mnemonic(), |
1832 other->id(), | 1862 other->id(), |
1833 other->Mnemonic()); | 1863 other->Mnemonic()); |
1834 if (instr->HasSideEffects()) removed_side_effects_ = true; | 1864 if (instr->HasSideEffects()) removed_side_effects_ = true; |
1835 instr->DeleteAndReplaceWith(other); | 1865 instr->DeleteAndReplaceWith(other); |
1836 } else { | 1866 } else { |
1837 map->Add(instr); | 1867 map->Add(instr); |
1838 } | 1868 } |
1839 } | 1869 } |
1840 if (instr->CheckFlag(HValue::kTrackSideEffectDominators)) { | 1870 if (instr->CheckFlag(HValue::kTrackSideEffectDominators)) { |
1841 for (int i = 0; i < kNumberOfTrackedSideEffects; i++) { | 1871 for (int i = 0; i < kNumberOfTrackedSideEffects; i++) { |
1842 HValue* other = dominators->at(i); | 1872 HValue* other = dominators->at(i); |
1843 GVNFlag changes_flag = HValue::ChangesFlagFromInt(i); | 1873 GVNFlag changes_flag = HValue::ChangesFlagFromInt(i); |
1844 GVNFlag depends_on_flag = HValue::DependsOnFlagFromInt(i); | 1874 GVNFlag depends_on_flag = HValue::DependsOnFlagFromInt(i); |
1845 if (instr->DependsOnFlags().Contains(depends_on_flag) && | 1875 if (instr->DependsOnFlags().Contains(depends_on_flag) && |
1846 (other != NULL)) { | 1876 (other != NULL)) { |
1847 TraceGVN("Side-effect #%d in %d (%s) is dominated by %d (%s)\n", | 1877 TRACE_GVN_5("Side-effect #%d in %d (%s) is dominated by %d (%s)\n", |
1848 i, | 1878 i, |
1849 instr->id(), | 1879 instr->id(), |
1850 instr->Mnemonic(), | 1880 instr->Mnemonic(), |
1851 other->id(), | 1881 other->id(), |
1852 other->Mnemonic()); | 1882 other->Mnemonic()); |
1853 instr->SetSideEffectDominator(changes_flag, other); | 1883 instr->SetSideEffectDominator(changes_flag, other); |
1854 } | 1884 } |
1855 } | 1885 } |
1856 } | 1886 } |
1857 instr = next; | 1887 instr = next; |
1858 } | 1888 } |
1859 | 1889 |
1860 // Recursively continue analysis for all immediately dominated blocks. | 1890 // Recursively continue analysis for all immediately dominated blocks. |
1861 int length = block->dominated_blocks()->length(); | 1891 int length = block->dominated_blocks()->length(); |
1862 for (int i = 0; i < length; ++i) { | 1892 for (int i = 0; i < length; ++i) { |
(...skipping 6897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8760 } | 8790 } |
8761 } | 8791 } |
8762 | 8792 |
8763 #ifdef DEBUG | 8793 #ifdef DEBUG |
8764 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 8794 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
8765 if (allocator_ != NULL) allocator_->Verify(); | 8795 if (allocator_ != NULL) allocator_->Verify(); |
8766 #endif | 8796 #endif |
8767 } | 8797 } |
8768 | 8798 |
8769 } } // namespace v8::internal | 8799 } } // namespace v8::internal |
OLD | NEW |