From cf239c4ea8b57e059c70127773ab930be777eef4 Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Mon, 2 May 2011 07:47:10 +0000 Subject: [PATCH] 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 --- src/lithium-allocator.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/lithium-allocator.cc b/src/lithium-allocator.cc index a42d522315..50ed122784 100644 --- a/src/lithium-allocator.cc +++ b/src/lithium-allocator.cc @@ -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());