OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 } | 578 } |
579 | 579 |
580 | 580 |
581 void LAllocator::AddInitialIntervals(HBasicBlock* block, | 581 void LAllocator::AddInitialIntervals(HBasicBlock* block, |
582 BitVector* live_out) { | 582 BitVector* live_out) { |
583 // Add an interval that includes the entire block to the live range for | 583 // Add an interval that includes the entire block to the live range for |
584 // each live_out value. | 584 // each live_out value. |
585 LifetimePosition start = LifetimePosition::FromInstructionIndex( | 585 LifetimePosition start = LifetimePosition::FromInstructionIndex( |
586 block->first_instruction_index()); | 586 block->first_instruction_index()); |
587 LifetimePosition end = LifetimePosition::FromInstructionIndex( | 587 LifetimePosition end = LifetimePosition::FromInstructionIndex( |
588 block->last_instruction_index()); | 588 block->last_instruction_index()).NextInstruction(); |
589 BitVector::Iterator iterator(live_out); | 589 BitVector::Iterator iterator(live_out); |
590 while (!iterator.Done()) { | 590 while (!iterator.Done()) { |
591 int operand_index = iterator.Current(); | 591 int operand_index = iterator.Current(); |
592 LiveRange* range = LiveRangeFor(operand_index); | 592 LiveRange* range = LiveRangeFor(operand_index); |
593 if (!range->IsEmpty() && | 593 range->AddUseInterval(start, end); |
594 range->Start().Value() == end.NextInstruction().Value()) { | |
595 range->AddUseInterval(start, end.NextInstruction()); | |
596 } else { | |
597 range->AddUseInterval(start, end); | |
598 } | |
599 iterator.Advance(); | 594 iterator.Advance(); |
600 } | 595 } |
601 } | 596 } |
602 | 597 |
603 | 598 |
604 int LAllocator::FixedDoubleLiveRangeID(int index) { | 599 int LAllocator::FixedDoubleLiveRangeID(int index) { |
605 return -index - 1 - Register::kNumAllocatableRegisters; | 600 return -index - 1 - Register::kNumAllocatableRegisters; |
606 } | 601 } |
607 | 602 |
608 | 603 |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
971 LOperand* temp = summary->TempAt(i); | 966 LOperand* temp = summary->TempAt(i); |
972 if (summary->IsCall()) { | 967 if (summary->IsCall()) { |
973 if (temp->IsRegister()) continue; | 968 if (temp->IsRegister()) continue; |
974 if (temp->IsUnallocated()) { | 969 if (temp->IsUnallocated()) { |
975 LUnallocated* temp_unalloc = LUnallocated::cast(temp); | 970 LUnallocated* temp_unalloc = LUnallocated::cast(temp); |
976 if (temp_unalloc->HasFixedPolicy()) { | 971 if (temp_unalloc->HasFixedPolicy()) { |
977 continue; | 972 continue; |
978 } | 973 } |
979 } | 974 } |
980 } | 975 } |
981 Use(block_start_position, curr_position, temp, NULL); | 976 Use(block_start_position, curr_position.InstructionEnd(), temp, NULL); |
982 Define(curr_position.PrevInstruction(), temp, NULL); | 977 Define(curr_position, temp, NULL); |
983 } | 978 } |
984 } | 979 } |
985 } | 980 } |
986 | 981 |
987 index = index - 1; | 982 index = index - 1; |
988 } | 983 } |
989 } | 984 } |
990 | 985 |
991 | 986 |
992 void LAllocator::ResolvePhis(HBasicBlock* block) { | 987 void LAllocator::ResolvePhis(HBasicBlock* block) { |
(...skipping 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1825 // Register reg is available at the range start but becomes blocked before | 1820 // Register reg is available at the range start but becomes blocked before |
1826 // the range end. Split current at position where it becomes blocked. | 1821 // the range end. Split current at position where it becomes blocked. |
1827 LiveRange* tail = SplitAt(current, pos); | 1822 LiveRange* tail = SplitAt(current, pos); |
1828 AddToUnhandledSorted(tail); | 1823 AddToUnhandledSorted(tail); |
1829 } | 1824 } |
1830 | 1825 |
1831 | 1826 |
1832 // Register reg is available at the range start and is free until | 1827 // Register reg is available at the range start and is free until |
1833 // the range end. | 1828 // the range end. |
1834 ASSERT(pos.Value() >= current->End().Value()); | 1829 ASSERT(pos.Value() >= current->End().Value()); |
1835 TraceAlloc("Assigning reg %s to live range %d\n", | 1830 TraceAlloc("Assigning free reg %s to live range %d\n", |
1836 RegisterName(reg), | 1831 RegisterName(reg), |
1837 current->id()); | 1832 current->id()); |
1838 current->set_assigned_register(reg, mode_); | 1833 current->set_assigned_register(reg, mode_); |
1839 | 1834 |
1840 return true; | 1835 return true; |
1841 } | 1836 } |
1842 | 1837 |
1843 | 1838 |
1844 void LAllocator::AllocateBlockedReg(LiveRange* current) { | 1839 void LAllocator::AllocateBlockedReg(LiveRange* current) { |
1845 UsePosition* register_use = current->NextRegisterPosition(current->Start()); | 1840 UsePosition* register_use = current->NextRegisterPosition(current->Start()); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1915 // Register becomes blocked before the current range end. Split before that | 1910 // Register becomes blocked before the current range end. Split before that |
1916 // position. | 1911 // position. |
1917 LiveRange* tail = SplitBetween(current, | 1912 LiveRange* tail = SplitBetween(current, |
1918 current->Start(), | 1913 current->Start(), |
1919 block_pos[reg].InstructionStart()); | 1914 block_pos[reg].InstructionStart()); |
1920 AddToUnhandledSorted(tail); | 1915 AddToUnhandledSorted(tail); |
1921 } | 1916 } |
1922 | 1917 |
1923 // Register reg is not blocked for the whole range. | 1918 // Register reg is not blocked for the whole range. |
1924 ASSERT(block_pos[reg].Value() >= current->End().Value()); | 1919 ASSERT(block_pos[reg].Value() >= current->End().Value()); |
1925 TraceAlloc("Assigning reg %s to live range %d\n", | 1920 TraceAlloc("Assigning blocked reg %s to live range %d\n", |
1926 RegisterName(reg), | 1921 RegisterName(reg), |
1927 current->id()); | 1922 current->id()); |
1928 current->set_assigned_register(reg, mode_); | 1923 current->set_assigned_register(reg, mode_); |
1929 | 1924 |
1930 // This register was not free. Thus we need to find and spill | 1925 // This register was not free. Thus we need to find and spill |
1931 // parts of active and inactive live regions that use the same register | 1926 // parts of active and inactive live regions that use the same register |
1932 // at the same lifetime positions as current. | 1927 // at the same lifetime positions as current. |
1933 SplitAndSpillIntersecting(current); | 1928 SplitAndSpillIntersecting(current); |
1934 } | 1929 } |
1935 | 1930 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2112 LiveRange* current = live_ranges()->at(i); | 2107 LiveRange* current = live_ranges()->at(i); |
2113 if (current != NULL) current->Verify(); | 2108 if (current != NULL) current->Verify(); |
2114 } | 2109 } |
2115 } | 2110 } |
2116 | 2111 |
2117 | 2112 |
2118 #endif | 2113 #endif |
2119 | 2114 |
2120 | 2115 |
2121 } } // namespace v8::internal | 2116 } } // namespace v8::internal |
OLD | NEW |