| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/live-range-separator.h" | 5 #include "src/compiler/live-range-separator.h" |
| 6 #include "src/compiler/register-allocator.h" | 6 #include "src/compiler/register-allocator.h" |
| 7 | 7 |
| 8 namespace v8 { | 8 namespace v8 { |
| 9 namespace internal { | 9 namespace internal { |
| 10 namespace compiler { | 10 namespace compiler { |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // last_deferred + 1 is not deferred, so no point in visiting it. | 106 // last_deferred + 1 is not deferred, so no point in visiting it. |
| 107 i = last_deferred.ToInt() + 1; | 107 i = last_deferred.ToInt() + 1; |
| 108 | 108 |
| 109 LifetimePosition first_cut = LifetimePosition::GapFromInstructionIndex( | 109 LifetimePosition first_cut = LifetimePosition::GapFromInstructionIndex( |
| 110 block->first_instruction_index()); | 110 block->first_instruction_index()); |
| 111 | 111 |
| 112 LifetimePosition last_cut = LifetimePosition::GapFromInstructionIndex( | 112 LifetimePosition last_cut = LifetimePosition::GapFromInstructionIndex( |
| 113 static_cast<int>(code->instructions().size())); | 113 static_cast<int>(code->instructions().size())); |
| 114 | 114 |
| 115 const BitVector *in_set = in_sets[block->rpo_number().ToInt()]; | 115 const BitVector *in_set = in_sets[block->rpo_number().ToInt()]; |
| 116 BitVector ranges_to_splinter(*in_set, zone); |
| 116 InstructionBlock *last = code->InstructionBlockAt(last_deferred); | 117 InstructionBlock *last = code->InstructionBlockAt(last_deferred); |
| 117 const BitVector *out_set = LiveRangeBuilder::ComputeLiveOut(last, data); | 118 for (int deferred_id = block->rpo_number().ToInt(); |
| 119 deferred_id <= last->rpo_number().ToInt(); ++deferred_id) { |
| 120 const BitVector *ins = in_sets[deferred_id]; |
| 121 ranges_to_splinter.Union(*ins); |
| 122 const BitVector *outs = LiveRangeBuilder::ComputeLiveOut( |
| 123 code->InstructionBlockAt(RpoNumber::FromInt(deferred_id)), data); |
| 124 ranges_to_splinter.Union(*outs); |
| 125 } |
| 126 |
| 118 int last_index = last->last_instruction_index(); | 127 int last_index = last->last_instruction_index(); |
| 119 if (code->InstructionAt(last_index)->opcode() == | 128 if (code->InstructionAt(last_index)->opcode() == |
| 120 ArchOpcode::kArchDeoptimize) { | 129 ArchOpcode::kArchDeoptimize) { |
| 121 ++last_index; | 130 ++last_index; |
| 122 } | 131 } |
| 123 last_cut = LifetimePosition::GapFromInstructionIndex(last_index); | 132 last_cut = LifetimePosition::GapFromInstructionIndex(last_index); |
| 124 | 133 |
| 125 BitVector ranges_to_splinter(*in_set, zone); | |
| 126 ranges_to_splinter.Union(*out_set); | |
| 127 BitVector::Iterator iterator(&ranges_to_splinter); | 134 BitVector::Iterator iterator(&ranges_to_splinter); |
| 128 | 135 |
| 129 while (!iterator.Done()) { | 136 while (!iterator.Done()) { |
| 130 int range_id = iterator.Current(); | 137 int range_id = iterator.Current(); |
| 131 iterator.Advance(); | 138 iterator.Advance(); |
| 132 | 139 |
| 133 TopLevelLiveRange *range = data->live_ranges()[range_id]; | 140 TopLevelLiveRange *range = data->live_ranges()[range_id]; |
| 134 CreateSplinter(range, data, first_cut, last_cut); | 141 CreateSplinter(range, data, first_cut, last_cut); |
| 135 } | 142 } |
| 136 } | 143 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 154 TopLevelLiveRange *splinter_parent = range->splintered_from(); | 161 TopLevelLiveRange *splinter_parent = range->splintered_from(); |
| 155 | 162 |
| 156 splinter_parent->Merge(range, data()); | 163 splinter_parent->Merge(range, data()); |
| 157 } | 164 } |
| 158 } | 165 } |
| 159 | 166 |
| 160 | 167 |
| 161 } // namespace compiler | 168 } // namespace compiler |
| 162 } // namespace internal | 169 } // namespace internal |
| 163 } // namespace v8 | 170 } // namespace v8 |
| OLD | NEW |