Index: src/virtual-frame.cc |
=================================================================== |
--- src/virtual-frame.cc (revision 1401) |
+++ src/virtual-frame.cc (working copy) |
@@ -230,14 +230,19 @@ |
void VirtualFrame::PrepareMergeTo(VirtualFrame* expected) { |
- // No code needs to be generated to invalidate valid elements. No |
- // code needs to be generated to move values to memory if they are |
- // already synced. |
+ // Perform state changes on this frame that will make merge to the |
+ // expected frame simpler or else increase the likelihood that his |
+ // frame will match another. |
for (int i = 0; i < elements_.length(); i++) { |
FrameElement source = elements_[i]; |
FrameElement target = expected->elements_[i]; |
+ |
if (!target.is_valid() || |
(target.is_memory() && !source.is_memory() && source.is_synced())) { |
+ // No code needs to be generated to invalidate valid elements. |
+ // No code needs to be generated to move values to memory if |
+ // they are already synced. We perform those moves here, before |
+ // merging. |
if (source.is_register()) { |
// If the frame is the code generator's current frame, we have |
// to decrement both the frame-internal and global register |
@@ -249,6 +254,12 @@ |
} |
} |
elements_[i] = target; |
+ } else if (target.is_register() && !source.is_memory()) { |
+ // If an element's target is a register, and the element is not |
+ // in memory, then the sync state of the element is irrelevant. |
+ // We clear the sync bit. |
+ ASSERT(source.is_valid()); |
+ elements_[i].clear_sync(); |
} |
} |
} |