Commit cf239c4e authored by vegorov@chromium.org's avatar vegorov@chromium.org

Fix two bugs the LAllocator::FindOptimalSplitPos.

- It was calculating start_block and end_block incorrectly.

- It was not considering the case when end_block is a loop header itself when searching for the header of the outermost loop.

These bugs do not affect correctness of the allocation but can severely degrade it's quality (cause spills in loop bodies).

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7737 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 7088aea3
......@@ -2029,12 +2029,12 @@ LifetimePosition LAllocator::FindOptimalSplitPos(LifetimePosition start,
// We have no choice
if (start_instr == end_instr) return end;
HBasicBlock* end_block = GetBlock(start);
HBasicBlock* start_block = GetBlock(end);
HBasicBlock* start_block = GetBlock(start);
HBasicBlock* end_block = GetBlock(end);
if (end_block == start_block) {
// The interval is split in the same basic block. Split at latest possible
// position.
// The interval is split in the same basic block. Split at the latest
// possible position.
return end;
}
......@@ -2045,7 +2045,9 @@ LifetimePosition LAllocator::FindOptimalSplitPos(LifetimePosition start,
block = block->parent_loop_header();
}
if (block == end_block) return end;
// We did not find any suitable outer loop. Split at the latest possible
// position unless end_block is a loop header itself.
if (block == end_block && !end_block->IsLoopHeader()) return end;
return LifetimePosition::FromInstructionIndex(
block->first_instruction_index());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment