Index: src/jump-target.cc |
=================================================================== |
--- src/jump-target.cc (revision 1928) |
+++ src/jump-target.cc (working copy) |
@@ -92,69 +92,6 @@ |
} |
-FrameElement* JumpTarget::Combine(FrameElement* left, FrameElement* right) { |
- // Given a pair of non-null frame element pointers, return one of |
- // them as an entry frame candidate or null if they are |
- // incompatible. |
- |
- // If either is invalid, the result is. |
- if (!left->is_valid()) return left; |
- if (!right->is_valid()) return right; |
- |
- // If they have the exact same location, the result is in that |
- // location, otherwise we reallocate. If either is unsynced, the |
- // result is. The result static type is the merge of the static |
- // types. It's safe to set it on one of the frame elements, and |
- // harmless too (because we are only going to merge the reaching |
- // frames and will ensure that the types are coherent, and changing |
- // the static type does not emit code). |
- |
- StaticType type = left->static_type().merge(right->static_type()); |
- if (left->is_memory() && right->is_memory()) { |
- left->set_static_type(type); |
- return left; |
- } |
- |
- if (left->is_register() && right->is_register() && |
- left->reg().is(right->reg())) { |
- if (!left->is_synced()) { |
- left->set_static_type(type); |
- return left; |
- } else { |
- right->set_static_type(type); |
- return right; |
- } |
- } |
- |
- if (left->is_constant() && |
- right->is_constant() && |
- left->handle().is_identical_to(right->handle())) { |
- if (!left->is_synced()) { |
- left->set_static_type(type); |
- return left; |
- } else { |
- right->set_static_type(type); |
- return right; |
- } |
- } |
- |
- if (left->is_copy() && |
- right->is_copy() && |
- left->index() == right->index()) { |
- if (!left->is_synced()) { |
- left->set_static_type(type); |
- return left; |
- } else { |
- right->set_static_type(type); |
- return right; |
- } |
- } |
- |
- // Otherwise they are incompatible and we will reallocate them. |
- return NULL; |
-} |
- |
- |
void JumpTarget::ComputeEntryFrame(int mergable_elements) { |
// Given: a collection of frames reaching by forward CFG edges and |
// the directionality of the block. Compute: an entry frame for the |
@@ -198,15 +135,15 @@ |
// Compute elements based on the other reaching frames. |
if (reaching_frames_.length() > 1) { |
for (int i = 0; i < length; i++) { |
+ FrameElement* element = elements[i]; |
for (int j = 1; j < reaching_frames_.length(); j++) { |
- FrameElement* element = elements[i]; |
- |
// Element computation is monotonic: new information will not |
// change our decision about undetermined or invalid elements. |
if (element == NULL || !element->is_valid()) break; |
- elements[i] = Combine(element, &reaching_frames_[j]->elements_[i]); |
+ element = element->Combine(&reaching_frames_[j]->elements_[i]); |
} |
+ elements[i] = element; |
} |
} |
@@ -216,33 +153,23 @@ |
entry_frame_ = new VirtualFrame(cgen_); |
int index = 0; |
for (; index < entry_frame_->elements_.length(); index++) { |
+ FrameElement* target = elements[index]; |
// If the element is determined, set it now. Count registers. Mark |
// elements as copied exactly when they have a copy. 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(); |
- } |
+ if (target != NULL) { |
+ entry_frame_->elements_[index] = *target; |
+ entry_frame_->InitializeEntryElement(index, target); |
} |
} |
// Then fill in the rest of the frame with new elements. |
for (; index < length; index++) { |
- if (elements[index] == NULL) { |
+ FrameElement* target = elements[index]; |
+ if (target == NULL) { |
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(); |
- } |
+ entry_frame_->elements_.Add(*target); |
+ entry_frame_->InitializeEntryElement(index, target); |
} |
} |