| 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 1050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1061 HBasicBlock* block = blocks->at(block_id); | 1061 HBasicBlock* block = blocks->at(block_id); |
| 1062 ResolvePhis(block); | 1062 ResolvePhis(block); |
| 1063 } | 1063 } |
| 1064 } | 1064 } |
| 1065 | 1065 |
| 1066 | 1066 |
| 1067 void LAllocator::ResolveControlFlow(LiveRange* range, | 1067 void LAllocator::ResolveControlFlow(LiveRange* range, |
| 1068 HBasicBlock* block, | 1068 HBasicBlock* block, |
| 1069 HBasicBlock* pred) { | 1069 HBasicBlock* pred) { |
| 1070 LifetimePosition pred_end = | 1070 LifetimePosition pred_end = |
| 1071 LifetimePosition::FromInstructionIndex(pred->last_instruction_index()). | 1071 LifetimePosition::FromInstructionIndex(pred->last_instruction_index()); |
| 1072 PrevInstruction(); | |
| 1073 | |
| 1074 LifetimePosition cur_start = | 1072 LifetimePosition cur_start = |
| 1075 LifetimePosition::FromInstructionIndex(block->first_instruction_index()); | 1073 LifetimePosition::FromInstructionIndex(block->first_instruction_index()); |
| 1076 LiveRange* pred_cover = NULL; | 1074 LiveRange* pred_cover = NULL; |
| 1077 LiveRange* cur_cover = NULL; | 1075 LiveRange* cur_cover = NULL; |
| 1078 LiveRange* cur_range = range; | 1076 LiveRange* cur_range = range; |
| 1079 while (cur_range != NULL && (cur_cover == NULL || pred_cover == NULL)) { | 1077 while (cur_range != NULL && (cur_cover == NULL || pred_cover == NULL)) { |
| 1080 if (cur_range->CanCover(cur_start)) { | 1078 if (cur_range->CanCover(cur_start)) { |
| 1081 ASSERT(cur_cover == NULL); | 1079 ASSERT(cur_cover == NULL); |
| 1082 cur_cover = cur_range; | 1080 cur_cover = cur_range; |
| 1083 } | 1081 } |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 if (block->IsLoopHeader()) { | 1236 if (block->IsLoopHeader()) { |
| 1239 // TODO(kmillikin): Need to be able to get the last block of the loop | 1237 // TODO(kmillikin): Need to be able to get the last block of the loop |
| 1240 // in the loop information. Add a live range stretching from the first | 1238 // in the loop information. Add a live range stretching from the first |
| 1241 // loop instruction to the last for each value live on entry to the | 1239 // loop instruction to the last for each value live on entry to the |
| 1242 // header. | 1240 // header. |
| 1243 HBasicBlock* back_edge = block->loop_information()->GetLastBackEdge(); | 1241 HBasicBlock* back_edge = block->loop_information()->GetLastBackEdge(); |
| 1244 BitVector::Iterator iterator(live); | 1242 BitVector::Iterator iterator(live); |
| 1245 LifetimePosition start = LifetimePosition::FromInstructionIndex( | 1243 LifetimePosition start = LifetimePosition::FromInstructionIndex( |
| 1246 block->first_instruction_index()); | 1244 block->first_instruction_index()); |
| 1247 LifetimePosition end = LifetimePosition::FromInstructionIndex( | 1245 LifetimePosition end = LifetimePosition::FromInstructionIndex( |
| 1248 back_edge->last_instruction_index()); | 1246 back_edge->last_instruction_index()).NextInstruction(); |
| 1249 while (!iterator.Done()) { | 1247 while (!iterator.Done()) { |
| 1250 int operand_index = iterator.Current(); | 1248 int operand_index = iterator.Current(); |
| 1251 LiveRange* range = LiveRangeFor(operand_index); | 1249 LiveRange* range = LiveRangeFor(operand_index); |
| 1252 range->EnsureInterval(start, end); | 1250 range->EnsureInterval(start, end); |
| 1253 iterator.Advance(); | 1251 iterator.Advance(); |
| 1254 } | 1252 } |
| 1255 | 1253 |
| 1256 for (int i = block->block_id() + 1; i <= back_edge->block_id(); ++i) { | 1254 for (int i = block->block_id() + 1; i <= back_edge->block_id(); ++i) { |
| 1257 live_in_sets_[i]->Union(*live); | 1255 live_in_sets_[i]->Union(*live); |
| 1258 } | 1256 } |
| (...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2012 chunk_->instructions()->at(pos.InstructionIndex())->IsLabel(); | 2010 chunk_->instructions()->at(pos.InstructionIndex())->IsLabel(); |
| 2013 } | 2011 } |
| 2014 | 2012 |
| 2015 | 2013 |
| 2016 LiveRange* LAllocator::SplitAt(LiveRange* range, LifetimePosition pos) { | 2014 LiveRange* LAllocator::SplitAt(LiveRange* range, LifetimePosition pos) { |
| 2017 ASSERT(!range->IsFixed()); | 2015 ASSERT(!range->IsFixed()); |
| 2018 TraceAlloc("Splitting live range %d at %d\n", range->id(), pos.Value()); | 2016 TraceAlloc("Splitting live range %d at %d\n", range->id(), pos.Value()); |
| 2019 | 2017 |
| 2020 if (pos.Value() <= range->Start().Value()) return range; | 2018 if (pos.Value() <= range->Start().Value()) return range; |
| 2021 | 2019 |
| 2020 // We can't properly connect liveranges if split occured at the end |
| 2021 // of control instruction. |
| 2022 ASSERT(pos.IsInstructionStart() || |
| 2023 !chunk_->instructions()->at(pos.InstructionIndex())->IsControl()); |
| 2024 |
| 2022 LiveRange* result = LiveRangeFor(next_virtual_register_++); | 2025 LiveRange* result = LiveRangeFor(next_virtual_register_++); |
| 2023 range->SplitAt(pos, result); | 2026 range->SplitAt(pos, result); |
| 2024 return result; | 2027 return result; |
| 2025 } | 2028 } |
| 2026 | 2029 |
| 2027 | 2030 |
| 2028 LiveRange* LAllocator::SplitBetween(LiveRange* range, | 2031 LiveRange* LAllocator::SplitBetween(LiveRange* range, |
| 2029 LifetimePosition start, | 2032 LifetimePosition start, |
| 2030 LifetimePosition end) { | 2033 LifetimePosition end) { |
| 2031 ASSERT(!range->IsFixed()); | 2034 ASSERT(!range->IsFixed()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2132 LiveRange* current = live_ranges()->at(i); | 2135 LiveRange* current = live_ranges()->at(i); |
| 2133 if (current != NULL) current->Verify(); | 2136 if (current != NULL) current->Verify(); |
| 2134 } | 2137 } |
| 2135 } | 2138 } |
| 2136 | 2139 |
| 2137 | 2140 |
| 2138 #endif | 2141 #endif |
| 2139 | 2142 |
| 2140 | 2143 |
| 2141 } } // namespace v8::internal | 2144 } } // namespace v8::internal |
| OLD | NEW |