From 8897ab893021a30de2c921e7577d22ba60345a53 Mon Sep 17 00:00:00 2001 From: dcarney Date: Thu, 11 Dec 2014 04:13:08 -0800 Subject: [PATCH] [turbofan] commit allocated registers early R=bmeurer@chromium.org BUG=441107 LOG=N Review URL: https://codereview.chromium.org/795043003 Cr-Commit-Position: refs/heads/master@{#25772} --- src/compiler/register-allocator.cc | 8 ++++++-- src/compiler/register-allocator.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc index e01fe1ff35..0775de969e 100644 --- a/src/compiler/register-allocator.cc +++ b/src/compiler/register-allocator.cc @@ -135,9 +135,11 @@ LiveRange::LiveRange(int id, Zone* zone) spills_at_definition_(nullptr) {} -void LiveRange::set_assigned_register(int reg) { +void LiveRange::set_assigned_register(int reg, Zone* zone) { DCHECK(!HasRegisterAssigned() && !IsSpilled()); assigned_register_ = reg; + // TODO(dcarney): stop aliasing hint operands. + ConvertUsesToOperand(CreateAssignedOperand(zone)); } @@ -941,6 +943,8 @@ void RegisterAllocator::ReuseSpillSlots() { void RegisterAllocator::CommitAssignment() { for (auto range : live_ranges()) { if (range == nullptr || range->IsEmpty()) continue; + // Register assignments were committed in set_assigned_register. + if (range->HasRegisterAssigned()) continue; auto assigned = range->CreateAssignedOperand(code_zone()); range->ConvertUsesToOperand(assigned); if (range->IsSpilled()) { @@ -2547,7 +2551,7 @@ void RegisterAllocator::SetLiveRangeAssignedRegister(LiveRange* range, DCHECK(range->Kind() == GENERAL_REGISTERS); assigned_registers_->Add(reg); } - range->set_assigned_register(reg); + range->set_assigned_register(reg, code_zone()); } } // namespace compiler diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h index 2db5189ee1..3ed9860995 100644 --- a/src/compiler/register-allocator.h +++ b/src/compiler/register-allocator.h @@ -196,7 +196,7 @@ class LiveRange FINAL : public ZoneObject { InstructionOperand* CreateAssignedOperand(Zone* zone) const; int assigned_register() const { return assigned_register_; } int spill_start_index() const { return spill_start_index_; } - void set_assigned_register(int reg); + void set_assigned_register(int reg, Zone* zone); void MakeSpilled(); bool is_phi() const { return is_phi_; } void set_is_phi(bool is_phi) { is_phi_ = is_phi; }