Lithium LLabel instruction are no longer used as gap instructions.
authorfschneider@chromium.org <fschneider@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 19 Apr 2011 16:14:42 +0000 (16:14 +0000)
committerfschneider@chromium.org <fschneider@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 19 Apr 2011 16:14:42 +0000 (16:14 +0000)
Instead we use the first part of the first gap after
the label to insert gap-moves for resolving control-flow
and phis.
Review URL: http://codereview.chromium.org/6873075

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7665 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/arm/lithium-arm.cc
src/arm/lithium-arm.h
src/arm/lithium-codegen-arm.cc
src/ia32/lithium-codegen-ia32.cc
src/ia32/lithium-ia32.cc
src/ia32/lithium-ia32.h
src/lithium-allocator.cc
src/x64/lithium-codegen-x64.cc
src/x64/lithium-x64.cc
src/x64/lithium-x64.h

index faf6404..2f6a558 100644 (file)
@@ -131,7 +131,6 @@ void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
 
 
 void LLabel::PrintDataTo(StringStream* stream) {
-  LGap::PrintDataTo(stream);
   LLabel* rep = replacement();
   if (rep != NULL) {
     stream->Add(" Dead block replaced with B%d", rep->block_id());
@@ -145,7 +144,6 @@ bool LGap::IsRedundant() const {
       return false;
     }
   }
-
   return true;
 }
 
