Index: src/lithium-allocator.cc |
=================================================================== |
--- src/lithium-allocator.cc (revision 6414) |
+++ src/lithium-allocator.cc (working copy) |
@@ -25,7 +25,7 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-#include "lithium-allocator.h" |
+#include "lithium-allocator-inl.h" |
#include "hydrogen.h" |
#include "string-stream.h" |
@@ -761,23 +761,23 @@ |
int end = block->last_instruction_index(); |
for (int i = start; i <= end; ++i) { |
if (chunk_->IsGapAt(i)) { |
- InstructionSummary* summary = NULL; |
- InstructionSummary* prev_summary = NULL; |
- if (i < end) summary = GetSummary(i + 1); |
- if (i > start) prev_summary = GetSummary(i - 1); |
- MeetConstraintsBetween(prev_summary, summary, i); |
+ LInstruction* instr = NULL; |
+ LInstruction* prev_instr = NULL; |
+ if (i < end) instr = chunk_->instructions()->at(i + 1); |
+ if (i > start) prev_instr = chunk_->instructions()->at(i - 1); |
+ MeetConstraintsBetween(prev_instr, instr, i); |
} |
} |
} |
-void LAllocator::MeetConstraintsBetween(InstructionSummary* first, |
- InstructionSummary* second, |
+void LAllocator::MeetConstraintsBetween(LInstruction* first, |
+ LInstruction* second, |
int gap_index) { |
// Handle fixed temporaries. |
if (first != NULL) { |
- for (int i = 0; i < first->TempCount(); ++i) { |
- LUnallocated* temp = LUnallocated::cast(first->TempAt(i)); |
+ for (TempIterator it = first->GetTempIterator(); it.HasNext(); ) { |
Kevin Millikin (Chromium)
2011/01/20 12:20:30
for (TempIterator it(first); it.HasNext(); it.Adva
fschneider
2011/01/20 17:13:08
Done.
|
+ LUnallocated* temp = LUnallocated::cast(it.Next()); |
Kevin Millikin (Chromium)
2011/01/20 12:20:30
There's an extra space after =.
fschneider
2011/01/20 17:13:08
Done.
|
if (temp->HasFixedPolicy()) { |
AllocateFixed(temp, gap_index - 1, false); |
} |
@@ -818,8 +818,8 @@ |
// Handle fixed input operands of second instruction. |
if (second != NULL) { |
- for (int i = 0; i < second->InputCount(); ++i) { |
- LUnallocated* cur_input = LUnallocated::cast(second->InputAt(i)); |
+ for (UseIterator it = second->GetUseIterator(); it.HasNext(); ) { |
+ LUnallocated* cur_input = LUnallocated::cast(it.Next()); |
if (cur_input->HasFixedPolicy()) { |
LUnallocated* input_copy = cur_input->CopyUnconstrained(); |
bool is_tagged = HasTaggedValue(cur_input->VirtualRegister()); |
@@ -848,7 +848,7 @@ |
if (second != NULL && second->Output() != NULL) { |
LUnallocated* second_output = LUnallocated::cast(second->Output()); |
if (second_output->HasSameAsInputPolicy()) { |
- LUnallocated* cur_input = LUnallocated::cast(second->InputAt(0)); |
+ LUnallocated* cur_input = LUnallocated::cast(second->FirstInput()); |
int output_vreg = second_output->VirtualRegister(); |
int input_vreg = cur_input->VirtualRegister(); |
@@ -923,16 +923,16 @@ |
} |
} else { |
ASSERT(!chunk_->IsGapAt(index)); |
- InstructionSummary* summary = GetSummary(index); |
+ LInstruction* instr = chunk_->instructions()->at(index); |
Kevin Millikin (Chromium)
2011/01/20 12:20:30
It might be easier to read and write these sites i
fschneider
2011/01/20 17:13:08
Done. Introduces InstructionAt and GapAt helpers.
|
- if (summary != NULL) { |
- LOperand* output = summary->Output(); |
+ if (instr != NULL) { |
+ LOperand* output = instr->Output(); |
if (output != NULL) { |
if (output->IsUnallocated()) live->Remove(output->VirtualRegister()); |
Define(curr_position, output, NULL); |
} |
- if (summary->IsCall()) { |
+ if (instr->IsMarkedAsCall()) { |
for (int i = 0; i < Register::kNumAllocatableRegisters; ++i) { |
if (output == NULL || !output->IsRegister() || |
output->index() != i) { |
@@ -943,7 +943,7 @@ |
} |
} |
- if (summary->IsCall() || summary->IsSaveDoubles()) { |
+ if (instr->IsMarkedAsCall() || instr->IsSaveDoubles()) { |
for (int i = 0; i < DoubleRegister::kNumAllocatableRegisters; ++i) { |
if (output == NULL || !output->IsDoubleRegister() || |
output->index() != i) { |
@@ -954,8 +954,8 @@ |
} |
} |
- for (int i = 0; i < summary->InputCount(); ++i) { |
- LOperand* input = summary->InputAt(i); |
+ for (UseIterator it = instr->GetUseIterator(); it.HasNext(); ) { |
+ LOperand* input = it.Next(); |
LifetimePosition use_pos; |
if (input->IsUnallocated() && |
@@ -969,9 +969,9 @@ |
if (input->IsUnallocated()) live->Add(input->VirtualRegister()); |
} |
- for (int i = 0; i < summary->TempCount(); ++i) { |
- LOperand* temp = summary->TempAt(i); |
- if (summary->IsCall()) { |
+ for (TempIterator it = instr->GetTempIterator(); it.HasNext(); ) { |
+ LOperand* temp = it.Next(); |
+ if (instr->IsMarkedAsCall()) { |
if (temp->IsRegister()) continue; |
if (temp->IsUnallocated()) { |
LUnallocated* temp_unalloc = LUnallocated::cast(temp); |
@@ -1558,12 +1558,6 @@ |
} |
-void LAllocator::RecordUse(HValue* value, LUnallocated* operand) { |
- operand->set_virtual_register(value->id()); |
- current_summary()->AddInput(operand); |
-} |
- |
- |
bool LAllocator::HasTaggedValue(int virtual_register) const { |
HValue* value = graph()->LookupValue(virtual_register); |
if (value == NULL) return false; |
@@ -1586,39 +1580,8 @@ |
} |
-void LAllocator::MarkAsCall() { |
- // Call instructions can use only fixed registers as |
- // temporaries and outputs because all registers |
- // are blocked by the calling convention. |
- // Inputs can use either fixed register or have a short lifetime (be |
- // used at start of the instruction). |
- InstructionSummary* summary = current_summary(); |
-#ifdef DEBUG |
- ASSERT(summary->Output() == NULL || |
- LUnallocated::cast(summary->Output())->HasFixedPolicy() || |
- !LUnallocated::cast(summary->Output())->HasRegisterPolicy()); |
- for (int i = 0; i < summary->InputCount(); i++) { |
- ASSERT(LUnallocated::cast(summary->InputAt(i))->HasFixedPolicy() || |
- LUnallocated::cast(summary->InputAt(i))->IsUsedAtStart() || |
- !LUnallocated::cast(summary->InputAt(i))->HasRegisterPolicy()); |
- } |
- for (int i = 0; i < summary->TempCount(); i++) { |
- ASSERT(LUnallocated::cast(summary->TempAt(i))->HasFixedPolicy() || |
- !LUnallocated::cast(summary->TempAt(i))->HasRegisterPolicy()); |
- } |
-#endif |
- summary->MarkAsCall(); |
-} |
- |
- |
-void LAllocator::MarkAsSaveDoubles() { |
- current_summary()->MarkAsSaveDoubles(); |
-} |
- |
- |
void LAllocator::RecordDefinition(HInstruction* instr, LUnallocated* operand) { |
operand->set_virtual_register(instr->id()); |
- current_summary()->SetOutput(operand); |
} |
@@ -1627,43 +1590,19 @@ |
if (!operand->HasFixedPolicy()) { |
operand->set_virtual_register(next_virtual_register_++); |
} |
- current_summary()->AddTemp(operand); |
} |
-int LAllocator::max_initial_value_ids() { |
- return LUnallocated::kMaxVirtualRegisters / 32; |
+void LAllocator::RecordUse(HValue* value, LUnallocated* operand) { |
+ operand->set_virtual_register(value->id()); |
} |
-void LAllocator::BeginInstruction() { |
- if (next_summary_ == NULL) { |
- next_summary_ = new InstructionSummary(); |
- } |
- summary_stack_.Add(next_summary_); |
- next_summary_ = NULL; |
+int LAllocator::max_initial_value_ids() { |
+ return LUnallocated::kMaxVirtualRegisters / 32; |
} |
-void LAllocator::SummarizeInstruction(int index) { |
- InstructionSummary* sum = summary_stack_.RemoveLast(); |
- if (summaries_.length() <= index) { |
- summaries_.AddBlock(NULL, index + 1 - summaries_.length()); |
- } |
- ASSERT(summaries_[index] == NULL); |
- if (sum->Output() != NULL || sum->InputCount() > 0 || sum->TempCount() > 0) { |
- summaries_[index] = sum; |
- } else { |
- next_summary_ = sum; |
- } |
-} |
- |
- |
-void LAllocator::OmitInstruction() { |
- summary_stack_.RemoveLast(); |
-} |
- |
- |
void LAllocator::AddToActive(LiveRange* range) { |
TraceAlloc("Add live range %d to active\n", range->id()); |
active_live_ranges_.Add(range); |