Revision: 7737
Author:   [email protected]
Date:     Mon May  2 00:47:10 2011
Log:      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
http://code.google.com/p/v8/source/detail?r=7737

Modified:
 /branches/bleeding_edge/src/lithium-allocator.cc

=======================================
--- /branches/bleeding_edge/src/lithium-allocator.cc Wed Apr 20 02:08:26 2011 +++ /branches/bleeding_edge/src/lithium-allocator.cc Mon May 2 00:47:10 2011
@@ -2029,12 +2029,12 @@
   // 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 @@
     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());

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to