[turbofan] commit allocated registers early
authordcarney <dcarney@chromium.org>
Thu, 11 Dec 2014 12:13:08 +0000 (04:13 -0800)
committerCommit bot <commit-bot@chromium.org>
Thu, 11 Dec 2014 12:13:19 +0000 (12:13 +0000)
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
src/compiler/register-allocator.h

index e01fe1ff35f8d12fdb1cad9499b6377d00659acc..0775de969e6b67fcd7c4a3c7f571372e9ba8f179 100644 (file)
@@ -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
index 2db5189ee16a7062ff6c1419d59ede92838b55fd..3ed9860995635eb9a53e8ebc820c8999f902a5cb 100644 (file)
@@ -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; }