Index: src/compiler/register-allocator.cc |
diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc |
index e58082726291dfae133e7b8d5e011dfc6c4c5c46..2981636ea55e2765e7c36e95cab936f852ca448a 100644 |
--- a/src/compiler/register-allocator.cc |
+++ b/src/compiler/register-allocator.cc |
@@ -137,12 +137,11 @@ LiveRange::LiveRange(int id, Zone* zone) |
spills_at_definition_(nullptr) {} |
-void LiveRange::set_assigned_register(int reg, |
- InstructionOperandCache* operand_cache) { |
+void LiveRange::set_assigned_register(int reg) { |
DCHECK(!HasRegisterAssigned() && !IsSpilled()); |
assigned_register_ = reg; |
// TODO(dcarney): stop aliasing hint operands. |
- ConvertUsesToOperand(GetAssignedOperand(operand_cache), nullptr); |
+ ConvertUsesToOperand(GetAssignedOperand(), nullptr); |
} |
@@ -268,27 +267,6 @@ bool LiveRange::CanBeSpilled(LifetimePosition pos) { |
} |
-InstructionOperand* LiveRange::GetAssignedOperand( |
- InstructionOperandCache* cache) const { |
- if (HasRegisterAssigned()) { |
- DCHECK(!IsSpilled()); |
- switch (Kind()) { |
- case GENERAL_REGISTERS: |
- return cache->GetRegisterOperand(assigned_register()); |
- case DOUBLE_REGISTERS: |
- return cache->GetDoubleRegisterOperand(assigned_register()); |
- default: |
- UNREACHABLE(); |
- } |
- } |
- DCHECK(IsSpilled()); |
- DCHECK(!HasRegisterAssigned()); |
- auto op = TopLevel()->GetSpillOperand(); |
- DCHECK(!op->IsUnallocated()); |
- return op; |
-} |
- |
- |
InstructionOperand LiveRange::GetAssignedOperand() const { |
if (HasRegisterAssigned()) { |
DCHECK(!IsSpilled()); |
@@ -526,7 +504,7 @@ void LiveRange::AddUsePosition(LifetimePosition pos, |
} |
-void LiveRange::ConvertUsesToOperand(InstructionOperand* op, |
+void LiveRange::ConvertUsesToOperand(const InstructionOperand& op, |
InstructionOperand* spill_op) { |
for (auto pos = first_pos(); pos != nullptr; pos = pos->next()) { |
DCHECK(Start().Value() <= pos->pos().Value() && |
@@ -541,10 +519,10 @@ void LiveRange::ConvertUsesToOperand(InstructionOperand* op, |
} |
break; |
case UsePositionType::kRequiresRegister: |
- DCHECK(op->IsRegister() || op->IsDoubleRegister()); |
+ DCHECK(op.IsRegister() || op.IsDoubleRegister()); |
// Fall through. |
case UsePositionType::kAny: |
- InstructionOperand::ReplaceWith(pos->operand(), op); |
+ InstructionOperand::ReplaceWith(pos->operand(), &op); |
break; |
} |
} |
@@ -597,16 +575,6 @@ LifetimePosition LiveRange::FirstIntersection(LiveRange* other) { |
} |
-InstructionOperandCache::InstructionOperandCache() { |
- for (size_t i = 0; i < arraysize(general_register_operands_); ++i) { |
- general_register_operands_[i] = RegisterOperand(static_cast<int>(i)); |
- } |
- for (size_t i = 0; i < arraysize(double_register_operands_); ++i) { |
- double_register_operands_[i] = DoubleRegisterOperand(static_cast<int>(i)); |
- } |
-} |
- |
- |
RegisterAllocator::RegisterAllocator(const RegisterConfiguration* config, |
Zone* zone, Frame* frame, |
InstructionSequence* code, |
@@ -616,7 +584,6 @@ RegisterAllocator::RegisterAllocator(const RegisterConfiguration* config, |
code_(code), |
debug_name_(debug_name), |
config_(config), |
- operand_cache_(new (code_zone()) InstructionOperandCache()), |
phi_map_(local_zone()), |
live_in_sets_(code->InstructionBlockCount(), nullptr, local_zone()), |
live_ranges_(code->VirtualRegisterCount() * 2, nullptr, local_zone()), |
@@ -987,11 +954,11 @@ void RegisterAllocator::AssignSpillSlots() { |
void RegisterAllocator::CommitAssignment() { |
for (auto range : live_ranges()) { |
if (range == nullptr || range->IsEmpty()) continue; |
- auto assigned = range->GetAssignedOperand(operand_cache()); |
InstructionOperand* spill_operand = nullptr; |
if (!range->TopLevel()->HasNoSpillType()) { |
spill_operand = range->TopLevel()->GetSpillOperand(); |
} |
+ auto assigned = range->GetAssignedOperand(); |
range->ConvertUsesToOperand(assigned, spill_operand); |
if (!range->IsChild() && spill_operand != nullptr) { |
range->CommitSpillsAtDefinition(code(), spill_operand, |
@@ -1463,9 +1430,9 @@ void RegisterAllocator::ConnectRanges() { |
!CanEagerlyResolveControlFlow(GetInstructionBlock(pos))) { |
continue; |
} |
- auto prev_operand = first_range->GetAssignedOperand(operand_cache()); |
- auto cur_operand = second_range->GetAssignedOperand(operand_cache()); |
- if (prev_operand->Equals(cur_operand)) continue; |
+ auto prev = first_range->GetAssignedOperand(); |
+ auto cur = second_range->GetAssignedOperand(); |
+ if (prev == cur) continue; |
bool delay_insertion = false; |
Instruction::GapPosition gap_pos; |
int gap_index = pos.ToInstructionIndex(); |
@@ -1481,6 +1448,8 @@ void RegisterAllocator::ConnectRanges() { |
} |
auto move = code()->InstructionAt(gap_index)->GetOrCreateParallelMove( |
gap_pos, code_zone()); |
+ auto prev_operand = InstructionOperand::New(code_zone(), prev); |
+ auto cur_operand = InstructionOperand::New(code_zone(), cur); |
if (!delay_insertion) { |
move->AddMove(prev_operand, cur_operand, code_zone()); |
} else { |
@@ -1678,9 +1647,12 @@ void RegisterAllocator::ResolveControlFlow() { |
if (result.cur_cover_ == result.pred_cover_ || |
result.cur_cover_->IsSpilled()) |
continue; |
- auto pred_op = result.pred_cover_->GetAssignedOperand(operand_cache()); |
- auto cur_op = result.cur_cover_->GetAssignedOperand(operand_cache()); |
- ResolveControlFlow(block, cur_op, pred_block, pred_op); |
+ auto pred_op = result.pred_cover_->GetAssignedOperand(); |
+ auto cur_op = result.cur_cover_->GetAssignedOperand(); |
+ if (pred_op == cur_op) continue; |
+ auto pred_ptr = InstructionOperand::New(code_zone(), pred_op); |
+ auto cur_ptr = InstructionOperand::New(code_zone(), cur_op); |
+ ResolveControlFlow(block, cur_ptr, pred_block, pred_ptr); |
} |
iterator.Advance(); |
} |
@@ -1692,7 +1664,7 @@ void RegisterAllocator::ResolveControlFlow(const InstructionBlock* block, |
InstructionOperand* cur_op, |
const InstructionBlock* pred, |
InstructionOperand* pred_op) { |
- if (pred_op->Equals(cur_op)) return; |
+ DCHECK(!pred_op->Equals(cur_op)); |
int gap_index; |
Instruction::GapPosition position; |
if (block->PredecessorCount() == 1) { |
@@ -2534,7 +2506,7 @@ void RegisterAllocator::SetLiveRangeAssignedRegister(LiveRange* range, |
DCHECK(range->Kind() == GENERAL_REGISTERS); |
assigned_registers_->Add(reg); |
} |
- range->set_assigned_register(reg, operand_cache()); |
+ range->set_assigned_register(reg); |
} |
} // namespace compiler |