Index: src/compiler/register-allocator.cc |
diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc |
index e4a2dd7620d55ad1b9ebfc2a086077817e9ff159..e0407527fa66d52d8cb5f8ad64bd728d4c0b6e33 100644 |
--- a/src/compiler/register-allocator.cc |
+++ b/src/compiler/register-allocator.cc |
@@ -49,7 +49,7 @@ const int* GetAllocatableRegisterCodes(const RegisterConfiguration* cfg, |
const InstructionBlock* GetContainingLoop(const InstructionSequence* sequence, |
const InstructionBlock* block) { |
- auto index = block->loop_header(); |
+ RpoNumber index = block->loop_header(); |
if (!index.IsValid()) return nullptr; |
return sequence->InstructionBlockAt(index); |
} |
@@ -69,7 +69,7 @@ Instruction* GetLastInstruction(InstructionSequence* code, |
bool IsOutputRegisterOf(Instruction* instr, Register reg) { |
for (size_t i = 0; i < instr->OutputCount(); i++) { |
- auto output = instr->OutputAt(i); |
+ InstructionOperand* output = instr->OutputAt(i); |
if (output->IsRegister() && |
LocationOperand::cast(output)->GetRegister().is(reg)) { |
return true; |
@@ -81,7 +81,7 @@ bool IsOutputRegisterOf(Instruction* instr, Register reg) { |
bool IsOutputDoubleRegisterOf(Instruction* instr, DoubleRegister reg) { |
for (size_t i = 0; i < instr->OutputCount(); i++) { |
- auto output = instr->OutputAt(i); |
+ InstructionOperand* output = instr->OutputAt(i); |
if (output->IsDoubleRegister() && |
LocationOperand::cast(output)->GetDoubleRegister().is(reg)) { |
return true; |
@@ -150,14 +150,15 @@ bool UsePosition::HintRegister(int* register_code) const { |
case UsePositionHintType::kUnresolved: |
return false; |
case UsePositionHintType::kUsePos: { |
- auto use_pos = reinterpret_cast<UsePosition*>(hint_); |
+ UsePosition* use_pos = reinterpret_cast<UsePosition*>(hint_); |
int assigned_register = AssignedRegisterField::decode(use_pos->flags_); |
if (assigned_register == kUnassignedRegister) return false; |
*register_code = assigned_register; |
return true; |
} |
case UsePositionHintType::kOperand: { |
- auto operand = reinterpret_cast<InstructionOperand*>(hint_); |
+ InstructionOperand* operand = |
+ reinterpret_cast<InstructionOperand*>(hint_); |
int assigned_register = |
operand->IsRegister() |
? LocationOperand::cast(operand)->GetRegister().code() |
@@ -166,7 +167,8 @@ bool UsePosition::HintRegister(int* register_code) const { |
return true; |
} |
case UsePositionHintType::kPhi: { |
- auto phi = reinterpret_cast<RegisterAllocationData::PhiMapValue*>(hint_); |
+ RegisterAllocationData::PhiMapValue* phi = |
+ reinterpret_cast<RegisterAllocationData::PhiMapValue*>(hint_); |
int assigned_register = phi->assigned_register(); |
if (assigned_register == kUnassignedRegister) return false; |
*register_code = assigned_register; |
@@ -222,7 +224,7 @@ void UsePosition::set_type(UsePositionType type, bool register_beneficial) { |
UseInterval* UseInterval::SplitAt(LifetimePosition pos, Zone* zone) { |
DCHECK(Contains(pos) && pos != start()); |
- auto after = new (zone) UseInterval(pos, end_); |
+ UseInterval* after = new (zone) UseInterval(pos, end_); |
after->next_ = next_; |
next_ = nullptr; |
end_ = pos; |
@@ -280,8 +282,8 @@ LiveRange::LiveRange(int relative_id, MachineRepresentation rep, |
void LiveRange::VerifyPositions() const { |
// Walk the positions, verifying that each is in an interval. |
- auto interval = first_interval_; |
- for (auto pos = first_pos_; pos != nullptr; pos = pos->next()) { |
+ UseInterval* interval = first_interval_; |
+ for (UsePosition* pos = first_pos_; pos != nullptr; pos = pos->next()) { |
CHECK(Start() <= pos->pos()); |
CHECK(pos->pos() <= End()); |
CHECK(interval != nullptr); |
@@ -332,7 +334,7 @@ RegisterKind LiveRange::kind() const { |
UsePosition* LiveRange::FirstHintPosition(int* register_index) const { |
- for (auto pos = first_pos_; pos != nullptr; pos = pos->next()) { |
+ for (UsePosition* pos = first_pos_; pos != nullptr; pos = pos->next()) { |
if (pos->HintRegister(register_index)) return pos; |
} |
return nullptr; |
@@ -364,7 +366,7 @@ UsePosition* LiveRange::NextUsePositionRegisterIsBeneficial( |
UsePosition* LiveRange::PreviousUsePositionRegisterIsBeneficial( |
LifetimePosition start) const { |
- auto pos = first_pos(); |
+ UsePosition* pos = first_pos(); |
UsePosition* prev = nullptr; |
while (pos != nullptr && pos->pos() < start) { |
if (pos->RegisterIsBeneficial()) prev = pos; |
@@ -396,7 +398,7 @@ UsePosition* LiveRange::NextSlotPosition(LifetimePosition start) const { |
bool LiveRange::CanBeSpilled(LifetimePosition pos) const { |
// We cannot spill a live range that has a use requiring a register |
// at the current or the immediate next position. |
- auto use_pos = NextRegisterPosition(pos); |
+ UsePosition* use_pos = NextRegisterPosition(pos); |
if (use_pos == nullptr) return true; |
return use_pos->pos() > pos.NextStart().End(); |
} |
@@ -414,7 +416,7 @@ InstructionOperand LiveRange::GetAssignedOperand() const { |
DCHECK(spilled()); |
DCHECK(!HasRegisterAssigned()); |
if (TopLevel()->HasSpillOperand()) { |
- auto op = TopLevel()->GetSpillOperand(); |
+ InstructionOperand* op = TopLevel()->GetSpillOperand(); |
DCHECK(!op->IsUnallocated()); |
return *op; |
} |
@@ -437,8 +439,9 @@ void LiveRange::AdvanceLastProcessedMarker( |
UseInterval* to_start_of, LifetimePosition but_not_past) const { |
if (to_start_of == nullptr) return; |
if (to_start_of->start() > but_not_past) return; |
- auto start = current_interval_ == nullptr ? LifetimePosition::Invalid() |
- : current_interval_->start(); |
+ LifetimePosition start = current_interval_ == nullptr |
+ ? LifetimePosition::Invalid() |
+ : current_interval_->start(); |
if (to_start_of->start() > start) { |
current_interval_ = to_start_of; |
} |
@@ -465,7 +468,7 @@ UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result, |
// Find the last interval that ends before the position. If the |
// position is contained in one of the intervals in the chain, we |
// split that interval and use the first part. |
- auto current = FirstSearchIntervalForPosition(position); |
+ UseInterval* current = FirstSearchIntervalForPosition(position); |
// If the split position coincides with the beginning of a use interval |
// we need to split use positons in a special way. |
@@ -482,7 +485,7 @@ UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result, |
after = current->SplitAt(position, zone); |
break; |
} |
- auto next = current->next(); |
+ UseInterval* next = current->next(); |
if (next->start() >= position) { |
split_at_start = (next->start() == position); |
after = next; |
@@ -494,7 +497,7 @@ UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result, |
DCHECK(nullptr != after); |
// Partition original use intervals to the two live ranges. |
- auto before = current; |
+ UseInterval* before = current; |
result->last_interval_ = |
(last_interval_ == before) |
? after // Only interval in the range after split. |
@@ -504,7 +507,7 @@ UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result, |
// Find the last use position before the split and the first use |
// position after it. |
- auto use_after = |
+ UsePosition* use_after = |
splitting_pointer_ == nullptr || splitting_pointer_->pos() > position |
? first_pos() |
: splitting_pointer_; |
@@ -559,7 +562,7 @@ void LiveRange::UpdateParentForAllChildren(TopLevelLiveRange* new_top_level) { |
void LiveRange::ConvertUsesToOperand(const InstructionOperand& op, |
const InstructionOperand& spill_op) { |
- for (auto pos = first_pos(); pos != nullptr; pos = pos->next()) { |
+ for (UsePosition* pos = first_pos(); pos != nullptr; pos = pos->next()) { |
DCHECK(Start() <= pos->pos() && pos->pos() <= End()); |
if (!pos->HasOperand()) continue; |
switch (pos->type()) { |
@@ -598,7 +601,7 @@ bool LiveRange::ShouldBeAllocatedBefore(const LiveRange* other) const { |
void LiveRange::SetUseHints(int register_index) { |
- for (auto pos = first_pos(); pos != nullptr; pos = pos->next()) { |
+ for (UsePosition* pos = first_pos(); pos != nullptr; pos = pos->next()) { |
if (!pos->HasOperand()) continue; |
switch (pos->type()) { |
case UsePositionType::kRequiresSlot: |
@@ -620,8 +623,8 @@ bool LiveRange::CanCover(LifetimePosition position) const { |
bool LiveRange::Covers(LifetimePosition position) const { |
if (!CanCover(position)) return false; |
- auto start_search = FirstSearchIntervalForPosition(position); |
- for (auto interval = start_search; interval != nullptr; |
+ UseInterval* start_search = FirstSearchIntervalForPosition(position); |
+ for (UseInterval* interval = start_search; interval != nullptr; |
interval = interval->next()) { |
DCHECK(interval->next() == nullptr || |
interval->next()->start() >= interval->start()); |
@@ -634,14 +637,14 @@ bool LiveRange::Covers(LifetimePosition position) const { |
LifetimePosition LiveRange::FirstIntersection(LiveRange* other) const { |
- auto b = other->first_interval(); |
+ UseInterval* b = other->first_interval(); |
if (b == nullptr) return LifetimePosition::Invalid(); |
- auto advance_last_processed_up_to = b->start(); |
- auto a = FirstSearchIntervalForPosition(b->start()); |
+ LifetimePosition advance_last_processed_up_to = b->start(); |
+ UseInterval* a = FirstSearchIntervalForPosition(b->start()); |
while (a != nullptr && b != nullptr) { |
if (a->start() > other->End()) break; |
if (b->start() > End()) break; |
- auto cur_intersection = a->Intersect(b); |
+ LifetimePosition cur_intersection = a->Intersect(b); |
if (cur_intersection.IsValid()) { |
return cur_intersection; |
} |
@@ -660,7 +663,7 @@ LifetimePosition LiveRange::FirstIntersection(LiveRange* other) const { |
unsigned LiveRange::GetSize() { |
if (size_ == kInvalidSize) { |
size_ = 0; |
- for (auto interval = first_interval(); interval != nullptr; |
+ for (const UseInterval* interval = first_interval(); interval != nullptr; |
interval = interval->next()) { |
size_ += (interval->end().value() - interval->start().value()); |
} |
@@ -741,14 +744,15 @@ bool TopLevelLiveRange::TryCommitSpillInDeferredBlock( |
for (const LiveRange* child = this; child != nullptr; child = child->next()) { |
if (!child->spilled() && |
child->NextSlotPosition(child->Start()) != nullptr) { |
- auto instr = code->InstructionAt(child->Start().ToInstructionIndex()); |
+ Instruction* instr = |
+ code->InstructionAt(child->Start().ToInstructionIndex()); |
// Insert spill at the end to let live range connections happen at START. |
- auto move = |
+ ParallelMove* move = |
instr->GetOrCreateParallelMove(Instruction::END, code->zone()); |
InstructionOperand assigned = child->GetAssignedOperand(); |
if (TopLevel()->has_slot_use()) { |
bool found = false; |
- for (auto move_op : *move) { |
+ for (MoveOperands* move_op : *move) { |
if (move_op->IsEliminated()) continue; |
if (move_op->source().Equals(assigned) && |
move_op->destination().Equals(spill_operand)) { |
@@ -771,17 +775,18 @@ void TopLevelLiveRange::CommitSpillMoves(InstructionSequence* sequence, |
const InstructionOperand& op, |
bool might_be_duplicated) { |
DCHECK_IMPLIES(op.IsConstant(), spill_move_insertion_locations() == nullptr); |
- auto zone = sequence->zone(); |
+ Zone* zone = sequence->zone(); |
- for (auto to_spill = spill_move_insertion_locations(); to_spill != nullptr; |
- to_spill = to_spill->next) { |
- auto instr = sequence->InstructionAt(to_spill->gap_index); |
- auto move = instr->GetOrCreateParallelMove(Instruction::START, zone); |
+ for (SpillMoveInsertionList* to_spill = spill_move_insertion_locations(); |
+ to_spill != nullptr; to_spill = to_spill->next) { |
+ Instruction* instr = sequence->InstructionAt(to_spill->gap_index); |
+ ParallelMove* move = |
+ instr->GetOrCreateParallelMove(Instruction::START, zone); |
// Skip insertion if it's possible that the move exists already as a |
// constraint move from a fixed output register to a slot. |
if (might_be_duplicated || has_preassigned_slot()) { |
bool found = false; |
- for (auto move_op : *move) { |
+ for (MoveOperands* move_op : *move) { |
if (move_op->IsEliminated()) continue; |
if (move_op->source().Equals(*to_spill->operand) && |
move_op->destination().Equals(op)) { |
@@ -815,7 +820,7 @@ void TopLevelLiveRange::SetSpillRange(SpillRange* spill_range) { |
AllocatedOperand TopLevelLiveRange::GetSpillRangeOperand() const { |
- auto spill_range = GetSpillRange(); |
+ SpillRange* spill_range = GetSpillRange(); |
int index = spill_range->assigned_slot(); |
return AllocatedOperand(LocationOperand::STACK_SLOT, representation(), index); |
} |
@@ -1002,7 +1007,7 @@ void TopLevelLiveRange::EnsureInterval(LifetimePosition start, |
LifetimePosition end, Zone* zone) { |
TRACE("Ensure live range %d in interval [%d %d[\n", vreg(), start.value(), |
end.value()); |
- auto new_end = end; |
+ LifetimePosition new_end = end; |
while (first_interval_ != nullptr && first_interval_->start() <= end) { |
if (first_interval_->end() > end) { |
new_end = first_interval_->end(); |
@@ -1010,7 +1015,7 @@ void TopLevelLiveRange::EnsureInterval(LifetimePosition start, |
first_interval_ = first_interval_->next(); |
} |
- auto new_interval = new (zone) UseInterval(start, new_end); |
+ UseInterval* new_interval = new (zone) UseInterval(start, new_end); |
new_interval->set_next(first_interval_); |
first_interval_ = new_interval; |
if (new_interval->next() == nullptr) { |
@@ -1024,14 +1029,14 @@ void TopLevelLiveRange::AddUseInterval(LifetimePosition start, |
TRACE("Add to live range %d interval [%d %d[\n", vreg(), start.value(), |
end.value()); |
if (first_interval_ == nullptr) { |
- auto interval = new (zone) UseInterval(start, end); |
+ UseInterval* interval = new (zone) UseInterval(start, end); |
first_interval_ = interval; |
last_interval_ = interval; |
} else { |
if (end == first_interval_->start()) { |
first_interval_->set_start(start); |
} else if (end < first_interval_->start()) { |
- auto interval = new (zone) UseInterval(start, end); |
+ UseInterval* interval = new (zone) UseInterval(start, end); |
interval->set_next(first_interval_); |
first_interval_ = interval; |
} else { |
@@ -1047,11 +1052,11 @@ void TopLevelLiveRange::AddUseInterval(LifetimePosition start, |
void TopLevelLiveRange::AddUsePosition(UsePosition* use_pos) { |
- auto pos = use_pos->pos(); |
+ LifetimePosition pos = use_pos->pos(); |
TRACE("Add to live range %d use position %d\n", vreg(), pos.value()); |
UsePosition* prev_hint = nullptr; |
UsePosition* prev = nullptr; |
- auto current = first_pos_; |
+ UsePosition* current = first_pos_; |
while (current != nullptr && current->pos() < pos) { |
prev_hint = current->HasHint() ? current : prev_hint; |
prev = current; |
@@ -1100,8 +1105,8 @@ std::ostream& operator<<(std::ostream& os, |
if (range->TopLevel()->is_non_loop_phi()) os << "nlphi "; |
os << "{" << std::endl; |
- auto interval = range->first_interval(); |
- auto use_pos = range->first_pos(); |
+ UseInterval* interval = range->first_interval(); |
+ UsePosition* use_pos = range->first_pos(); |
PrintableInstructionOperand pio; |
pio.register_configuration_ = printable_range.register_configuration_; |
while (use_pos != nullptr) { |
@@ -1136,9 +1141,9 @@ SpillRange::SpillRange(TopLevelLiveRange* parent, Zone* zone) |
UseInterval* node = nullptr; |
// Copy the intervals for all ranges. |
for (LiveRange* range = parent; range != nullptr; range = range->next()) { |
- auto src = range->first_interval(); |
+ UseInterval* src = range->first_interval(); |
while (src != nullptr) { |
- auto new_node = new (zone) UseInterval(src->start(), src->end()); |
+ UseInterval* new_node = new (zone) UseInterval(src->start(), src->end()); |
if (result == nullptr) { |
result = new_node; |
} else { |
@@ -1178,7 +1183,7 @@ bool SpillRange::TryMerge(SpillRange* other) { |
return false; |
} |
- auto max = LifetimePosition::MaxPosition(); |
+ LifetimePosition max = LifetimePosition::MaxPosition(); |
if (End() < other->End() && other->End() != max) { |
end_position_ = other->End(); |
} |
@@ -1187,7 +1192,7 @@ bool SpillRange::TryMerge(SpillRange* other) { |
MergeDisjointIntervals(other->use_interval_); |
other->use_interval_ = nullptr; |
- for (auto range : other->live_ranges()) { |
+ for (TopLevelLiveRange* range : other->live_ranges()) { |
DCHECK(range->GetSpillRange() == other); |
range->SetSpillRange(this); |
} |
@@ -1202,7 +1207,7 @@ bool SpillRange::TryMerge(SpillRange* other) { |
void SpillRange::MergeDisjointIntervals(UseInterval* other) { |
UseInterval* tail = nullptr; |
- auto current = use_interval_; |
+ UseInterval* current = use_interval_; |
while (other != nullptr) { |
// Make sure the 'current' list starts first |
if (current == nullptr || current->start() > other->start()) { |
@@ -1257,7 +1262,7 @@ void RegisterAllocationData::PhiMapValue::AddOperand( |
void RegisterAllocationData::PhiMapValue::CommitAssignment( |
const InstructionOperand& assigned) { |
- for (auto operand : incoming_operands_) { |
+ for (InstructionOperand* operand : incoming_operands_) { |
InstructionOperand::ReplaceWith(operand, &assigned); |
} |
} |
@@ -1306,8 +1311,8 @@ RegisterAllocationData::RegisterAllocationData( |
MoveOperands* RegisterAllocationData::AddGapMove( |
int index, Instruction::GapPosition position, |
const InstructionOperand& from, const InstructionOperand& to) { |
- auto instr = code()->InstructionAt(index); |
- auto moves = instr->GetOrCreateParallelMove(position, code_zone()); |
+ Instruction* instr = code()->InstructionAt(index); |
+ ParallelMove* moves = instr->GetOrCreateParallelMove(position, code_zone()); |
return moves->AddMove(from, to); |
} |
@@ -1323,7 +1328,7 @@ TopLevelLiveRange* RegisterAllocationData::GetOrCreateLiveRangeFor(int index) { |
if (index >= static_cast<int>(live_ranges().size())) { |
live_ranges().resize(index + 1, nullptr); |
} |
- auto result = live_ranges()[index]; |
+ TopLevelLiveRange* result = live_ranges()[index]; |
if (result == nullptr) { |
result = NewLiveRange(index, RepresentationFor(index)); |
live_ranges()[index] = result; |
@@ -1357,7 +1362,7 @@ TopLevelLiveRange* RegisterAllocationData::NextLiveRange( |
RegisterAllocationData::PhiMapValue* RegisterAllocationData::InitializePhiMap( |
const InstructionBlock* block, PhiInstruction* phi) { |
- auto map_value = new (allocation_zone()) |
+ RegisterAllocationData::PhiMapValue* map_value = new (allocation_zone()) |
RegisterAllocationData::PhiMapValue(phi, block, allocation_zone()); |
auto res = |
phi_map_.insert(std::make_pair(phi->virtual_register(), map_value)); |
@@ -1457,7 +1462,7 @@ SpillRange* RegisterAllocationData::CreateSpillRangeForLiveRange( |
TopLevelLiveRange* range) { |
DCHECK(!range->HasSpillOperand()); |
DCHECK(!range->IsSplinter()); |
- auto spill_range = |
+ SpillRange* spill_range = |
new (allocation_zone()) SpillRange(range, allocation_zone()); |
return spill_range; |
} |
@@ -1512,7 +1517,7 @@ InstructionOperand* ConstraintBuilder::AllocateFixed( |
InstructionOperand::ReplaceWith(operand, &allocated); |
if (is_tagged) { |
TRACE("Fixed reg is tagged at %d\n", pos); |
- auto instr = code()->InstructionAt(pos); |
+ Instruction* instr = code()->InstructionAt(pos); |
if (instr->HasReferenceMap()) { |
instr->reference_map()->RecordReference(*AllocatedOperand::cast(operand)); |
} |
@@ -1522,7 +1527,7 @@ InstructionOperand* ConstraintBuilder::AllocateFixed( |
void ConstraintBuilder::MeetRegisterConstraints() { |
- for (auto block : code()->instruction_blocks()) { |
+ for (InstructionBlock* block : code()->instruction_blocks()) { |
MeetRegisterConstraints(block); |
} |
} |
@@ -1544,13 +1549,13 @@ void ConstraintBuilder::MeetRegisterConstraints(const InstructionBlock* block) { |
void ConstraintBuilder::MeetRegisterConstraintsForLastInstructionInBlock( |
const InstructionBlock* block) { |
int end = block->last_instruction_index(); |
- auto last_instruction = code()->InstructionAt(end); |
+ Instruction* last_instruction = code()->InstructionAt(end); |
for (size_t i = 0; i < last_instruction->OutputCount(); i++) { |
- auto output_operand = last_instruction->OutputAt(i); |
+ InstructionOperand* output_operand = last_instruction->OutputAt(i); |
DCHECK(!output_operand->IsConstant()); |
- auto output = UnallocatedOperand::cast(output_operand); |
+ UnallocatedOperand* output = UnallocatedOperand::cast(output_operand); |
int output_vreg = output->virtual_register(); |
- auto range = data()->GetOrCreateLiveRangeFor(output_vreg); |
+ TopLevelLiveRange* range = data()->GetOrCreateLiveRangeFor(output_vreg); |
bool assigned = false; |
if (output->HasFixedPolicy()) { |
AllocateFixed(output, -1, false); |
@@ -1563,7 +1568,7 @@ void ConstraintBuilder::MeetRegisterConstraintsForLastInstructionInBlock( |
assigned = true; |
} |
- for (auto succ : block->successors()) { |
+ for (const RpoNumber& succ : block->successors()) { |
const InstructionBlock* successor = code()->InstructionBlockAt(succ); |
DCHECK(successor->PredecessorCount() == 1); |
int gap_index = successor->first_instruction_index(); |
@@ -1575,7 +1580,7 @@ void ConstraintBuilder::MeetRegisterConstraintsForLastInstructionInBlock( |
} |
if (!assigned) { |
- for (auto succ : block->successors()) { |
+ for (const RpoNumber& succ : block->successors()) { |
const InstructionBlock* successor = code()->InstructionBlockAt(succ); |
DCHECK(successor->PredecessorCount() == 1); |
int gap_index = successor->first_instruction_index(); |
@@ -1588,10 +1593,10 @@ void ConstraintBuilder::MeetRegisterConstraintsForLastInstructionInBlock( |
void ConstraintBuilder::MeetConstraintsAfter(int instr_index) { |
- auto first = code()->InstructionAt(instr_index); |
+ Instruction* first = code()->InstructionAt(instr_index); |
// Handle fixed temporaries. |
for (size_t i = 0; i < first->TempCount(); i++) { |
- auto temp = UnallocatedOperand::cast(first->TempAt(i)); |
+ UnallocatedOperand* temp = UnallocatedOperand::cast(first->TempAt(i)); |
if (temp->HasFixedPolicy()) AllocateFixed(temp, instr_index, false); |
} |
// Handle constant/fixed output operands. |
@@ -1599,13 +1604,13 @@ void ConstraintBuilder::MeetConstraintsAfter(int instr_index) { |
InstructionOperand* output = first->OutputAt(i); |
if (output->IsConstant()) { |
int output_vreg = ConstantOperand::cast(output)->virtual_register(); |
- auto range = data()->GetOrCreateLiveRangeFor(output_vreg); |
+ TopLevelLiveRange* range = data()->GetOrCreateLiveRangeFor(output_vreg); |
range->SetSpillStartIndex(instr_index + 1); |
range->SetSpillOperand(output); |
continue; |
} |
- auto first_output = UnallocatedOperand::cast(output); |
- auto range = |
+ UnallocatedOperand* first_output = UnallocatedOperand::cast(output); |
+ TopLevelLiveRange* range = |
data()->GetOrCreateLiveRangeFor(first_output->virtual_register()); |
bool assigned = false; |
if (first_output->HasFixedPolicy()) { |
@@ -1642,14 +1647,14 @@ void ConstraintBuilder::MeetConstraintsAfter(int instr_index) { |
void ConstraintBuilder::MeetConstraintsBefore(int instr_index) { |
- auto second = code()->InstructionAt(instr_index); |
+ Instruction* second = code()->InstructionAt(instr_index); |
// Handle fixed input operands of second instruction. |
for (size_t i = 0; i < second->InputCount(); i++) { |
- auto input = second->InputAt(i); |
+ InstructionOperand* input = second->InputAt(i); |
if (input->IsImmediate() || input->IsExplicit()) { |
continue; // Ignore immediates and explicitly reserved registers. |
} |
- auto cur_input = UnallocatedOperand::cast(input); |
+ UnallocatedOperand* cur_input = UnallocatedOperand::cast(input); |
if (cur_input->HasFixedPolicy()) { |
int input_vreg = cur_input->virtual_register(); |
UnallocatedOperand input_copy(UnallocatedOperand::ANY, input_vreg); |
@@ -1660,9 +1665,9 @@ void ConstraintBuilder::MeetConstraintsBefore(int instr_index) { |
} |
// Handle "output same as input" for second instruction. |
for (size_t i = 0; i < second->OutputCount(); i++) { |
- auto output = second->OutputAt(i); |
+ InstructionOperand* output = second->OutputAt(i); |
if (!output->IsUnallocated()) continue; |
- auto second_output = UnallocatedOperand::cast(output); |
+ UnallocatedOperand* second_output = UnallocatedOperand::cast(output); |
if (!second_output->HasSameAsInputPolicy()) continue; |
DCHECK(i == 0); // Only valid for first output. |
UnallocatedOperand* cur_input = |
@@ -1671,8 +1676,8 @@ void ConstraintBuilder::MeetConstraintsBefore(int instr_index) { |
int input_vreg = cur_input->virtual_register(); |
UnallocatedOperand input_copy(UnallocatedOperand::ANY, input_vreg); |
cur_input->set_virtual_register(second_output->virtual_register()); |
- auto gap_move = data()->AddGapMove(instr_index, Instruction::END, |
- input_copy, *cur_input); |
+ MoveOperands* gap_move = data()->AddGapMove(instr_index, Instruction::END, |
+ input_copy, *cur_input); |
if (code()->IsReference(input_vreg) && !code()->IsReference(output_vreg)) { |
if (second->HasReferenceMap()) { |
RegisterAllocationData::DelayedReference delayed_reference = { |
@@ -1701,23 +1706,24 @@ void ConstraintBuilder::ResolvePhis() { |
void ConstraintBuilder::ResolvePhis(const InstructionBlock* block) { |
- for (auto phi : block->phis()) { |
+ for (PhiInstruction* phi : block->phis()) { |
int phi_vreg = phi->virtual_register(); |
- auto map_value = data()->InitializePhiMap(block, phi); |
- auto& output = phi->output(); |
+ RegisterAllocationData::PhiMapValue* map_value = |
+ data()->InitializePhiMap(block, phi); |
+ InstructionOperand& output = phi->output(); |
// Map the destination operands, so the commitment phase can find them. |
for (size_t i = 0; i < phi->operands().size(); ++i) { |
InstructionBlock* cur_block = |
code()->InstructionBlockAt(block->predecessors()[i]); |
UnallocatedOperand input(UnallocatedOperand::ANY, phi->operands()[i]); |
- auto move = data()->AddGapMove(cur_block->last_instruction_index(), |
- Instruction::END, input, output); |
+ MoveOperands* move = data()->AddGapMove( |
+ cur_block->last_instruction_index(), Instruction::END, input, output); |
map_value->AddOperand(&move->destination()); |
DCHECK(!code() |
->InstructionAt(cur_block->last_instruction_index()) |
->HasReferenceMap()); |
} |
- auto live_range = data()->GetOrCreateLiveRangeFor(phi_vreg); |
+ TopLevelLiveRange* live_range = data()->GetOrCreateLiveRangeFor(phi_vreg); |
int gap_index = block->first_instruction_index(); |
live_range->RecordSpillLocation(allocation_zone(), gap_index, &output); |
live_range->SetSpillStartIndex(gap_index); |
@@ -1754,7 +1760,7 @@ BitVector* LiveRangeBuilder::ComputeLiveOut(const InstructionBlock* block, |
// All phi input operands corresponding to this successor edge are live |
// out from this block. |
- auto successor = code->InstructionBlockAt(succ); |
+ const InstructionBlock* successor = code->InstructionBlockAt(succ); |
size_t index = successor->PredecessorIndexOf(block->rpo_number()); |
DCHECK(index < successor->PredecessorCount()); |
for (PhiInstruction* phi : successor->phis()) { |
@@ -1771,14 +1777,15 @@ void LiveRangeBuilder::AddInitialIntervals(const InstructionBlock* block, |
BitVector* live_out) { |
// Add an interval that includes the entire block to the live range for |
// each live_out value. |
- auto start = LifetimePosition::GapFromInstructionIndex( |
+ LifetimePosition start = LifetimePosition::GapFromInstructionIndex( |
block->first_instruction_index()); |
- auto end = LifetimePosition::InstructionFromInstructionIndex( |
- block->last_instruction_index()).NextStart(); |
+ LifetimePosition end = LifetimePosition::InstructionFromInstructionIndex( |
+ block->last_instruction_index()) |
+ .NextStart(); |
BitVector::Iterator iterator(live_out); |
while (!iterator.Done()) { |
int operand_index = iterator.Current(); |
- auto range = data()->GetOrCreateLiveRangeFor(operand_index); |
+ TopLevelLiveRange* range = data()->GetOrCreateLiveRangeFor(operand_index); |
range->AddUseInterval(start, end, allocation_zone()); |
iterator.Advance(); |
} |
@@ -1792,7 +1799,7 @@ int LiveRangeBuilder::FixedDoubleLiveRangeID(int index) { |
TopLevelLiveRange* LiveRangeBuilder::FixedLiveRangeFor(int index) { |
DCHECK(index < config()->num_general_registers()); |
- auto result = data()->fixed_live_ranges()[index]; |
+ TopLevelLiveRange* result = data()->fixed_live_ranges()[index]; |
if (result == nullptr) { |
result = data()->NewLiveRange(FixedLiveRangeID(index), |
InstructionSequence::DefaultRepresentation()); |
@@ -1807,7 +1814,7 @@ TopLevelLiveRange* LiveRangeBuilder::FixedLiveRangeFor(int index) { |
TopLevelLiveRange* LiveRangeBuilder::FixedDoubleLiveRangeFor(int index) { |
DCHECK(index < config()->num_double_registers()); |
- auto result = data()->fixed_double_live_ranges()[index]; |
+ TopLevelLiveRange* result = data()->fixed_double_live_ranges()[index]; |
if (result == nullptr) { |
result = data()->NewLiveRange(FixedDoubleLiveRangeID(index), |
MachineRepresentation::kFloat64); |
@@ -1850,7 +1857,7 @@ UsePosition* LiveRangeBuilder::NewUsePosition(LifetimePosition pos, |
UsePosition* LiveRangeBuilder::Define(LifetimePosition position, |
InstructionOperand* operand, void* hint, |
UsePositionHintType hint_type) { |
- auto range = LiveRangeFor(operand); |
+ TopLevelLiveRange* range = LiveRangeFor(operand); |
if (range == nullptr) return nullptr; |
if (range->IsEmpty() || range->Start() > position) { |
@@ -1861,8 +1868,9 @@ UsePosition* LiveRangeBuilder::Define(LifetimePosition position, |
range->ShortenTo(position); |
} |
if (!operand->IsUnallocated()) return nullptr; |
- auto unalloc_operand = UnallocatedOperand::cast(operand); |
- auto use_pos = NewUsePosition(position, unalloc_operand, hint, hint_type); |
+ UnallocatedOperand* unalloc_operand = UnallocatedOperand::cast(operand); |
+ UsePosition* use_pos = |
+ NewUsePosition(position, unalloc_operand, hint, hint_type); |
range->AddUsePosition(use_pos); |
return use_pos; |
} |
@@ -1872,7 +1880,7 @@ UsePosition* LiveRangeBuilder::Use(LifetimePosition block_start, |
LifetimePosition position, |
InstructionOperand* operand, void* hint, |
UsePositionHintType hint_type) { |
- auto range = LiveRangeFor(operand); |
+ TopLevelLiveRange* range = LiveRangeFor(operand); |
if (range == nullptr) return nullptr; |
UsePosition* use_pos = nullptr; |
if (operand->IsUnallocated()) { |
@@ -1888,19 +1896,19 @@ UsePosition* LiveRangeBuilder::Use(LifetimePosition block_start, |
void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
BitVector* live) { |
int block_start = block->first_instruction_index(); |
- auto block_start_position = |
+ LifetimePosition block_start_position = |
LifetimePosition::GapFromInstructionIndex(block_start); |
for (int index = block->last_instruction_index(); index >= block_start; |
index--) { |
- auto curr_position = |
+ LifetimePosition curr_position = |
LifetimePosition::InstructionFromInstructionIndex(index); |
- auto instr = code()->InstructionAt(index); |
+ Instruction* instr = code()->InstructionAt(index); |
DCHECK(instr != nullptr); |
DCHECK(curr_position.IsInstructionPosition()); |
// Process output, inputs, and temps of this instruction. |
for (size_t i = 0; i < instr->OutputCount(); i++) { |
- auto output = instr->OutputAt(i); |
+ InstructionOperand* output = instr->OutputAt(i); |
if (output->IsUnallocated()) { |
// Unsupported. |
DCHECK(!UnallocatedOperand::cast(output)->HasSlotPolicy()); |
@@ -1925,7 +1933,7 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
for (int i = 0; i < config()->num_allocatable_general_registers(); ++i) { |
int code = config()->GetAllocatableGeneralCode(i); |
if (!IsOutputRegisterOf(instr, Register::from_code(code))) { |
- auto range = FixedLiveRangeFor(code); |
+ TopLevelLiveRange* range = FixedLiveRangeFor(code); |
range->AddUseInterval(curr_position, curr_position.End(), |
allocation_zone()); |
} |
@@ -1937,7 +1945,7 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
++i) { |
int code = config()->GetAllocatableDoubleCode(i); |
if (!IsOutputDoubleRegisterOf(instr, DoubleRegister::from_code(code))) { |
- auto range = FixedDoubleLiveRangeFor(code); |
+ TopLevelLiveRange* range = FixedDoubleLiveRangeFor(code); |
range->AddUseInterval(curr_position, curr_position.End(), |
allocation_zone()); |
} |
@@ -1945,7 +1953,7 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
} |
for (size_t i = 0; i < instr->InputCount(); i++) { |
- auto input = instr->InputAt(i); |
+ InstructionOperand* input = instr->InputAt(i); |
if (input->IsImmediate() || input->IsExplicit()) { |
continue; // Ignore immediates and explicitly reserved registers. |
} |
@@ -1969,7 +1977,7 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
} |
for (size_t i = 0; i < instr->TempCount(); i++) { |
- auto temp = instr->TempAt(i); |
+ InstructionOperand* temp = instr->TempAt(i); |
// Unsupported. |
DCHECK_IMPLIES(temp->IsUnallocated(), |
!UnallocatedOperand::cast(temp)->HasSlotPolicy()); |
@@ -1991,24 +1999,25 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
Instruction::START}; |
curr_position = curr_position.PrevStart(); |
DCHECK(curr_position.IsGapPosition()); |
- for (auto position : kPositions) { |
- auto move = instr->GetParallelMove(position); |
+ for (const Instruction::GapPosition& position : kPositions) { |
+ ParallelMove* move = instr->GetParallelMove(position); |
if (move == nullptr) continue; |
if (position == Instruction::END) { |
curr_position = curr_position.End(); |
} else { |
curr_position = curr_position.Start(); |
} |
- for (auto cur : *move) { |
- auto& from = cur->source(); |
- auto& to = cur->destination(); |
+ for (MoveOperands* cur : *move) { |
+ InstructionOperand& from = cur->source(); |
+ InstructionOperand& to = cur->destination(); |
void* hint = &to; |
UsePositionHintType hint_type = UsePosition::HintTypeForOperand(to); |
UsePosition* to_use = nullptr; |
int phi_vreg = -1; |
if (to.IsUnallocated()) { |
int to_vreg = UnallocatedOperand::cast(to).virtual_register(); |
- auto to_range = data()->GetOrCreateLiveRangeFor(to_vreg); |
+ TopLevelLiveRange* to_range = |
+ data()->GetOrCreateLiveRangeFor(to_vreg); |
if (to_range->is_phi()) { |
phi_vreg = to_vreg; |
if (to_range->is_non_loop_phi()) { |
@@ -2032,7 +2041,7 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
} else { |
Define(curr_position, &to); |
} |
- auto from_use = |
+ UsePosition* from_use = |
Use(block_start_position, curr_position, &from, hint, hint_type); |
// Mark range live. |
if (from.IsUnallocated()) { |
@@ -2055,16 +2064,16 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, |
void LiveRangeBuilder::ProcessPhis(const InstructionBlock* block, |
BitVector* live) { |
- for (auto phi : block->phis()) { |
+ for (PhiInstruction* phi : block->phis()) { |
// The live range interval already ends at the first instruction of the |
// block. |
int phi_vreg = phi->virtual_register(); |
live->Remove(phi_vreg); |
InstructionOperand* hint = nullptr; |
- auto instr = GetLastInstruction( |
+ Instruction* instr = GetLastInstruction( |
code(), code()->InstructionBlockAt(block->predecessors()[0])); |
- for (auto move : *instr->GetParallelMove(Instruction::END)) { |
- auto& to = move->destination(); |
+ for (MoveOperands* move : *instr->GetParallelMove(Instruction::END)) { |
+ InstructionOperand& to = move->destination(); |
if (to.IsUnallocated() && |
UnallocatedOperand::cast(to).virtual_register() == phi_vreg) { |
hint = &move->source(); |
@@ -2072,10 +2081,10 @@ void LiveRangeBuilder::ProcessPhis(const InstructionBlock* block, |
} |
} |
DCHECK(hint != nullptr); |
- auto block_start = LifetimePosition::GapFromInstructionIndex( |
+ LifetimePosition block_start = LifetimePosition::GapFromInstructionIndex( |
block->first_instruction_index()); |
- auto use_pos = Define(block_start, &phi->output(), hint, |
- UsePosition::HintTypeForOperand(*hint)); |
+ UsePosition* use_pos = Define(block_start, &phi->output(), hint, |
+ UsePosition::HintTypeForOperand(*hint)); |
MapPhiHint(hint, use_pos); |
} |
} |
@@ -2087,10 +2096,11 @@ void LiveRangeBuilder::ProcessLoopHeader(const InstructionBlock* block, |
// Add a live range stretching from the first loop instruction to the last |
// for each value live on entry to the header. |
BitVector::Iterator iterator(live); |
- auto start = LifetimePosition::GapFromInstructionIndex( |
+ LifetimePosition start = LifetimePosition::GapFromInstructionIndex( |
block->first_instruction_index()); |
- auto end = LifetimePosition::GapFromInstructionIndex( |
- code()->LastLoopInstructionIndex(block)).NextFullStart(); |
+ LifetimePosition end = LifetimePosition::GapFromInstructionIndex( |
+ code()->LastLoopInstructionIndex(block)) |
+ .NextFullStart(); |
while (!iterator.Done()) { |
int operand_index = iterator.Current(); |
TopLevelLiveRange* range = data()->GetOrCreateLiveRangeFor(operand_index); |
@@ -2109,8 +2119,9 @@ void LiveRangeBuilder::BuildLiveRanges() { |
// Process the blocks in reverse order. |
for (int block_id = code()->InstructionBlockCount() - 1; block_id >= 0; |
--block_id) { |
- auto block = code()->InstructionBlockAt(RpoNumber::FromInt(block_id)); |
- auto live = ComputeLiveOut(block, data()); |
+ InstructionBlock* block = |
+ code()->InstructionBlockAt(RpoNumber::FromInt(block_id)); |
+ BitVector* live = ComputeLiveOut(block, data()); |
// Initially consider all live_out values live for the entire block. We |
// will shorten these intervals if necessary. |
AddInitialIntervals(block, live); |
@@ -2125,7 +2136,7 @@ void LiveRangeBuilder::BuildLiveRanges() { |
live_in_sets()[block_id] = live; |
} |
// Postprocess the ranges. |
- for (auto range : data()->live_ranges()) { |
+ for (TopLevelLiveRange* range : data()->live_ranges()) { |
if (range == nullptr) continue; |
// Give slots to all ranges with a non fixed slot use. |
if (range->has_slot_use() && range->HasNoSpillType()) { |
@@ -2136,7 +2147,8 @@ void LiveRangeBuilder::BuildLiveRanges() { |
// Without this hack, all uses with "any" policy would get the constant |
// operand assigned. |
if (range->HasSpillOperand() && range->GetSpillOperand()->IsConstant()) { |
- for (auto pos = range->first_pos(); pos != nullptr; pos = pos->next()) { |
+ for (UsePosition* pos = range->first_pos(); pos != nullptr; |
+ pos = pos->next()) { |
if (pos->type() == UsePositionType::kRequiresSlot) continue; |
UsePositionType new_type = UsePositionType::kAny; |
// Can't mark phis as needing a register. |
@@ -2279,7 +2291,7 @@ LiveRange* RegisterAllocator::SplitBetween(LiveRange* range, |
range->TopLevel()->vreg(), range->relative_id(), start.value(), |
end.value()); |
- auto split_pos = FindOptimalSplitPos(start, end); |
+ LifetimePosition split_pos = FindOptimalSplitPos(start, end); |
DCHECK(split_pos >= start); |
return SplitRangeAt(range, split_pos); |
} |
@@ -2294,8 +2306,8 @@ LifetimePosition RegisterAllocator::FindOptimalSplitPos(LifetimePosition start, |
// We have no choice |
if (start_instr == end_instr) return end; |
- auto start_block = GetInstructionBlock(code(), start); |
- auto end_block = GetInstructionBlock(code(), end); |
+ const InstructionBlock* start_block = GetInstructionBlock(code(), start); |
+ const InstructionBlock* end_block = GetInstructionBlock(code(), end); |
if (end_block == start_block) { |
// The interval is split in the same basic block. Split at the latest |
@@ -2303,7 +2315,7 @@ LifetimePosition RegisterAllocator::FindOptimalSplitPos(LifetimePosition start, |
return end; |
} |
- auto block = end_block; |
+ const InstructionBlock* block = end_block; |
// Find header of outermost loop. |
// TODO(titzer): fix redundancy below. |
while (GetContainingLoop(code(), block) != nullptr && |
@@ -2323,19 +2335,20 @@ LifetimePosition RegisterAllocator::FindOptimalSplitPos(LifetimePosition start, |
LifetimePosition RegisterAllocator::FindOptimalSpillingPos( |
LiveRange* range, LifetimePosition pos) { |
- auto block = GetInstructionBlock(code(), pos.Start()); |
- auto loop_header = |
+ const InstructionBlock* block = GetInstructionBlock(code(), pos.Start()); |
+ const InstructionBlock* loop_header = |
block->IsLoopHeader() ? block : GetContainingLoop(code(), block); |
if (loop_header == nullptr) return pos; |
- auto prev_use = range->PreviousUsePositionRegisterIsBeneficial(pos); |
+ const UsePosition* prev_use = |
+ range->PreviousUsePositionRegisterIsBeneficial(pos); |
while (loop_header != nullptr) { |
// We are going to spill live range inside the loop. |
// If possible try to move spilling position backwards to loop header. |
// This will reduce number of memory moves on the back edge. |
- auto loop_start = LifetimePosition::GapFromInstructionIndex( |
+ LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex( |
loop_header->first_instruction_index()); |
if (range->Covers(loop_start)) { |
@@ -2419,7 +2432,7 @@ void LinearScanAllocator::AllocateRegisters() { |
DCHECK(UnhandledIsSorted()); |
auto& fixed_ranges = GetFixedRegisters(); |
- for (auto current : fixed_ranges) { |
+ for (TopLevelLiveRange* current : fixed_ranges) { |
if (current != nullptr) { |
DCHECK_EQ(mode(), current->kind()); |
AddToInactive(current); |
@@ -2428,10 +2441,10 @@ void LinearScanAllocator::AllocateRegisters() { |
while (!unhandled_live_ranges().empty()) { |
DCHECK(UnhandledIsSorted()); |
- auto current = unhandled_live_ranges().back(); |
+ LiveRange* current = unhandled_live_ranges().back(); |
unhandled_live_ranges().pop_back(); |
DCHECK(UnhandledIsSorted()); |
- auto position = current->Start(); |
+ LifetimePosition position = current->Start(); |
#ifdef DEBUG |
allocation_finger_ = position; |
#endif |
@@ -2442,7 +2455,7 @@ void LinearScanAllocator::AllocateRegisters() { |
continue; |
for (size_t i = 0; i < active_live_ranges().size(); ++i) { |
- auto cur_active = active_live_ranges()[i]; |
+ LiveRange* cur_active = active_live_ranges()[i]; |
if (cur_active->End() <= position) { |
ActiveToHandled(cur_active); |
--i; // The live range was removed from the list of active live ranges. |
@@ -2453,7 +2466,7 @@ void LinearScanAllocator::AllocateRegisters() { |
} |
for (size_t i = 0; i < inactive_live_ranges().size(); ++i) { |
- auto cur_inactive = inactive_live_ranges()[i]; |
+ LiveRange* cur_inactive = inactive_live_ranges()[i]; |
if (cur_inactive->End() <= position) { |
InactiveToHandled(cur_inactive); |
--i; // Live range was removed from the list of inactive live ranges. |
@@ -2505,7 +2518,7 @@ void LinearScanAllocator::AddToUnhandledSorted(LiveRange* range) { |
DCHECK(allocation_finger_ <= range->Start()); |
for (int i = static_cast<int>(unhandled_live_ranges().size() - 1); i >= 0; |
--i) { |
- auto cur_range = unhandled_live_ranges().at(i); |
+ LiveRange* cur_range = unhandled_live_ranges().at(i); |
if (!range->ShouldBeAllocatedBefore(cur_range)) continue; |
TRACE("Add live range %d:%d to unhandled at %d\n", |
range->TopLevel()->vreg(), range->relative_id(), i + 1); |
@@ -2551,8 +2564,8 @@ void LinearScanAllocator::SortUnhandled() { |
bool LinearScanAllocator::UnhandledIsSorted() { |
size_t len = unhandled_live_ranges().size(); |
for (size_t i = 1; i < len; i++) { |
- auto a = unhandled_live_ranges().at(i - 1); |
- auto b = unhandled_live_ranges().at(i); |
+ LiveRange* a = unhandled_live_ranges().at(i - 1); |
+ LiveRange* b = unhandled_live_ranges().at(i); |
if (a->Start() < b->Start()) return false; |
} |
return true; |
@@ -2596,7 +2609,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
free_until_pos[i] = LifetimePosition::MaxPosition(); |
} |
- for (auto cur_active : active_live_ranges()) { |
+ for (LiveRange* cur_active : active_live_ranges()) { |
free_until_pos[cur_active->assigned_register()] = |
LifetimePosition::GapFromInstructionIndex(0); |
TRACE("Register %s is free until pos %d (1)\n", |
@@ -2604,9 +2617,10 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
LifetimePosition::GapFromInstructionIndex(0).value()); |
} |
- for (auto cur_inactive : inactive_live_ranges()) { |
+ for (LiveRange* cur_inactive : inactive_live_ranges()) { |
DCHECK(cur_inactive->End() > current->Start()); |
- auto next_intersection = cur_inactive->FirstIntersection(current); |
+ LifetimePosition next_intersection = |
+ cur_inactive->FirstIntersection(current); |
if (!next_intersection.IsValid()) continue; |
int cur_reg = cur_inactive->assigned_register(); |
free_until_pos[cur_reg] = Min(free_until_pos[cur_reg], next_intersection); |
@@ -2641,7 +2655,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
} |
} |
- auto pos = free_until_pos[reg]; |
+ LifetimePosition pos = free_until_pos[reg]; |
if (pos <= current->Start()) { |
// All registers are blocked. |
@@ -2651,7 +2665,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
if (pos < current->End()) { |
// Register reg is available at the range start but becomes blocked before |
// the range end. Split current at position where it becomes blocked. |
- auto tail = SplitRangeAt(current, pos); |
+ LiveRange* tail = SplitRangeAt(current, pos); |
AddToUnhandledSorted(tail); |
} |
@@ -2667,7 +2681,7 @@ bool LinearScanAllocator::TryAllocateFreeReg(LiveRange* current) { |
void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
- auto register_use = current->NextRegisterPosition(current->Start()); |
+ UsePosition* register_use = current->NextRegisterPosition(current->Start()); |
if (register_use == nullptr) { |
// There is no use in the current live range that requires a register. |
// We can just spill it. |
@@ -2682,14 +2696,14 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
use_pos[i] = block_pos[i] = LifetimePosition::MaxPosition(); |
} |
- for (auto range : active_live_ranges()) { |
+ for (LiveRange* range : active_live_ranges()) { |
int cur_reg = range->assigned_register(); |
if (range->TopLevel()->IsFixed() || |
!range->CanBeSpilled(current->Start())) { |
block_pos[cur_reg] = use_pos[cur_reg] = |
LifetimePosition::GapFromInstructionIndex(0); |
} else { |
- auto next_use = |
+ UsePosition* next_use = |
range->NextUsePositionRegisterIsBeneficial(current->Start()); |
if (next_use == nullptr) { |
use_pos[cur_reg] = range->End(); |
@@ -2699,9 +2713,9 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
} |
} |
- for (auto range : inactive_live_ranges()) { |
+ for (LiveRange* range : inactive_live_ranges()) { |
DCHECK(range->End() > current->Start()); |
- auto next_intersection = range->FirstIntersection(current); |
+ LifetimePosition next_intersection = range->FirstIntersection(current); |
if (!next_intersection.IsValid()) continue; |
int cur_reg = range->assigned_register(); |
if (range->TopLevel()->IsFixed()) { |
@@ -2720,7 +2734,7 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
} |
} |
- auto pos = use_pos[reg]; |
+ LifetimePosition pos = use_pos[reg]; |
if (pos < register_use->pos()) { |
// All registers are blocked before the first use that requires a register. |
@@ -2753,12 +2767,12 @@ void LinearScanAllocator::AllocateBlockedReg(LiveRange* current) { |
void LinearScanAllocator::SplitAndSpillIntersecting(LiveRange* current) { |
DCHECK(current->HasRegisterAssigned()); |
int reg = current->assigned_register(); |
- auto split_pos = current->Start(); |
+ LifetimePosition split_pos = current->Start(); |
for (size_t i = 0; i < active_live_ranges().size(); ++i) { |
- auto range = active_live_ranges()[i]; |
+ LiveRange* range = active_live_ranges()[i]; |
if (range->assigned_register() == reg) { |
- auto next_pos = range->NextRegisterPosition(current->Start()); |
- auto spill_pos = FindOptimalSpillingPos(range, split_pos); |
+ UsePosition* next_pos = range->NextRegisterPosition(current->Start()); |
+ LifetimePosition spill_pos = FindOptimalSpillingPos(range, split_pos); |
if (next_pos == nullptr) { |
SpillAfter(range, spill_pos); |
} else { |
@@ -2778,7 +2792,7 @@ void LinearScanAllocator::SplitAndSpillIntersecting(LiveRange* current) { |
} |
for (size_t i = 0; i < inactive_live_ranges().size(); ++i) { |
- auto range = inactive_live_ranges()[i]; |
+ LiveRange* range = inactive_live_ranges()[i]; |
DCHECK(range->End() > current->Start()); |
if (range->assigned_register() == reg && !range->TopLevel()->IsFixed()) { |
LifetimePosition next_intersection = range->FirstIntersection(current); |
@@ -2802,9 +2816,10 @@ bool LinearScanAllocator::TryReuseSpillForPhi(TopLevelLiveRange* range) { |
if (!range->is_phi()) return false; |
DCHECK(!range->HasSpillOperand()); |
- auto phi_map_value = data()->GetPhiMapValueFor(range); |
- auto phi = phi_map_value->phi(); |
- auto block = phi_map_value->block(); |
+ RegisterAllocationData::PhiMapValue* phi_map_value = |
+ data()->GetPhiMapValueFor(range); |
+ const PhiInstruction* phi = phi_map_value->phi(); |
+ const InstructionBlock* block = phi_map_value->block(); |
// Count the number of spilled operands. |
size_t spilled_count = 0; |
LiveRange* first_op = nullptr; |
@@ -2812,9 +2827,11 @@ bool LinearScanAllocator::TryReuseSpillForPhi(TopLevelLiveRange* range) { |
int op = phi->operands()[i]; |
LiveRange* op_range = data()->GetOrCreateLiveRangeFor(op); |
if (!op_range->TopLevel()->HasSpillRange()) continue; |
- auto pred = code()->InstructionBlockAt(block->predecessors()[i]); |
- auto pred_end = LifetimePosition::InstructionFromInstructionIndex( |
- pred->last_instruction_index()); |
+ const InstructionBlock* pred = |
+ code()->InstructionBlockAt(block->predecessors()[i]); |
+ LifetimePosition pred_end = |
+ LifetimePosition::InstructionFromInstructionIndex( |
+ pred->last_instruction_index()); |
while (op_range != nullptr && !op_range->CanCover(pred_end)) { |
op_range = op_range->next(); |
} |
@@ -2834,13 +2851,13 @@ bool LinearScanAllocator::TryReuseSpillForPhi(TopLevelLiveRange* range) { |
// Try to merge the spilled operands and count the number of merged spilled |
// operands. |
DCHECK(first_op != nullptr); |
- auto first_op_spill = first_op->TopLevel()->GetSpillRange(); |
+ SpillRange* first_op_spill = first_op->TopLevel()->GetSpillRange(); |
size_t num_merged = 1; |
for (size_t i = 1; i < phi->operands().size(); i++) { |
int op = phi->operands()[i]; |
- auto op_range = data()->GetOrCreateLiveRangeFor(op); |
+ TopLevelLiveRange* op_range = data()->live_ranges()[op]; |
if (!op_range->HasSpillRange()) continue; |
- auto op_spill = op_range->GetSpillRange(); |
+ SpillRange* op_spill = op_range->GetSpillRange(); |
if (op_spill == first_op_spill || first_op_spill->TryMerge(op_spill)) { |
num_merged++; |
} |
@@ -2856,11 +2873,11 @@ bool LinearScanAllocator::TryReuseSpillForPhi(TopLevelLiveRange* range) { |
// If the range does not need register soon, spill it to the merged |
// spill range. |
- auto next_pos = range->Start(); |
+ LifetimePosition next_pos = range->Start(); |
if (next_pos.IsGapPosition()) next_pos = next_pos.NextStart(); |
- auto pos = range->NextUsePositionRegisterIsBeneficial(next_pos); |
+ UsePosition* pos = range->NextUsePositionRegisterIsBeneficial(next_pos); |
if (pos == nullptr) { |
- auto spill_range = |
+ SpillRange* spill_range = |
range->TopLevel()->HasSpillRange() |
? range->TopLevel()->GetSpillRange() |
: data()->AssignSpillRangeToLiveRange(range->TopLevel()); |
@@ -2869,7 +2886,7 @@ bool LinearScanAllocator::TryReuseSpillForPhi(TopLevelLiveRange* range) { |
Spill(range); |
return true; |
} else if (pos->pos() > range->Start().NextStart()) { |
- auto spill_range = |
+ SpillRange* spill_range = |
range->TopLevel()->HasSpillRange() |
? range->TopLevel()->GetSpillRange() |
: data()->AssignSpillRangeToLiveRange(range->TopLevel()); |
@@ -2884,7 +2901,7 @@ bool LinearScanAllocator::TryReuseSpillForPhi(TopLevelLiveRange* range) { |
void LinearScanAllocator::SpillAfter(LiveRange* range, LifetimePosition pos) { |
- auto second_part = SplitRangeAt(range, pos); |
+ LiveRange* second_part = SplitRangeAt(range, pos); |
Spill(second_part); |
} |
@@ -2900,17 +2917,17 @@ void LinearScanAllocator::SpillBetweenUntil(LiveRange* range, |
LifetimePosition until, |
LifetimePosition end) { |
CHECK(start < end); |
- auto second_part = SplitRangeAt(range, start); |
+ LiveRange* second_part = SplitRangeAt(range, start); |
if (second_part->Start() < end) { |
// The split result intersects with [start, end[. |
// Split it at position between ]start+1, end[, spill the middle part |
// and put the rest to unhandled. |
- auto third_part_end = end.PrevStart().End(); |
+ LifetimePosition third_part_end = end.PrevStart().End(); |
if (data()->IsBlockBoundary(end.Start())) { |
third_part_end = end.Start(); |
} |
- auto third_part = SplitBetween( |
+ LiveRange* third_part = SplitBetween( |
second_part, Max(second_part->Start().End(), until), third_part_end); |
DCHECK(third_part != second_part); |
@@ -2930,7 +2947,7 @@ SpillSlotLocator::SpillSlotLocator(RegisterAllocationData* data) |
void SpillSlotLocator::LocateSpillSlots() { |
- auto code = data()->code(); |
+ const InstructionSequence* code = data()->code(); |
for (TopLevelLiveRange* range : data()->live_ranges()) { |
if (range == nullptr || range->IsEmpty()) continue; |
// We care only about ranges which spill in the frame. |
@@ -2943,7 +2960,8 @@ void SpillSlotLocator::LocateSpillSlots() { |
} |
} |
} else { |
- auto spills = range->spill_move_insertion_locations(); |
+ TopLevelLiveRange::SpillMoveInsertionList* spills = |
+ range->spill_move_insertion_locations(); |
DCHECK_NOT_NULL(spills); |
for (; spills != nullptr; spills = spills->next) { |
code->GetInstructionBlock(spills->gap_index)->mark_needs_frame(); |
@@ -2998,7 +3016,7 @@ void OperandAssigner::CommitAssignment() { |
} |
for (LiveRange* range = top_range; range != nullptr; |
range = range->next()) { |
- auto assigned = range->GetAssignedOperand(); |
+ InstructionOperand assigned = range->GetAssignedOperand(); |
range->ConvertUsesToOperand(assigned, spill_operand); |
} |
@@ -3033,7 +3051,7 @@ ReferenceMapPopulator::ReferenceMapPopulator(RegisterAllocationData* data) |
bool ReferenceMapPopulator::SafePointsAreInOrder() const { |
int safe_point = 0; |
- for (auto map : *data()->code()->reference_maps()) { |
+ for (ReferenceMap* map : *data()->code()->reference_maps()) { |
if (safe_point > map->instruction_position()) return false; |
safe_point = map->instruction_position(); |
} |
@@ -3044,14 +3062,15 @@ bool ReferenceMapPopulator::SafePointsAreInOrder() const { |
void ReferenceMapPopulator::PopulateReferenceMaps() { |
DCHECK(SafePointsAreInOrder()); |
// Map all delayed references. |
- for (auto& delayed_reference : data()->delayed_references()) { |
+ for (RegisterAllocationData::DelayedReference& delayed_reference : |
+ data()->delayed_references()) { |
delayed_reference.map->RecordReference( |
AllocatedOperand::cast(*delayed_reference.operand)); |
} |
// Iterate over all safe point positions and record a pointer |
// for all spilled live ranges at this point. |
int last_range_start = 0; |
- auto reference_maps = data()->code()->reference_maps(); |
+ const ReferenceMapDeque* reference_maps = data()->code()->reference_maps(); |
ReferenceMapDeque::const_iterator first_it = reference_maps->begin(); |
for (TopLevelLiveRange* range : data()->live_ranges()) { |
if (range == nullptr) continue; |
@@ -3065,7 +3084,7 @@ void ReferenceMapPopulator::PopulateReferenceMaps() { |
int start = range->Start().ToInstructionIndex(); |
int end = 0; |
for (LiveRange* cur = range; cur != nullptr; cur = cur->next()) { |
- auto this_end = cur->End(); |
+ LifetimePosition this_end = cur->End(); |
if (this_end.ToInstructionIndex() > end) |
end = this_end.ToInstructionIndex(); |
DCHECK(cur->Start().ToInstructionIndex() >= start); |
@@ -3079,7 +3098,7 @@ void ReferenceMapPopulator::PopulateReferenceMaps() { |
// Step across all the safe points that are before the start of this range, |
// recording how far we step in order to save doing this for the next range. |
for (; first_it != reference_maps->end(); ++first_it) { |
- auto map = *first_it; |
+ ReferenceMap* map = *first_it; |
if (map->instruction_position() >= start) break; |
} |
@@ -3100,7 +3119,7 @@ void ReferenceMapPopulator::PopulateReferenceMaps() { |
LiveRange* cur = range; |
// Step through the safe points to see whether they are in the range. |
for (auto it = first_it; it != reference_maps->end(); ++it) { |
- auto map = *it; |
+ ReferenceMap* map = *it; |
int safe_point = map->instruction_position(); |
// The safe points are sorted so we can stop searching here. |
@@ -3108,7 +3127,7 @@ void ReferenceMapPopulator::PopulateReferenceMaps() { |
// Advance to the next active range that covers the current |
// safe point position. |
- auto safe_point_pos = |
+ LifetimePosition safe_point_pos = |
LifetimePosition::InstructionFromInstructionIndex(safe_point); |
// Search for the child range (cur) that covers safe_point_pos. If we |
@@ -3154,7 +3173,7 @@ void ReferenceMapPopulator::PopulateReferenceMaps() { |
"at safe point %d\n", |
range->vreg(), cur->relative_id(), cur->Start().value(), |
safe_point); |
- auto operand = cur->GetAssignedOperand(); |
+ InstructionOperand operand = cur->GetAssignedOperand(); |
DCHECK(!operand.IsStackSlot()); |
DCHECK_EQ(MachineRepresentation::kTagged, |
AllocatedOperand::cast(operand).representation()); |
@@ -3220,7 +3239,7 @@ class LiveRangeBoundArray { |
while (true) { |
size_t current_index = left_index + (right_index - left_index) / 2; |
DCHECK(right_index > current_index); |
- auto bound = &start_[current_index]; |
+ LiveRangeBound* bound = &start_[current_index]; |
if (bound->start_ <= position) { |
if (position < bound->end_) return bound; |
DCHECK(left_index < current_index); |
@@ -3232,13 +3251,14 @@ class LiveRangeBoundArray { |
} |
LiveRangeBound* FindPred(const InstructionBlock* pred) { |
- auto pred_end = LifetimePosition::InstructionFromInstructionIndex( |
- pred->last_instruction_index()); |
+ LifetimePosition pred_end = |
+ LifetimePosition::InstructionFromInstructionIndex( |
+ pred->last_instruction_index()); |
return Find(pred_end); |
} |
LiveRangeBound* FindSucc(const InstructionBlock* succ) { |
- auto succ_start = LifetimePosition::GapFromInstructionIndex( |
+ LifetimePosition succ_start = LifetimePosition::GapFromInstructionIndex( |
succ->first_instruction_index()); |
return Find(succ_start); |
} |
@@ -3290,9 +3310,9 @@ class LiveRangeFinder { |
LiveRangeBoundArray* ArrayFor(int operand_index) { |
DCHECK(operand_index < bounds_length_); |
- auto range = data_->live_ranges()[operand_index]; |
+ TopLevelLiveRange* range = data_->live_ranges()[operand_index]; |
DCHECK(range != nullptr && !range->IsEmpty()); |
- auto array = &bounds_[operand_index]; |
+ LiveRangeBoundArray* array = &bounds_[operand_index]; |
if (array->ShouldInitialize()) { |
array->Initialize(zone_, range); |
} |
@@ -3343,21 +3363,21 @@ bool LiveRangeConnector::CanEagerlyResolveControlFlow( |
void LiveRangeConnector::ResolveControlFlow(Zone* local_zone) { |
// Lazily linearize live ranges in memory for fast lookup. |
LiveRangeFinder finder(data(), local_zone); |
- auto& live_in_sets = data()->live_in_sets(); |
- for (auto block : code()->instruction_blocks()) { |
+ ZoneVector<BitVector*>& live_in_sets = data()->live_in_sets(); |
+ for (const InstructionBlock* block : code()->instruction_blocks()) { |
if (CanEagerlyResolveControlFlow(block)) continue; |
- auto live = live_in_sets[block->rpo_number().ToInt()]; |
+ BitVector* live = live_in_sets[block->rpo_number().ToInt()]; |
BitVector::Iterator iterator(live); |
while (!iterator.Done()) { |
- auto* array = finder.ArrayFor(iterator.Current()); |
- for (auto pred : block->predecessors()) { |
+ LiveRangeBoundArray* array = finder.ArrayFor(iterator.Current()); |
+ for (const RpoNumber& pred : block->predecessors()) { |
FindResult result; |
- const auto* pred_block = code()->InstructionBlockAt(pred); |
+ const InstructionBlock* pred_block = code()->InstructionBlockAt(pred); |
if (!array->FindConnectableSubranges(block, pred_block, &result)) { |
continue; |
} |
- auto pred_op = result.pred_cover_->GetAssignedOperand(); |
- auto cur_op = result.cur_cover_->GetAssignedOperand(); |
+ InstructionOperand pred_op = result.pred_cover_->GetAssignedOperand(); |
+ InstructionOperand cur_op = result.cur_cover_->GetAssignedOperand(); |
if (pred_op.Equals(cur_op)) continue; |
ResolveControlFlow(block, cur_op, pred_block, pred_op); |
} |
@@ -3397,7 +3417,7 @@ void LiveRangeConnector::ConnectRanges(Zone* local_zone) { |
LiveRange* first_range = top_range; |
for (LiveRange *second_range = first_range->next(); second_range != nullptr; |
first_range = second_range, second_range = second_range->next()) { |
- auto pos = second_range->Start(); |
+ LifetimePosition pos = second_range->Start(); |
// Add gap move if the two live ranges touch and there is no block |
// boundary. |
if (!connect_spilled && second_range->spilled()) continue; |
@@ -3406,8 +3426,8 @@ void LiveRangeConnector::ConnectRanges(Zone* local_zone) { |
!CanEagerlyResolveControlFlow(GetInstructionBlock(code(), pos))) { |
continue; |
} |
- auto prev_operand = first_range->GetAssignedOperand(); |
- auto cur_operand = second_range->GetAssignedOperand(); |
+ InstructionOperand prev_operand = first_range->GetAssignedOperand(); |
+ InstructionOperand cur_operand = second_range->GetAssignedOperand(); |
if (prev_operand.Equals(cur_operand)) continue; |
bool delay_insertion = false; |
Instruction::GapPosition gap_pos; |
@@ -3422,8 +3442,9 @@ void LiveRangeConnector::ConnectRanges(Zone* local_zone) { |
} |
gap_pos = delay_insertion ? Instruction::END : Instruction::START; |
} |
- auto move = code()->InstructionAt(gap_index)->GetOrCreateParallelMove( |
- gap_pos, code_zone()); |
+ ParallelMove* move = |
+ code()->InstructionAt(gap_index)->GetOrCreateParallelMove( |
+ gap_pos, code_zone()); |
if (!delay_insertion) { |
move->AddMove(prev_operand, cur_operand); |
} else { |
@@ -3438,15 +3459,15 @@ void LiveRangeConnector::ConnectRanges(Zone* local_zone) { |
ZoneVector<MoveOperands*> to_eliminate(local_zone); |
to_insert.reserve(4); |
to_eliminate.reserve(4); |
- auto moves = delayed_insertion_map.begin()->first.first; |
+ ParallelMove* moves = delayed_insertion_map.begin()->first.first; |
for (auto it = delayed_insertion_map.begin();; ++it) { |
bool done = it == delayed_insertion_map.end(); |
if (done || it->first.first != moves) { |
// Commit the MoveOperands for current ParallelMove. |
- for (auto move : to_eliminate) { |
+ for (MoveOperands* move : to_eliminate) { |
move->Eliminate(); |
} |
- for (auto move : to_insert) { |
+ for (MoveOperands* move : to_insert) { |
moves->push_back(move); |
} |
if (done) break; |
@@ -3456,8 +3477,9 @@ void LiveRangeConnector::ConnectRanges(Zone* local_zone) { |
moves = it->first.first; |
} |
// Gather all MoveOperands for a single ParallelMove. |
- auto move = new (code_zone()) MoveOperands(it->first.second, it->second); |
- auto eliminate = moves->PrepareInsertAfter(move); |
+ MoveOperands* move = |
+ new (code_zone()) MoveOperands(it->first.second, it->second); |
+ MoveOperands* eliminate = moves->PrepareInsertAfter(move); |
to_insert.push_back(move); |
if (eliminate != nullptr) to_eliminate.push_back(eliminate); |
} |