OLD | NEW |
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 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 } else { | 539 } else { |
540 b = b->next(); | 540 b = b->next(); |
541 } | 541 } |
542 } | 542 } |
543 return LifetimePosition::Invalid(); | 543 return LifetimePosition::Invalid(); |
544 } | 544 } |
545 | 545 |
546 | 546 |
547 LAllocator::LAllocator(int num_values, HGraph* graph) | 547 LAllocator::LAllocator(int num_values, HGraph* graph) |
548 : chunk_(NULL), | 548 : chunk_(NULL), |
| 549 allocation_ok_(true), |
549 live_in_sets_(graph->blocks()->length()), | 550 live_in_sets_(graph->blocks()->length()), |
550 live_ranges_(num_values * 2), | 551 live_ranges_(num_values * 2), |
551 fixed_live_ranges_(NULL), | 552 fixed_live_ranges_(NULL), |
552 fixed_double_live_ranges_(NULL), | 553 fixed_double_live_ranges_(NULL), |
553 unhandled_live_ranges_(num_values * 2), | 554 unhandled_live_ranges_(num_values * 2), |
554 active_live_ranges_(8), | 555 active_live_ranges_(8), |
555 inactive_live_ranges_(8), | 556 inactive_live_ranges_(8), |
556 reusable_slots_(8), | 557 reusable_slots_(8), |
557 next_virtual_register_(num_values), | 558 next_virtual_register_(num_values), |
558 first_artificial_register_(num_values), | 559 first_artificial_register_(num_values), |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 void LAllocator::MeetRegisterConstraints(HBasicBlock* block) { | 781 void LAllocator::MeetRegisterConstraints(HBasicBlock* block) { |
781 int start = block->first_instruction_index(); | 782 int start = block->first_instruction_index(); |
782 int end = block->last_instruction_index(); | 783 int end = block->last_instruction_index(); |
783 for (int i = start; i <= end; ++i) { | 784 for (int i = start; i <= end; ++i) { |
784 if (IsGapAt(i)) { | 785 if (IsGapAt(i)) { |
785 LInstruction* instr = NULL; | 786 LInstruction* instr = NULL; |
786 LInstruction* prev_instr = NULL; | 787 LInstruction* prev_instr = NULL; |
787 if (i < end) instr = InstructionAt(i + 1); | 788 if (i < end) instr = InstructionAt(i + 1); |
788 if (i > start) prev_instr = InstructionAt(i - 1); | 789 if (i > start) prev_instr = InstructionAt(i - 1); |
789 MeetConstraintsBetween(prev_instr, instr, i); | 790 MeetConstraintsBetween(prev_instr, instr, i); |
| 791 if (!AllocationOk()) return; |
790 } | 792 } |
791 } | 793 } |
792 } | 794 } |
793 | 795 |
794 | 796 |
795 void LAllocator::MeetConstraintsBetween(LInstruction* first, | 797 void LAllocator::MeetConstraintsBetween(LInstruction* first, |
796 LInstruction* second, | 798 LInstruction* second, |
797 int gap_index) { | 799 int gap_index) { |
798 // Handle fixed temporaries. | 800 // Handle fixed temporaries. |
799 if (first != NULL) { | 801 if (first != NULL) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 LUnallocated* input_copy = cur_input->CopyUnconstrained(); | 847 LUnallocated* input_copy = cur_input->CopyUnconstrained(); |
846 bool is_tagged = HasTaggedValue(cur_input->virtual_register()); | 848 bool is_tagged = HasTaggedValue(cur_input->virtual_register()); |
847 AllocateFixed(cur_input, gap_index + 1, is_tagged); | 849 AllocateFixed(cur_input, gap_index + 1, is_tagged); |
848 AddConstraintsGapMove(gap_index, input_copy, cur_input); | 850 AddConstraintsGapMove(gap_index, input_copy, cur_input); |
849 } else if (cur_input->policy() == LUnallocated::WRITABLE_REGISTER) { | 851 } else if (cur_input->policy() == LUnallocated::WRITABLE_REGISTER) { |
850 // The live range of writable input registers always goes until the end | 852 // The live range of writable input registers always goes until the end |
851 // of the instruction. | 853 // of the instruction. |
852 ASSERT(!cur_input->IsUsedAtStart()); | 854 ASSERT(!cur_input->IsUsedAtStart()); |
853 | 855 |
854 LUnallocated* input_copy = cur_input->CopyUnconstrained(); | 856 LUnallocated* input_copy = cur_input->CopyUnconstrained(); |
855 cur_input->set_virtual_register(next_virtual_register_++); | 857 cur_input->set_virtual_register(GetVirtualRegister()); |
| 858 if(!AllocationOk()) return; |
856 | 859 |
857 if (RequiredRegisterKind(input_copy->virtual_register()) == | 860 if (RequiredRegisterKind(input_copy->virtual_register()) == |
858 DOUBLE_REGISTERS) { | 861 DOUBLE_REGISTERS) { |
859 double_artificial_registers_.Add( | 862 double_artificial_registers_.Add( |
860 cur_input->virtual_register() - first_artificial_register_); | 863 cur_input->virtual_register() - first_artificial_register_); |
861 } | 864 } |
862 | 865 |
863 AddConstraintsGapMove(gap_index, input_copy, cur_input); | 866 AddConstraintsGapMove(gap_index, input_copy, cur_input); |
864 } | 867 } |
865 } | 868 } |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 | 1065 |
1063 LiveRange* live_range = LiveRangeFor(phi->id()); | 1066 LiveRange* live_range = LiveRangeFor(phi->id()); |
1064 LLabel* label = chunk_->GetLabel(phi->block()->block_id()); | 1067 LLabel* label = chunk_->GetLabel(phi->block()->block_id()); |
1065 label->GetOrCreateParallelMove(LGap::START)-> | 1068 label->GetOrCreateParallelMove(LGap::START)-> |
1066 AddMove(phi_operand, live_range->GetSpillOperand()); | 1069 AddMove(phi_operand, live_range->GetSpillOperand()); |
1067 live_range->SetSpillStartIndex(phi->block()->first_instruction_index()); | 1070 live_range->SetSpillStartIndex(phi->block()->first_instruction_index()); |
1068 } | 1071 } |
1069 } | 1072 } |
1070 | 1073 |
1071 | 1074 |
1072 void LAllocator::Allocate(LChunk* chunk) { | 1075 bool LAllocator::Allocate(LChunk* chunk) { |
1073 ASSERT(chunk_ == NULL); | 1076 ASSERT(chunk_ == NULL); |
1074 chunk_ = chunk; | 1077 chunk_ = chunk; |
1075 MeetRegisterConstraints(); | 1078 MeetRegisterConstraints(); |
| 1079 if (!AllocationOk()) return false; |
1076 ResolvePhis(); | 1080 ResolvePhis(); |
1077 BuildLiveRanges(); | 1081 BuildLiveRanges(); |
1078 AllocateGeneralRegisters(); | 1082 AllocateGeneralRegisters(); |
| 1083 if (!AllocationOk()) return false; |
1079 AllocateDoubleRegisters(); | 1084 AllocateDoubleRegisters(); |
| 1085 if (!AllocationOk()) return false; |
1080 PopulatePointerMaps(); | 1086 PopulatePointerMaps(); |
1081 if (has_osr_entry_) ProcessOsrEntry(); | 1087 if (has_osr_entry_) ProcessOsrEntry(); |
1082 ConnectRanges(); | 1088 ConnectRanges(); |
1083 ResolveControlFlow(); | 1089 ResolveControlFlow(); |
| 1090 return true; |
1084 } | 1091 } |
1085 | 1092 |
1086 | 1093 |
1087 void LAllocator::MeetRegisterConstraints() { | 1094 void LAllocator::MeetRegisterConstraints() { |
1088 HPhase phase("Register constraints", chunk_); | 1095 HPhase phase("Register constraints", chunk_); |
1089 first_artificial_register_ = next_virtual_register_; | 1096 first_artificial_register_ = next_virtual_register_; |
1090 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); | 1097 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); |
1091 for (int i = 0; i < blocks->length(); ++i) { | 1098 for (int i = 0; i < blocks->length(); ++i) { |
1092 HBasicBlock* block = blocks->at(i); | 1099 HBasicBlock* block = blocks->at(i); |
1093 MeetRegisterConstraints(block); | 1100 MeetRegisterConstraints(block); |
| 1101 if (!AllocationOk()) return; |
1094 } | 1102 } |
1095 } | 1103 } |
1096 | 1104 |
1097 | 1105 |
1098 void LAllocator::ResolvePhis() { | 1106 void LAllocator::ResolvePhis() { |
1099 HPhase phase("Resolve phis", chunk_); | 1107 HPhase phase("Resolve phis", chunk_); |
1100 | 1108 |
1101 // Process the blocks in reverse order. | 1109 // Process the blocks in reverse order. |
1102 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); | 1110 const ZoneList<HBasicBlock*>* blocks = graph_->blocks(); |
1103 for (int block_id = blocks->length() - 1; block_id >= 0; --block_id) { | 1111 for (int block_id = blocks->length() - 1; block_id >= 0; --block_id) { |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1537 // If the range already has a spill operand and it doesn't need a | 1545 // If the range already has a spill operand and it doesn't need a |
1538 // register immediately, split it and spill the first part of the range. | 1546 // register immediately, split it and spill the first part of the range. |
1539 if (pos == NULL) { | 1547 if (pos == NULL) { |
1540 Spill(current); | 1548 Spill(current); |
1541 continue; | 1549 continue; |
1542 } else if (pos->pos().Value() > | 1550 } else if (pos->pos().Value() > |
1543 current->Start().NextInstruction().Value()) { | 1551 current->Start().NextInstruction().Value()) { |
1544 // Do not spill live range eagerly if use position that can benefit from | 1552 // Do not spill live range eagerly if use position that can benefit from |
1545 // the register is too close to the start of live range. | 1553 // the register is too close to the start of live range. |
1546 SpillBetween(current, current->Start(), pos->pos()); | 1554 SpillBetween(current, current->Start(), pos->pos()); |
| 1555 if (!AllocationOk()) return; |
1547 ASSERT(UnhandledIsSorted()); | 1556 ASSERT(UnhandledIsSorted()); |
1548 continue; | 1557 continue; |
1549 } | 1558 } |
1550 } | 1559 } |
1551 | 1560 |
1552 for (int i = 0; i < active_live_ranges_.length(); ++i) { | 1561 for (int i = 0; i < active_live_ranges_.length(); ++i) { |
1553 LiveRange* cur_active = active_live_ranges_.at(i); | 1562 LiveRange* cur_active = active_live_ranges_.at(i); |
1554 if (cur_active->End().Value() <= position.Value()) { | 1563 if (cur_active->End().Value() <= position.Value()) { |
1555 ActiveToHandled(cur_active); | 1564 ActiveToHandled(cur_active); |
1556 --i; // The live range was removed from the list of active live ranges. | 1565 --i; // The live range was removed from the list of active live ranges. |
(...skipping 10 matching lines...) Expand all Loading... |
1567 --i; // Live range was removed from the list of inactive live ranges. | 1576 --i; // Live range was removed from the list of inactive live ranges. |
1568 } else if (cur_inactive->Covers(position)) { | 1577 } else if (cur_inactive->Covers(position)) { |
1569 InactiveToActive(cur_inactive); | 1578 InactiveToActive(cur_inactive); |
1570 --i; // Live range was removed from the list of inactive live ranges. | 1579 --i; // Live range was removed from the list of inactive live ranges. |
1571 } | 1580 } |
1572 } | 1581 } |
1573 | 1582 |
1574 ASSERT(!current->HasRegisterAssigned() && !current->IsSpilled()); | 1583 ASSERT(!current->HasRegisterAssigned() && !current->IsSpilled()); |
1575 | 1584 |
1576 bool result = TryAllocateFreeReg(current); | 1585 bool result = TryAllocateFreeReg(current); |
1577 if (!result) { | 1586 if (!AllocationOk()) return; |
1578 AllocateBlockedReg(current); | 1587 |
1579 } | 1588 if (!result) AllocateBlockedReg(current); |
| 1589 if (!AllocationOk()) return; |
1580 | 1590 |
1581 if (current->HasRegisterAssigned()) { | 1591 if (current->HasRegisterAssigned()) { |
1582 AddToActive(current); | 1592 AddToActive(current); |
1583 } | 1593 } |
1584 } | 1594 } |
1585 | 1595 |
1586 reusable_slots_.Rewind(0); | 1596 reusable_slots_.Rewind(0); |
1587 active_live_ranges_.Rewind(0); | 1597 active_live_ranges_.Rewind(0); |
1588 inactive_live_ranges_.Rewind(0); | 1598 inactive_live_ranges_.Rewind(0); |
1589 } | 1599 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 } | 1633 } |
1624 } else if (double_artificial_registers_.Contains( | 1634 } else if (double_artificial_registers_.Contains( |
1625 virtual_register - first_artificial_register_)) { | 1635 virtual_register - first_artificial_register_)) { |
1626 return DOUBLE_REGISTERS; | 1636 return DOUBLE_REGISTERS; |
1627 } | 1637 } |
1628 | 1638 |
1629 return GENERAL_REGISTERS; | 1639 return GENERAL_REGISTERS; |
1630 } | 1640 } |
1631 | 1641 |
1632 | 1642 |
1633 void LAllocator::RecordDefinition(HInstruction* instr, LUnallocated* operand) { | |
1634 operand->set_virtual_register(instr->id()); | |
1635 } | |
1636 | |
1637 | |
1638 void LAllocator::RecordTemporary(LUnallocated* operand) { | |
1639 ASSERT(next_virtual_register_ < LUnallocated::kMaxVirtualRegisters); | |
1640 if (!operand->HasFixedPolicy()) { | |
1641 operand->set_virtual_register(next_virtual_register_++); | |
1642 } | |
1643 } | |
1644 | |
1645 | |
1646 void LAllocator::RecordUse(HValue* value, LUnallocated* operand) { | |
1647 operand->set_virtual_register(value->id()); | |
1648 } | |
1649 | |
1650 | |
1651 int LAllocator::max_initial_value_ids() { | |
1652 return LUnallocated::kMaxVirtualRegisters / 16; | |
1653 } | |
1654 | |
1655 | |
1656 void LAllocator::AddToActive(LiveRange* range) { | 1643 void LAllocator::AddToActive(LiveRange* range) { |
1657 TraceAlloc("Add live range %d to active\n", range->id()); | 1644 TraceAlloc("Add live range %d to active\n", range->id()); |
1658 active_live_ranges_.Add(range); | 1645 active_live_ranges_.Add(range); |
1659 } | 1646 } |
1660 | 1647 |
1661 | 1648 |
1662 void LAllocator::AddToInactive(LiveRange* range) { | 1649 void LAllocator::AddToInactive(LiveRange* range) { |
1663 TraceAlloc("Add live range %d to inactive\n", range->id()); | 1650 TraceAlloc("Add live range %d to inactive\n", range->id()); |
1664 inactive_live_ranges_.Add(range); | 1651 inactive_live_ranges_.Add(range); |
1665 } | 1652 } |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1840 LifetimePosition pos = free_until_pos[reg]; | 1827 LifetimePosition pos = free_until_pos[reg]; |
1841 | 1828 |
1842 if (pos.Value() <= current->Start().Value()) { | 1829 if (pos.Value() <= current->Start().Value()) { |
1843 // All registers are blocked. | 1830 // All registers are blocked. |
1844 return false; | 1831 return false; |
1845 } | 1832 } |
1846 | 1833 |
1847 if (pos.Value() < current->End().Value()) { | 1834 if (pos.Value() < current->End().Value()) { |
1848 // Register reg is available at the range start but becomes blocked before | 1835 // Register reg is available at the range start but becomes blocked before |
1849 // the range end. Split current at position where it becomes blocked. | 1836 // the range end. Split current at position where it becomes blocked. |
1850 LiveRange* tail = SplitAt(current, pos); | 1837 LiveRange* tail = SplitRangeAt(current, pos); |
| 1838 if (!AllocationOk()) return false; |
1851 AddToUnhandledSorted(tail); | 1839 AddToUnhandledSorted(tail); |
1852 } | 1840 } |
1853 | 1841 |
1854 | 1842 |
1855 // Register reg is available at the range start and is free until | 1843 // Register reg is available at the range start and is free until |
1856 // the range end. | 1844 // the range end. |
1857 ASSERT(pos.Value() >= current->End().Value()); | 1845 ASSERT(pos.Value() >= current->End().Value()); |
1858 TraceAlloc("Assigning free reg %s to live range %d\n", | 1846 TraceAlloc("Assigning free reg %s to live range %d\n", |
1859 RegisterName(reg), | 1847 RegisterName(reg), |
1860 current->id()); | 1848 current->id()); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1995 } | 1983 } |
1996 } | 1984 } |
1997 | 1985 |
1998 | 1986 |
1999 bool LAllocator::IsBlockBoundary(LifetimePosition pos) { | 1987 bool LAllocator::IsBlockBoundary(LifetimePosition pos) { |
2000 return pos.IsInstructionStart() && | 1988 return pos.IsInstructionStart() && |
2001 InstructionAt(pos.InstructionIndex())->IsLabel(); | 1989 InstructionAt(pos.InstructionIndex())->IsLabel(); |
2002 } | 1990 } |
2003 | 1991 |
2004 | 1992 |
2005 LiveRange* LAllocator::SplitAt(LiveRange* range, LifetimePosition pos) { | 1993 LiveRange* LAllocator::SplitRangeAt(LiveRange* range, LifetimePosition pos) { |
2006 ASSERT(!range->IsFixed()); | 1994 ASSERT(!range->IsFixed()); |
2007 TraceAlloc("Splitting live range %d at %d\n", range->id(), pos.Value()); | 1995 TraceAlloc("Splitting live range %d at %d\n", range->id(), pos.Value()); |
2008 | 1996 |
2009 if (pos.Value() <= range->Start().Value()) return range; | 1997 if (pos.Value() <= range->Start().Value()) return range; |
2010 | 1998 |
2011 // We can't properly connect liveranges if split occured at the end | 1999 // We can't properly connect liveranges if split occured at the end |
2012 // of control instruction. | 2000 // of control instruction. |
2013 ASSERT(pos.IsInstructionStart() || | 2001 ASSERT(pos.IsInstructionStart() || |
2014 !chunk_->instructions()->at(pos.InstructionIndex())->IsControl()); | 2002 !chunk_->instructions()->at(pos.InstructionIndex())->IsControl()); |
2015 | 2003 |
2016 LiveRange* result = LiveRangeFor(next_virtual_register_++); | 2004 LiveRange* result = LiveRangeFor(GetVirtualRegister()); |
| 2005 if (!AllocationOk()) return NULL; |
2017 range->SplitAt(pos, result); | 2006 range->SplitAt(pos, result); |
2018 return result; | 2007 return result; |
2019 } | 2008 } |
2020 | 2009 |
2021 | 2010 |
2022 LiveRange* LAllocator::SplitBetween(LiveRange* range, | 2011 LiveRange* LAllocator::SplitBetween(LiveRange* range, |
2023 LifetimePosition start, | 2012 LifetimePosition start, |
2024 LifetimePosition end) { | 2013 LifetimePosition end) { |
2025 ASSERT(!range->IsFixed()); | 2014 ASSERT(!range->IsFixed()); |
2026 TraceAlloc("Splitting live range %d in position between [%d, %d]\n", | 2015 TraceAlloc("Splitting live range %d in position between [%d, %d]\n", |
2027 range->id(), | 2016 range->id(), |
2028 start.Value(), | 2017 start.Value(), |
2029 end.Value()); | 2018 end.Value()); |
2030 | 2019 |
2031 LifetimePosition split_pos = FindOptimalSplitPos(start, end); | 2020 LifetimePosition split_pos = FindOptimalSplitPos(start, end); |
2032 ASSERT(split_pos.Value() >= start.Value()); | 2021 ASSERT(split_pos.Value() >= start.Value()); |
2033 return SplitAt(range, split_pos); | 2022 return SplitRangeAt(range, split_pos); |
2034 } | 2023 } |
2035 | 2024 |
2036 | 2025 |
2037 LifetimePosition LAllocator::FindOptimalSplitPos(LifetimePosition start, | 2026 LifetimePosition LAllocator::FindOptimalSplitPos(LifetimePosition start, |
2038 LifetimePosition end) { | 2027 LifetimePosition end) { |
2039 int start_instr = start.InstructionIndex(); | 2028 int start_instr = start.InstructionIndex(); |
2040 int end_instr = end.InstructionIndex(); | 2029 int end_instr = end.InstructionIndex(); |
2041 ASSERT(start_instr <= end_instr); | 2030 ASSERT(start_instr <= end_instr); |
2042 | 2031 |
2043 // We have no choice | 2032 // We have no choice |
(...skipping 18 matching lines...) Expand all Loading... |
2062 // We did not find any suitable outer loop. Split at the latest possible | 2051 // We did not find any suitable outer loop. Split at the latest possible |
2063 // position unless end_block is a loop header itself. | 2052 // position unless end_block is a loop header itself. |
2064 if (block == end_block && !end_block->IsLoopHeader()) return end; | 2053 if (block == end_block && !end_block->IsLoopHeader()) return end; |
2065 | 2054 |
2066 return LifetimePosition::FromInstructionIndex( | 2055 return LifetimePosition::FromInstructionIndex( |
2067 block->first_instruction_index()); | 2056 block->first_instruction_index()); |
2068 } | 2057 } |
2069 | 2058 |
2070 | 2059 |
2071 void LAllocator::SpillAfter(LiveRange* range, LifetimePosition pos) { | 2060 void LAllocator::SpillAfter(LiveRange* range, LifetimePosition pos) { |
2072 LiveRange* second_part = SplitAt(range, pos); | 2061 LiveRange* second_part = SplitRangeAt(range, pos); |
| 2062 if (!AllocationOk()) return; |
2073 Spill(second_part); | 2063 Spill(second_part); |
2074 } | 2064 } |
2075 | 2065 |
2076 | 2066 |
2077 void LAllocator::SpillBetween(LiveRange* range, | 2067 void LAllocator::SpillBetween(LiveRange* range, |
2078 LifetimePosition start, | 2068 LifetimePosition start, |
2079 LifetimePosition end) { | 2069 LifetimePosition end) { |
2080 ASSERT(start.Value() < end.Value()); | 2070 ASSERT(start.Value() < end.Value()); |
2081 LiveRange* second_part = SplitAt(range, start); | 2071 LiveRange* second_part = SplitRangeAt(range, start); |
| 2072 if (!AllocationOk()) return; |
2082 | 2073 |
2083 if (second_part->Start().Value() < end.Value()) { | 2074 if (second_part->Start().Value() < end.Value()) { |
2084 // The split result intersects with [start, end[. | 2075 // The split result intersects with [start, end[. |
2085 // Split it at position between ]start+1, end[, spill the middle part | 2076 // Split it at position between ]start+1, end[, spill the middle part |
2086 // and put the rest to unhandled. | 2077 // and put the rest to unhandled. |
2087 LiveRange* third_part = SplitBetween( | 2078 LiveRange* third_part = SplitBetween( |
2088 second_part, | 2079 second_part, |
2089 second_part->Start().InstructionEnd(), | 2080 second_part->Start().InstructionEnd(), |
2090 end.PrevInstruction().InstructionEnd()); | 2081 end.PrevInstruction().InstructionEnd()); |
2091 | 2082 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 LiveRange* current = live_ranges()->at(i); | 2119 LiveRange* current = live_ranges()->at(i); |
2129 if (current != NULL) current->Verify(); | 2120 if (current != NULL) current->Verify(); |
2130 } | 2121 } |
2131 } | 2122 } |
2132 | 2123 |
2133 | 2124 |
2134 #endif | 2125 #endif |
2135 | 2126 |
2136 | 2127 |
2137 } } // namespace v8::internal | 2128 } } // namespace v8::internal |
OLD | NEW |