Index: src/lithium-allocator.cc |
=================================================================== |
--- src/lithium-allocator.cc (revision 10782) |
+++ src/lithium-allocator.cc (working copy) |
@@ -110,9 +110,9 @@ |
} |
-void UseInterval::SplitAt(LifetimePosition pos) { |
+void UseInterval::SplitAt(LifetimePosition pos, Zone* zone) { |
ASSERT(Contains(pos) && pos.Value() != start().Value()); |
- UseInterval* after = new UseInterval(pos, end_); |
+ UseInterval* after = new(zone) UseInterval(pos, end_); |
after->next_ = next_; |
next_ = after; |
end_ = pos; |
@@ -149,7 +149,7 @@ |
#endif |
-LiveRange::LiveRange(int id) |
+LiveRange::LiveRange(int id, Zone* zone) |
: id_(id), |
spilled_(false), |
is_double_(false), |
@@ -161,24 +161,26 @@ |
next_(NULL), |
current_interval_(NULL), |
last_processed_use_(NULL), |
- spill_operand_(new LOperand()), |
+ spill_operand_(new(zone) LOperand()), |
spill_start_index_(kMaxInt) { } |
-void LiveRange::set_assigned_register(int reg, RegisterKind register_kind) { |
+void LiveRange::set_assigned_register(int reg, |
+ RegisterKind register_kind, |
+ Zone* zone) { |
ASSERT(!HasRegisterAssigned() && !IsSpilled()); |
assigned_register_ = reg; |
is_double_ = (register_kind == DOUBLE_REGISTERS); |
- ConvertOperands(); |
+ ConvertOperands(zone); |
} |
-void LiveRange::MakeSpilled() { |
+void LiveRange::MakeSpilled(Zone* zone) { |
ASSERT(!IsSpilled()); |
ASSERT(TopLevel()->HasAllocatedSpillOperand()); |
spilled_ = true; |
assigned_register_ = kInvalidAssignment; |
- ConvertOperands(); |
+ ConvertOperands(zone); |
} |
@@ -246,7 +248,7 @@ |
} |
-LOperand* LiveRange::CreateAssignedOperand() { |
+LOperand* LiveRange::CreateAssignedOperand(Zone* zone) { |
LOperand* op = NULL; |
if (HasRegisterAssigned()) { |
ASSERT(!IsSpilled()); |
@@ -260,7 +262,7 @@ |
op = TopLevel()->GetSpillOperand(); |
ASSERT(!op->IsUnallocated()); |
} else { |
- LUnallocated* unalloc = new LUnallocated(LUnallocated::NONE); |
+ LUnallocated* unalloc = new(zone) LUnallocated(LUnallocated::NONE); |
unalloc->set_virtual_register(id_); |
op = unalloc; |
} |
@@ -292,7 +294,9 @@ |
} |
-void LiveRange::SplitAt(LifetimePosition position, LiveRange* result) { |
+void LiveRange::SplitAt(LifetimePosition position, |
+ LiveRange* result, |
+ Zone* zone) { |
ASSERT(Start().Value() < position.Value()); |
ASSERT(result->IsEmpty()); |
// Find the last interval that ends before the position. If the |
@@ -311,7 +315,7 @@ |
while (current != NULL) { |
if (current->Contains(position)) { |
- current->SplitAt(position); |
+ current->SplitAt(position, zone); |
break; |
} |
UseInterval* next = current->next(); |
@@ -404,7 +408,9 @@ |
} |
-void LiveRange::EnsureInterval(LifetimePosition start, LifetimePosition end) { |
+void LiveRange::EnsureInterval(LifetimePosition start, |
+ LifetimePosition end, |
+ Zone* zone) { |
LAllocator::TraceAlloc("Ensure live range %d in interval [%d %d[\n", |
id_, |
start.Value(), |
@@ -418,7 +424,7 @@ |
first_interval_ = first_interval_->next(); |
} |
- UseInterval* new_interval = new UseInterval(start, new_end); |
+ UseInterval* new_interval = new(zone) UseInterval(start, new_end); |
new_interval->next_ = first_interval_; |
first_interval_ = new_interval; |
if (new_interval->next() == NULL) { |
@@ -427,20 +433,22 @@ |
} |
-void LiveRange::AddUseInterval(LifetimePosition start, LifetimePosition end) { |
+void LiveRange::AddUseInterval(LifetimePosition start, |
+ LifetimePosition end, |
+ Zone* zone) { |
LAllocator::TraceAlloc("Add to live range %d interval [%d %d[\n", |
id_, |
start.Value(), |
end.Value()); |
if (first_interval_ == NULL) { |
- UseInterval* interval = new UseInterval(start, end); |
+ UseInterval* interval = new(zone) UseInterval(start, end); |
first_interval_ = interval; |
last_interval_ = interval; |
} else { |
if (end.Value() == first_interval_->start().Value()) { |
first_interval_->set_start(start); |
} else if (end.Value() < first_interval_->start().Value()) { |
- UseInterval* interval = new UseInterval(start, end); |
+ UseInterval* interval = new(zone) UseInterval(start, end); |
interval->set_next(first_interval_); |
first_interval_ = interval; |
} else { |
@@ -456,11 +464,12 @@ |
UsePosition* LiveRange::AddUsePosition(LifetimePosition pos, |
- LOperand* operand) { |
+ LOperand* operand, |
+ Zone* zone) { |
LAllocator::TraceAlloc("Add to live range %d use position %d\n", |
id_, |
pos.Value()); |
- UsePosition* use_pos = new UsePosition(pos, operand); |
+ UsePosition* use_pos = new(zone) UsePosition(pos, operand); |
UsePosition* prev = NULL; |
UsePosition* current = first_pos_; |
while (current != NULL && current->pos().Value() < pos.Value()) { |
@@ -480,8 +489,8 @@ |
} |
-void LiveRange::ConvertOperands() { |
- LOperand* op = CreateAssignedOperand(); |
+void LiveRange::ConvertOperands(Zone* zone) { |
+ LOperand* op = CreateAssignedOperand(zone); |
UsePosition* use_pos = first_pos(); |
while (use_pos != NULL) { |
ASSERT(Start().Value() <= use_pos->pos().Value() && |
@@ -545,8 +554,8 @@ |
LAllocator::LAllocator(int num_values, HGraph* graph) |
- : chunk_(NULL), |
- allocation_ok_(true), |
+ : zone_(graph->zone()), |
+ chunk_(NULL), |
live_in_sets_(graph->blocks()->length()), |
live_ranges_(num_values * 2), |
fixed_live_ranges_(NULL), |
@@ -560,7 +569,8 @@ |
mode_(GENERAL_REGISTERS), |
num_registers_(-1), |
graph_(graph), |
- has_osr_entry_(false) {} |
+ has_osr_entry_(false), |
+ allocation_ok_(true) { } |
void LAllocator::InitializeLivenessAnalysis() { |
@@ -574,7 +584,7 @@ |
BitVector* LAllocator::ComputeLiveOut(HBasicBlock* block) { |
// Compute live out for the given block, except not including backward |
// successor edges. |
- BitVector* live_out = new BitVector(next_virtual_register_); |
+ BitVector* live_out = new(zone_) BitVector(next_virtual_register_); |
// Process all successor blocks. |
for (HSuccessorIterator it(block->end()); !it.Done(); it.Advance()) { |
@@ -612,7 +622,7 @@ |
while (!iterator.Done()) { |
int operand_index = iterator.Current(); |
LiveRange* range = LiveRangeFor(operand_index); |
- range->AddUseInterval(start, end); |
+ range->AddUseInterval(start, end, zone_); |
iterator.Advance(); |
} |
} |
@@ -654,9 +664,9 @@ |
ASSERT(index < Register::kNumAllocatableRegisters); |
LiveRange* result = fixed_live_ranges_[index]; |
if (result == NULL) { |
- result = new LiveRange(FixedLiveRangeID(index)); |
+ result = new(zone_) LiveRange(FixedLiveRangeID(index), zone_); |
ASSERT(result->IsFixed()); |
- result->set_assigned_register(index, GENERAL_REGISTERS); |
+ result->set_assigned_register(index, GENERAL_REGISTERS, zone_); |
fixed_live_ranges_[index] = result; |
} |
return result; |
@@ -667,9 +677,9 @@ |
ASSERT(index < DoubleRegister::kNumAllocatableRegisters); |
LiveRange* result = fixed_double_live_ranges_[index]; |
if (result == NULL) { |
- result = new LiveRange(FixedDoubleLiveRangeID(index)); |
+ result = new(zone_) LiveRange(FixedDoubleLiveRangeID(index), zone_); |
ASSERT(result->IsFixed()); |
- result->set_assigned_register(index, DOUBLE_REGISTERS); |
+ result->set_assigned_register(index, DOUBLE_REGISTERS, zone_); |
fixed_double_live_ranges_[index] = result; |
} |
return result; |
@@ -682,7 +692,7 @@ |
} |
LiveRange* result = live_ranges_[index]; |
if (result == NULL) { |
- result = new LiveRange(index); |
+ result = new(zone_) LiveRange(index, zone_); |
live_ranges_[index] = result; |
} |
return result; |
@@ -728,15 +738,15 @@ |
if (range->IsEmpty() || range->Start().Value() > position.Value()) { |
// Can happen if there is a definition without use. |
- range->AddUseInterval(position, position.NextInstruction()); |
- range->AddUsePosition(position.NextInstruction(), NULL); |
+ range->AddUseInterval(position, position.NextInstruction(), zone_); |
+ range->AddUsePosition(position.NextInstruction(), NULL, zone_); |
} else { |
range->ShortenTo(position); |
} |
if (operand->IsUnallocated()) { |
LUnallocated* unalloc_operand = LUnallocated::cast(operand); |
- range->AddUsePosition(position, unalloc_operand)->set_hint(hint); |
+ range->AddUsePosition(position, unalloc_operand, zone_)->set_hint(hint); |
} |
} |
@@ -749,9 +759,9 @@ |
if (range == NULL) return; |
if (operand->IsUnallocated()) { |
LUnallocated* unalloc_operand = LUnallocated::cast(operand); |
- range->AddUsePosition(position, unalloc_operand)->set_hint(hint); |
+ range->AddUsePosition(position, unalloc_operand, zone_)->set_hint(hint); |
} |
- range->AddUseInterval(block_start, position); |
+ range->AddUseInterval(block_start, position, zone_); |
} |
@@ -860,7 +870,8 @@ |
if (RequiredRegisterKind(input_copy->virtual_register()) == |
DOUBLE_REGISTERS) { |
double_artificial_registers_.Add( |
- cur_input->virtual_register() - first_artificial_register_); |
+ cur_input->virtual_register() - first_artificial_register_, |
+ zone_); |
} |
AddConstraintsGapMove(gap_index, input_copy, cur_input); |
@@ -964,7 +975,8 @@ |
output->index() != i) { |
LiveRange* range = FixedLiveRangeFor(i); |
range->AddUseInterval(curr_position, |
- curr_position.InstructionEnd()); |
+ curr_position.InstructionEnd(), |
+ zone_); |
} |
} |
} |
@@ -975,7 +987,8 @@ |
output->index() != i) { |
LiveRange* range = FixedDoubleLiveRangeFor(i); |
range->AddUseInterval(curr_position, |
- curr_position.InstructionEnd()); |
+ curr_position.InstructionEnd(), |
+ zone_); |
} |
} |
} |
@@ -1023,7 +1036,7 @@ |
const ZoneList<HPhi*>* phis = block->phis(); |
for (int i = 0; i < phis->length(); ++i) { |
HPhi* phi = phis->at(i); |
- LUnallocated* phi_operand = new LUnallocated(LUnallocated::NONE); |
+ LUnallocated* phi_operand = new(zone_) LUnallocated(LUnallocated::NONE); |
phi_operand->set_virtual_register(phi->id()); |
for (int j = 0; j < phi->OperandCount(); ++j) { |
HValue* op = phi->OperandAt(j); |
@@ -1033,7 +1046,7 @@ |
operand = chunk_->DefineConstantOperand(constant); |
} else { |
ASSERT(!op->EmitAtUses()); |
- LUnallocated* unalloc = new LUnallocated(LUnallocated::ANY); |
+ LUnallocated* unalloc = new(zone_) LUnallocated(LUnallocated::ANY); |
unalloc->set_virtual_register(op->id()); |
operand = unalloc; |
} |
@@ -1140,8 +1153,8 @@ |
if (cur_cover->IsSpilled()) return; |
ASSERT(pred_cover != NULL && cur_cover != NULL); |
if (pred_cover != cur_cover) { |
- LOperand* pred_op = pred_cover->CreateAssignedOperand(); |
- LOperand* cur_op = cur_cover->CreateAssignedOperand(); |
+ LOperand* pred_op = pred_cover->CreateAssignedOperand(zone_); |
+ LOperand* cur_op = cur_cover->CreateAssignedOperand(zone_); |
if (!pred_op->Equals(cur_op)) { |
LGap* gap = NULL; |
if (block->predecessors()->length() == 1) { |
@@ -1213,8 +1226,8 @@ |
} |
if (should_insert) { |
LParallelMove* move = GetConnectingParallelMove(pos); |
- LOperand* prev_operand = first_range->CreateAssignedOperand(); |
- LOperand* cur_operand = second_range->CreateAssignedOperand(); |
+ LOperand* prev_operand = first_range->CreateAssignedOperand(zone_); |
+ LOperand* cur_operand = second_range->CreateAssignedOperand(zone_); |
move->AddMove(prev_operand, cur_operand); |
} |
} |
@@ -1317,7 +1330,7 @@ |
while (!iterator.Done()) { |
int operand_index = iterator.Current(); |
LiveRange* range = LiveRangeFor(operand_index); |
- range->EnsureInterval(start, end); |
+ range->EnsureInterval(start, end, zone_); |
iterator.Advance(); |
} |
@@ -1438,7 +1451,7 @@ |
TraceAlloc("Pointer in register for range %d (start at %d) " |
"at safe point %d\n", |
cur->id(), cur->Start().Value(), safe_point); |
- LOperand* operand = cur->CreateAssignedOperand(); |
+ LOperand* operand = cur->CreateAssignedOperand(zone_); |
ASSERT(!operand->IsStackSlot()); |
map->RecordPointer(operand); |
} |
@@ -1810,7 +1823,7 @@ |
TraceAlloc("Assigning preferred reg %s to live range %d\n", |
RegisterName(register_index), |
current->id()); |
- current->set_assigned_register(register_index, mode_); |
+ current->set_assigned_register(register_index, mode_, zone_); |
return true; |
} |
} |
@@ -1846,7 +1859,7 @@ |
TraceAlloc("Assigning free reg %s to live range %d\n", |
RegisterName(reg), |
current->id()); |
- current->set_assigned_register(reg, mode_); |
+ current->set_assigned_register(reg, mode_, zone_); |
return true; |
} |
@@ -1936,7 +1949,7 @@ |
TraceAlloc("Assigning blocked reg %s to live range %d\n", |
RegisterName(reg), |
current->id()); |
- current->set_assigned_register(reg, mode_); |
+ current->set_assigned_register(reg, mode_, zone_); |
// This register was not free. Thus we need to find and spill |
// parts of active and inactive live regions that use the same register |
@@ -2003,7 +2016,7 @@ |
LiveRange* result = LiveRangeFor(GetVirtualRegister()); |
if (!AllocationOk()) return NULL; |
- range->SplitAt(pos, result); |
+ range->SplitAt(pos, result, zone_); |
return result; |
} |
@@ -2102,7 +2115,7 @@ |
if (op == NULL) op = chunk_->GetNextSpillSlot(mode_ == DOUBLE_REGISTERS); |
first->SetSpillOperand(op); |
} |
- range->MakeSpilled(); |
+ range->MakeSpilled(zone_); |
} |