Revert r7665.

Review URL: http://codereview.chromium.org/6873106

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7670 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
fschneider@chromium.org 2011-04-20 09:08:26 +00:00
parent 6197c1566a
commit a4283a5440
10 changed files with 30 additions and 34 deletions

View File

@ -131,6 +131,7 @@ void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
void LLabel::PrintDataTo(StringStream* stream) { void LLabel::PrintDataTo(StringStream* stream) {
LGap::PrintDataTo(stream);
LLabel* rep = replacement(); LLabel* rep = replacement();
if (rep != NULL) { if (rep != NULL) {
stream->Add(" Dead block replaced with B%d", rep->block_id()); stream->Add(" Dead block replaced with B%d", rep->block_id());
@ -144,6 +145,7 @@ bool LGap::IsRedundant() const {
return false; return false;
} }
} }
return true; return true;
} }
@ -428,6 +430,7 @@ void LChunk::MarkEmptyBlocks() {
if (last_instr->IsGoto()) { if (last_instr->IsGoto()) {
LGoto* goto_instr = LGoto::cast(last_instr); LGoto* goto_instr = LGoto::cast(last_instr);
if (!goto_instr->include_stack_check() && if (!goto_instr->include_stack_check() &&
label->IsRedundant() &&
!label->is_loop_header()) { !label->is_loop_header()) {
bool can_eliminate = true; bool can_eliminate = true;
for (int i = first + 1; i < last && can_eliminate; ++i) { for (int i = first + 1; i < last && can_eliminate; ++i) {

View File

@ -407,17 +407,17 @@ class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
}; };
class LLabel: public LTemplateInstruction<0, 0, 0> { class LLabel: public LGap {
public: public:
explicit LLabel(HBasicBlock* block) explicit LLabel(HBasicBlock* block)
: block_(block), replacement_(NULL) { } : LGap(block), replacement_(NULL) { }
DECLARE_CONCRETE_INSTRUCTION(Label, "label") DECLARE_CONCRETE_INSTRUCTION(Label, "label")
virtual void PrintDataTo(StringStream* stream); virtual void PrintDataTo(StringStream* stream);
int block_id() const { return block_->block_id(); } int block_id() const { return block()->block_id(); }
bool is_loop_header() const { return block_->IsLoopHeader(); } bool is_loop_header() const { return block()->IsLoopHeader(); }
Label* label() { return &label_; } Label* label() { return &label_; }
LLabel* replacement() const { return replacement_; } LLabel* replacement() const { return replacement_; }
void set_replacement(LLabel* label) { replacement_ = label; } void set_replacement(LLabel* label) { replacement_ = label; }
@ -425,7 +425,6 @@ class LLabel: public LTemplateInstruction<0, 0, 0> {
private: private:
Label label_; Label label_;
HBasicBlock* block_;
LLabel* replacement_; LLabel* replacement_;
}; };
@ -2023,10 +2022,6 @@ class LChunk: public ZoneObject {
int first_instruction = block->first_instruction_index(); int first_instruction = block->first_instruction_index();
return LLabel::cast(instructions_[first_instruction]); 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 { int LookupDestination(int block_id) const {
LLabel* cur = GetLabel(block_id); LLabel* cur = GetLabel(block_id);
while (cur->replacement() != NULL) { while (cur->replacement() != NULL) {

View File

@ -739,6 +739,7 @@ void LCodeGen::DoLabel(LLabel* label) {
} }
__ bind(label->label()); __ bind(label->label());
current_block_ = label->block_id(); current_block_ = label->block_id();
LCodeGen::DoGap(label);
} }

View File

@ -689,6 +689,7 @@ void LCodeGen::DoLabel(LLabel* label) {
} }
__ bind(label->label()); __ bind(label->label());
current_block_ = label->block_id(); current_block_ = label->block_id();
LCodeGen::DoGap(label);
} }

View File

@ -133,6 +133,7 @@ void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
void LLabel::PrintDataTo(StringStream* stream) { void LLabel::PrintDataTo(StringStream* stream) {
LGap::PrintDataTo(stream);
LLabel* rep = replacement(); LLabel* rep = replacement();
if (rep != NULL) { if (rep != NULL) {
stream->Add(" Dead block replaced with B%d", rep->block_id()); stream->Add(" Dead block replaced with B%d", rep->block_id());
@ -146,6 +147,7 @@ bool LGap::IsRedundant() const {
return false; return false;
} }
} }
return true; return true;
} }
@ -386,6 +388,7 @@ void LChunk::MarkEmptyBlocks() {
if (last_instr->IsGoto()) { if (last_instr->IsGoto()) {
LGoto* goto_instr = LGoto::cast(last_instr); LGoto* goto_instr = LGoto::cast(last_instr);
if (!goto_instr->include_stack_check() && if (!goto_instr->include_stack_check() &&
label->IsRedundant() &&
!label->is_loop_header()) { !label->is_loop_header()) {
bool can_eliminate = true; bool can_eliminate = true;
for (int i = first + 1; i < last && can_eliminate; ++i) { for (int i = first + 1; i < last && can_eliminate; ++i) {

View File

@ -409,17 +409,17 @@ class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
}; };
class LLabel: public LTemplateInstruction<0, 0, 0> { class LLabel: public LGap {
public: public:
explicit LLabel(HBasicBlock* block) explicit LLabel(HBasicBlock* block)
: block_(block), replacement_(NULL) { } : LGap(block), replacement_(NULL) { }
DECLARE_CONCRETE_INSTRUCTION(Label, "label") DECLARE_CONCRETE_INSTRUCTION(Label, "label")
virtual void PrintDataTo(StringStream* stream); virtual void PrintDataTo(StringStream* stream);
int block_id() const { return block_->block_id(); } int block_id() const { return block()->block_id(); }
bool is_loop_header() const { return block_->IsLoopHeader(); } bool is_loop_header() const { return block()->IsLoopHeader(); }
Label* label() { return &label_; } Label* label() { return &label_; }
LLabel* replacement() const { return replacement_; } LLabel* replacement() const { return replacement_; }
void set_replacement(LLabel* label) { replacement_ = label; } void set_replacement(LLabel* label) { replacement_ = label; }
@ -427,7 +427,6 @@ class LLabel: public LTemplateInstruction<0, 0, 0> {
private: private:
Label label_; Label label_;
HBasicBlock* block_;
LLabel* replacement_; LLabel* replacement_;
}; };
@ -2082,10 +2081,6 @@ class LChunk: public ZoneObject {
int first_instruction = block->first_instruction_index(); int first_instruction = block->first_instruction_index();
return LLabel::cast(instructions_[first_instruction]); 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 { int LookupDestination(int block_id) const {
LLabel* cur = GetLabel(block_id); LLabel* cur = GetLabel(block_id);
while (cur->replacement() != NULL) { while (cur->replacement() != NULL) {

View File

@ -1047,10 +1047,9 @@ void LAllocator::ResolvePhis(HBasicBlock* block) {
} }
} }
// Insert spill-move in the first section of the first gap.
LiveRange* live_range = LiveRangeFor(phi->id()); LiveRange* live_range = LiveRangeFor(phi->id());
LGap* gap = chunk_->GetFirstGap(phi->block()); LLabel* label = chunk_->GetLabel(phi->block()->block_id());
gap->GetOrCreateParallelMove(LGap::BEFORE)-> label->GetOrCreateParallelMove(LGap::START)->
AddMove(phi_operand, live_range->GetSpillOperand()); AddMove(phi_operand, live_range->GetSpillOperand());
live_range->SetSpillStartIndex(phi->block()->first_instruction_index()); live_range->SetSpillStartIndex(phi->block()->first_instruction_index());
} }
@ -1123,12 +1122,12 @@ void LAllocator::ResolveControlFlow(LiveRange* range,
LOperand* pred_op = pred_cover->CreateAssignedOperand(); LOperand* pred_op = pred_cover->CreateAssignedOperand();
LOperand* cur_op = cur_cover->CreateAssignedOperand(); LOperand* cur_op = cur_cover->CreateAssignedOperand();
if (!pred_op->Equals(cur_op)) { if (!pred_op->Equals(cur_op)) {
LGap* gap = NULL;
if (block->predecessors()->length() == 1) { if (block->predecessors()->length() == 1) {
LGap* gap = chunk_->GetFirstGap(block); gap = GapAt(block->first_instruction_index());
gap->GetOrCreateParallelMove(LGap::BEFORE)->AddMove(pred_op, cur_op);
} else { } else {
ASSERT(pred->end()->SecondSuccessor() == NULL); ASSERT(pred->end()->SecondSuccessor() == NULL);
LGap* gap = GetLastGap(pred); gap = GetLastGap(pred);
// We are going to insert a move before the branch instruction. // We are going to insert a move before the branch instruction.
// Some branch instructions (e.g. loops' back edges) // Some branch instructions (e.g. loops' back edges)
@ -1144,8 +1143,8 @@ void LAllocator::ResolveControlFlow(LiveRange* range,
branch->pointer_map()->RecordPointer(cur_op); branch->pointer_map()->RecordPointer(cur_op);
} }
} }
gap->GetOrCreateParallelMove(LGap::START)->AddMove(pred_op, cur_op);
} }
gap->GetOrCreateParallelMove(LGap::START)->AddMove(pred_op, cur_op);
} }
} }
} }

View File

@ -690,6 +690,7 @@ void LCodeGen::DoLabel(LLabel* label) {
} }
__ bind(label->label()); __ bind(label->label());
current_block_ = label->block_id(); current_block_ = label->block_id();
LCodeGen::DoGap(label);
} }

View File

@ -133,6 +133,7 @@ void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
void LLabel::PrintDataTo(StringStream* stream) { void LLabel::PrintDataTo(StringStream* stream) {
LGap::PrintDataTo(stream);
LLabel* rep = replacement(); LLabel* rep = replacement();
if (rep != NULL) { if (rep != NULL) {
stream->Add(" Dead block replaced with B%d", rep->block_id()); stream->Add(" Dead block replaced with B%d", rep->block_id());
@ -146,6 +147,7 @@ bool LGap::IsRedundant() const {
return false; return false;
} }
} }
return true; return true;
} }
@ -385,6 +387,7 @@ void LChunk::MarkEmptyBlocks() {
if (last_instr->IsGoto()) { if (last_instr->IsGoto()) {
LGoto* goto_instr = LGoto::cast(last_instr); LGoto* goto_instr = LGoto::cast(last_instr);
if (!goto_instr->include_stack_check() && if (!goto_instr->include_stack_check() &&
label->IsRedundant() &&
!label->is_loop_header()) { !label->is_loop_header()) {
bool can_eliminate = true; bool can_eliminate = true;
for (int i = first + 1; i < last && can_eliminate; ++i) { for (int i = first + 1; i < last && can_eliminate; ++i) {

View File

@ -408,17 +408,17 @@ class LDeoptimize: public LTemplateInstruction<0, 0, 0> {
}; };
class LLabel: public LTemplateInstruction<0, 0, 0> { class LLabel: public LGap {
public: public:
explicit LLabel(HBasicBlock* block) explicit LLabel(HBasicBlock* block)
: block_(block), replacement_(NULL) { } : LGap(block), replacement_(NULL) { }
DECLARE_CONCRETE_INSTRUCTION(Label, "label") DECLARE_CONCRETE_INSTRUCTION(Label, "label")
virtual void PrintDataTo(StringStream* stream); virtual void PrintDataTo(StringStream* stream);
int block_id() const { return block_->block_id(); } int block_id() const { return block()->block_id(); }
bool is_loop_header() const { return block_->IsLoopHeader(); } bool is_loop_header() const { return block()->IsLoopHeader(); }
Label* label() { return &label_; } Label* label() { return &label_; }
LLabel* replacement() const { return replacement_; } LLabel* replacement() const { return replacement_; }
void set_replacement(LLabel* label) { replacement_ = label; } void set_replacement(LLabel* label) { replacement_ = label; }
@ -426,7 +426,6 @@ class LLabel: public LTemplateInstruction<0, 0, 0> {
private: private:
Label label_; Label label_;
HBasicBlock* block_;
LLabel* replacement_; LLabel* replacement_;
}; };
@ -2005,10 +2004,6 @@ class LChunk: public ZoneObject {
int first_instruction = block->first_instruction_index(); int first_instruction = block->first_instruction_index();
return LLabel::cast(instructions_[first_instruction]); 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 { int LookupDestination(int block_id) const {
LLabel* cur = GetLabel(block_id); LLabel* cur = GetLabel(block_id);
while (cur->replacement() != NULL) { while (cur->replacement() != NULL) {