Index: src/jump-target.cc |
=================================================================== |
--- src/jump-target.cc (revision 1906) |
+++ src/jump-target.cc (working copy) |
@@ -195,13 +195,17 @@ |
entry_frame_ = new VirtualFrame(cgen_); |
int index = 0; |
for (; index < entry_frame_->elements_.length(); index++) { |
- // If the element is determined, set it now and count registers. |
- // Undetermined elements are initially recorded as if in memory. |
+ // If the element is determined, set it now. Count registers. |
+ // Mark elements as copied exactly if they are. Undetermined |
+ // elements are initially recorded as if in memory. |
if (elements[index] != NULL) { |
entry_frame_->elements_[index] = *elements[index]; |
+ entry_frame_->elements_[index].clear_copied(); |
if (elements[index]->is_register()) { |
entry_frame_->register_locations_[elements[index]->reg().code()] = |
index; |
+ } else if (elements[index]->is_copy()) { |
+ entry_frame_->elements_[elements[index]->index()].set_copied(); |
} |
} |
} |
@@ -211,9 +215,12 @@ |
entry_frame_->elements_.Add(FrameElement::MemoryElement()); |
} else { |
entry_frame_->elements_.Add(*elements[index]); |
+ entry_frame_->elements_[index].clear_copied(); |
if (elements[index]->is_register()) { |
entry_frame_->register_locations_[elements[index]->reg().code()] = |
index; |
+ } else if (elements[index]->is_copy()) { |
+ entry_frame_->elements_[elements[index]->index()].set_copied(); |
} |
} |
} |
@@ -261,27 +268,25 @@ |
} |
} |
- // If there was a register choice, use it. If not do nothing |
- // (the element is already recorded as in memory) |
if (best_reg_code != no_reg.code_) { |
+ // If there was a register choice, use it. Preserve the copied |
+ // flag on the element. |
+ bool is_copied = entry_frame_->elements_[i].is_copied(); |
Register reg = { best_reg_code }; |
entry_frame_->elements_[i] = |
FrameElement::RegisterElement(reg, |
FrameElement::NOT_SYNCED); |
+ if (is_copied) entry_frame_->elements_[i].set_copied(); |
entry_frame_->register_locations_[best_reg_code] = i; |
} |
+ // If there was no register found, the element is already |
+ // recorded as in memory. |
} |
} |
- // Set the copied flags in the frame to be exact. This assumes that |
- // the backing store of copies is always lower in the frame. |
+ // Set the static type of frame elements. |
for (int i = 0; i < length; i++) { |
FrameElement* current = &entry_frame_->elements_[i]; |
- current->clear_copied(); |
- if (current->is_copy()) { |
- entry_frame_->elements_[current->index()].set_copied(); |
- } |
- |
if (direction_ == BIDIRECTIONAL && i >= high_water_mark) { |
current->set_static_type(StaticType::unknown()); |
} else { |