@@ -430,7 +428,6 @@ void LChunk::MarkEmptyBlocks() {
     if (last_instr->IsGoto()) {
       LGoto* goto_instr = LGoto::cast(last_instr);
       if (!goto_instr->include_stack_check() &&
-          label->IsRedundant() &&
           !label->is_loop_header()) {
         bool can_eliminate = true;
         for (int i = first + 1; i < last && can_eliminate; ++i) {
index 4add6bf..6beb137 100644 (file)
@@ -407,17 +407,17 @@ class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
 };
 
 
-class LLabel: public LGap {
+class LLabel: public LTemplateInstruction<0, 0, 0> {
  public:
   explicit LLabel(HBasicBlock* block)
-      : LGap(block), replacement_(NULL) { }
+      : block_(block), replacement_(NULL) { }
 
   DECLARE_CONCRETE_INSTRUCTION(Label, "label")
 
   virtual void PrintDataTo(StringStream* stream);
 
-  int block_id() const { return block()->block_id(); }
-  bool is_loop_header() const { return block()->IsLoopHeader(); }
+  int block_id() const { return block_->block_id(); }
+  bool is_loop_header() const { return block_->IsLoopHeader(); }
   Label* label() { return &label_; }
   LLabel* replacement() const { return replacement_; }
   void set_replacement(LLabel* label) { replacement_ = label; }
@@ -425,6 +425,7 @@ class LLabel: public LGap {
 
  private:
   Label label_;
+  HBasicBlock* block_;
   LLabel* replacement_;
 };
 
@@ -2022,6 +2023,10 @@ class LChunk: public ZoneObject {
     int first_instruction = block->first_instruction_index();
     return LLabel::cast(instructions_[first_instruction]);
   }
+  LGap* GetFirstGap(HBasicBlock* block) const {
+    int first_instruction = block->first_instruction_index();
+    return LGap::cast(instructions_[first_instruction + 1]);
+  }
   int LookupDestination(int block_id) const {
     LLabel* cur = GetLabel(block_id);
     while (cur->replacement() != NULL) {
index c820e2e..83a2478 100644 (file)
@@ -739,7 +739,6 @@ void LCodeGen::DoLabel(LLabel* label) {
   }
   __ bind(label->label());
   current_block_ = label->block_id();
-  LCodeGen::DoGap(label);
 }
 
 
index 46c71e8..387d1b5 100644 (file)
@@ -689,7 +689,6 @@ void LCodeGen::DoLabel(LLabel* label) {
   }
   __ bind(label->label());
   current_block_ = label->block_id();
-  LCodeGen::DoGap(label);
 }
 
 
index aa91a83..aa830c2 100644 (file)
@@ -133,7 +133,6 @@ void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
 
 
 void LLabel::PrintDataTo(StringStream* stream) {
-  LGap::PrintDataTo(stream);
   LLabel* rep = replacement();
   if (rep != NULL) {
     stream->Add(" Dead block replaced with B%d", rep->block_id());
@@ -147,7 +146,6 @@ bool LGap::IsRedundant() const {
       return false;
     }
   }
-
   return true;
 }
 
@@ -388,7 +386,6 @@ void LChunk::MarkEmptyBlocks() {
     if (last_instr->IsGoto()) {
       LGoto* goto_instr = LGoto::cast(last_instr);
       if (!goto_instr->include_stack_check() &&
-          label->IsRedundant() &&
           !label->is_loop_header()) {
         bool can_eliminate = true;
         for (int i = first + 1; i < last && can_eliminate; ++i) {
index 76c90be..cb3d850 100644 (file)
@@ -409,17 +409,17 @@ class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
 };
 
 
-class LLabel: public LGap {
+class LLabel: public LTemplateInstruction<0, 0, 0> {
  public:
   explicit LLabel(HBasicBlock* block)
-      : LGap(block), replacement_(NULL) { }
+      : block_(block), replacement_(NULL) { }
 
   DECLARE_CONCRETE_INSTRUCTION(Label, "label")
 
   virtual void PrintDataTo(StringStream* stream);
 
-  int block_id() const { return block()->block_id(); }
-  bool is_loop_header() const { return block()->IsLoopHeader(); }
+  int block_id() const { return block_->block_id(); }
+  bool is_loop_header() const { return block_->IsLoopHeader(); }
   Label* label() { return &label_; }
   LLabel* replacement() const { return replacement_; }
   void set_replacement(LLabel* label) { replacement_ = label; }
@@ -427,6 +427,7 @@ class LLabel: public LGap {
 
  private:
   Label label_;
+  HBasicBlock* block_;
   LLabel* replacement_;
 };
 
@@ -2081,6 +2082,10 @@ class LChunk: public ZoneObject {
     int first_instruction = block->first_instruction_index();
     return LLabel::cast(instructions_[first_instruction]);
   }
+  LGap* GetFirstGap(HBasicBlock* block) const {
+    int first_instruction = block->first_instruction_index();
+    return LGap::cast(instructions_[first_instruction + 1]);
+  }
   int LookupDestination(int block_id) const {
     LLabel* cur = GetLabel(block_id);
     while (cur->replacement() != NULL) {
index a42d522..911e70d 100644 (file)
@@ -1047,9 +1047,10 @@ void LAllocator::ResolvePhis(HBasicBlock* block) {
       }
     }
 
+    // Insert spill-move in the first section of the first gap.
     LiveRange* live_range = LiveRangeFor(phi->id());
-    LLabel* label = chunk_->GetLabel(phi->block()->block_id());
-    label->GetOrCreateParallelMove(LGap::START)->
+    LGap* gap = chunk_->GetFirstGap(phi->block());
+    gap->GetOrCreateParallelMove(LGap::BEFORE)->
         AddMove(phi_operand, live_range->GetSpillOperand());
     live_range->SetSpillStartIndex(phi->block()->first_instruction_index());
   }
@@ -1122,12 +1123,12 @@ void LAllocator::ResolveControlFlow(LiveRange* range,
     LOperand* pred_op = pred_cover->CreateAssignedOperand();
     LOperand* cur_op = cur_cover->CreateAssignedOperand();
     if (!pred_op->Equals(cur_op)) {
-      LGap* gap = NULL;
       if (block->predecessors()->length() == 1) {
-        gap = GapAt(block->first_instruction_index());
+        LGap* gap = chunk_->GetFirstGap(block);
+        gap->GetOrCreateParallelMove(LGap::BEFORE)->AddMove(pred_op, cur_op);
       } else {
         ASSERT(pred->end()->SecondSuccessor() == NULL);
-        gap = GetLastGap(pred);
+        LGap* gap = GetLastGap(pred);
 
         // We are going to insert a move before the branch instruction.
         // Some branch instructions (e.g. loops' back edges)
@@ -1143,8 +1144,8 @@ void LAllocator::ResolveControlFlow(LiveRange* range,
             branch->pointer_map()->RecordPointer(cur_op);
           }
         }
+        gap->GetOrCreateParallelMove(LGap::START)->AddMove(pred_op, cur_op);
       }
-      gap->GetOrCreateParallelMove(LGap::START)->AddMove(pred_op, cur_op);
     }
   }
 }
index c242874..f2e6b25 100644 (file)
@@ -690,7 +690,6 @@ void LCodeGen::DoLabel(LLabel* label) {
   }
   __ bind(label->label());
   current_block_ = label->block_id();
-  LCodeGen::DoGap(label);
 }
 
 
index 620bbc9..ccb2313 100644 (file)
@@ -133,7 +133,6 @@ void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
 
 
 void LLabel::PrintDataTo(StringStream* stream) {
-  LGap::PrintDataTo(stream);
   LLabel* rep = replacement();
   if (rep != NULL) {
     stream->Add(" Dead block replaced with B%d", rep->block_id());
@@ -147,7 +146,6 @@ bool LGap::IsRedundant() const {
       return false;
     }
   }
-
   return true;
 }
 
@@ -387,7 +385,6 @@ void LChunk::MarkEmptyBlocks() {
     if (last_instr->IsGoto()) {
       LGoto* goto_instr = LGoto::cast(last_instr);
       if (!goto_instr->include_stack_check() &&
-          label->IsRedundant() &&
           !label->is_loop_header()) {
         bool can_eliminate = true;
         for (int i = first + 1; i < last && can_eliminate; ++i) {
index 74f4820..04b04e6 100644 (file)
@@ -408,17 +408,17 @@ class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
 };
 
 
-class LLabel: public LGap {
+class LLabel: public LTemplateInstruction<0, 0, 0> {
  public:
   explicit LLabel(HBasicBlock* block)
-      : LGap(block), replacement_(NULL) { }
+      : block_(block), replacement_(NULL) { }
 
   DECLARE_CONCRETE_INSTRUCTION(Label, "label")
 
   virtual void PrintDataTo(StringStream* stream);
 
-  int block_id() const { return block()->block_id(); }
-  bool is_loop_header() const { return block()->IsLoopHeader(); }
+  int block_id() const { return block_->block_id(); }
+  bool is_loop_header() const { return block_->IsLoopHeader(); }
   Label* label() { return &label_; }
   LLabel* replacement() const { return replacement_; }
   void set_replacement(LLabel* label) { replacement_ = label; }
@@ -426,6 +426,7 @@ class LLabel: public LGap {
 
  private:
   Label label_;
+  HBasicBlock* block_;
   LLabel* replacement_;
 };
 
@@ -2004,6 +2005,10 @@ class LChunk: public ZoneObject {
     int first_instruction = block->first_instruction_index();
     return LLabel::cast(instructions_[first_instruction]);
   }
+  LGap* GetFirstGap(HBasicBlock* block) const {
+    int first_instruction = block->first_instruction_index();
+    return LGap::cast(instructions_[first_instruction + 1]);
+  }
   int LookupDestination(int block_id) const {
     LLabel* cur = GetLabel(block_id);
     while (cur->replacement() != NULL) {