Reviewers: Vyacheslav Egorov,
Description:
Lithium LLabel instruction are no longer used as gap instructions.
Instead we use the first part of the first gap after
the label to insert gap-moves for resolving control-flow
and phis.
Please review this at http://codereview.chromium.org/6873075/
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/arm/lithium-arm.h
M src/arm/lithium-codegen-arm.cc
M src/ia32/lithium-codegen-ia32.cc
M src/ia32/lithium-ia32.h
M src/lithium-allocator.cc
M src/x64/lithium-codegen-x64.cc
M src/x64/lithium-x64.h
Index: src/arm/lithium-arm.h
===================================================================
--- src/arm/lithium-arm.h (revision 7663)
+++ src/arm/lithium-arm.h (working copy)
@@ -407,17 +407,17 @@
};
-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 @@
private:
Label label_;
+ HBasicBlock* block_;
LLabel* replacement_;
};
@@ -2022,6 +2023,10 @@
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: src/arm/lithium-codegen-arm.cc
===================================================================
--- src/arm/lithium-codegen-arm.cc (revision 7662)
+++ src/arm/lithium-codegen-arm.cc (working copy)
@@ -739,7 +739,6 @@
}
__ bind(label->label());
current_block_ = label->block_id();
- LCodeGen::DoGap(label);
}
Index: src/ia32/lithium-codegen-ia32.cc
===================================================================
--- src/ia32/lithium-codegen-ia32.cc (revision 7662)
+++ src/ia32/lithium-codegen-ia32.cc (working copy)
@@ -689,7 +689,6 @@
}
__ bind(label->label());
current_block_ = label->block_id();
- LCodeGen::DoGap(label);
}
Index: src/ia32/lithium-ia32.h
===================================================================
--- src/ia32/lithium-ia32.h (revision 7663)
+++ src/ia32/lithium-ia32.h (working copy)
@@ -409,17 +409,17 @@
};
-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 @@
private:
Label label_;
+ HBasicBlock* block_;
LLabel* replacement_;
};
@@ -2081,6 +2082,10 @@
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: src/lithium-allocator.cc
===================================================================
--- src/lithium-allocator.cc (revision 7662)
+++ src/lithium-allocator.cc (working copy)
@@ -1047,9 +1047,10 @@
}
}
+ // 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());
}
@@ -1124,7 +1125,8 @@
if (!pred_op->Equals(cur_op)) {
LGap* gap = NULL;
if (block->predecessors()->length() == 1) {
- gap = GapAt(block->first_instruction_index());
+ gap = GapAt(block->first_instruction_index() + 1);
+ gap->GetOrCreateParallelMove(LGap::BEFORE)->AddMove(pred_op,
cur_op);
} else {
ASSERT(pred->end()->SecondSuccessor() == NULL);
gap = GetLastGap(pred);
@@ -1143,8 +1145,8 @@
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: src/x64/lithium-codegen-x64.cc
===================================================================
--- src/x64/lithium-codegen-x64.cc (revision 7662)
+++ src/x64/lithium-codegen-x64.cc (working copy)
@@ -690,7 +690,6 @@
}
__ bind(label->label());
current_block_ = label->block_id();
- LCodeGen::DoGap(label);
}
Index: src/x64/lithium-x64.h
===================================================================
--- src/x64/lithium-x64.h (revision 7663)
+++ src/x64/lithium-x64.h (working copy)
@@ -408,17 +408,17 @@
};
-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 @@
private:
Label label_;
+ HBasicBlock* block_;
LLabel* replacement_;
};
@@ -2004,6 +2005,10 @@
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) {
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev