Chromium Code Reviews| Index: src/jump-target.cc |
| =================================================================== |
| --- src/jump-target.cc (revision 1495) |
| +++ src/jump-target.cc (working copy) |
| @@ -71,13 +71,10 @@ |
| void JumpTarget::Unuse() { |
| ASSERT(!is_linked()); |
| -#ifdef DEBUG |
| for (int i = 0; i < reaching_frames_.length(); i++) { |
| - ASSERT(reaching_frames_[i] == NULL); |
| + delete reaching_frames_[i]; |
|
Kasper Lund
2009/03/12 14:45:00
Do you want to NULL them out too in case the JumpT
Kevin Millikin (Chromium)
2009/03/12 14:53:51
Maybe it's safer (in the face of changes). Right
|
| } |
| -#endif |
| delete entry_frame_; |
| - |
| Reset(); |
| } |
| @@ -143,19 +140,12 @@ |
| void JumpTarget::ComputeEntryFrame(int mergable_elements) { |
| - // Given: a collection of frames reaching by forward CFG edges |
| - // (including the code generator's current frame) and the |
| - // directionality of the block. Compute: an entry frame for the |
| + // Given: a collection of frames reaching by forward CFG edges and |
| + // the directionality of the block. Compute: an entry frame for the |
| // block. |
| - // Choose an initial frame, either the code generator's current |
| - // frame if there is one, or the first reaching frame if not. |
| - VirtualFrame* initial_frame = cgen_->frame(); |
| - int start_index = 0; // Begin iteration with the 1st reaching frame. |
| - if (initial_frame == NULL) { |
| - initial_frame = reaching_frames_[0]; |
| - start_index = 1; // Begin iteration with the 2nd reaching frame. |
| - } |
| + // Choose an initial frame. |
| + VirtualFrame* initial_frame = reaching_frames_[0]; |
| // A list of pointers to frame elements in the entry frame. NULL |
| // indicates that the element has not yet been determined. |
| @@ -185,9 +175,9 @@ |
| } |
| // Compute elements based on the other reaching frames. |
| - if (start_index < reaching_frames_.length()) { |
| + if (reaching_frames_.length() > 1) { |
| for (int i = 0; i < length; i++) { |
| - for (int j = start_index; j < reaching_frames_.length(); j++) { |
| + for (int j = 1; j < reaching_frames_.length(); j++) { |
| FrameElement* element = elements[i]; |
| // Element computation is monotonic: new information will not |
| @@ -226,12 +216,11 @@ |
| // If the value is synced on all frames, put it in memory. This |
| // costs nothing at the merge code but will incur a |
| // memory-to-register move when the value is needed later. |
| - bool is_synced = initial_frame->elements_[i].is_synced(); |
| - int j = start_index; |
| - while (is_synced && j < reaching_frames_.length()) { |
| + bool is_synced = true; |
| + for (int j = 0; is_synced && j < reaching_frames_.length(); j++) { |
| is_synced = reaching_frames_[j]->elements_[i].is_synced(); |
| - j++; |
| } |
| + |
| // There is nothing to be done if the elements are all synced. |
| // It is already recorded as a memory element. |
| if (is_synced) continue; |
| @@ -242,17 +231,8 @@ |
| int max_count = kMinInt; |
| int best_reg_code = no_reg.code_; |
| - // Consider the initial frame. |
| - FrameElement element = initial_frame->elements_[i]; |
| - if (element.is_register() && |
| - !frame_registers.is_used(element.reg())) { |
| - candidate_registers.Use(element.reg()); |
| - max_count = 1; |
| - best_reg_code = element.reg().code(); |
| - } |
| - // Consider the other frames. |
| - for (int j = start_index; j < reaching_frames_.length(); j++) { |
| - element = reaching_frames_[j]->elements_[i]; |
| + for (int j = 0; j < reaching_frames_.length(); j++) { |
| + FrameElement element = reaching_frames_[j]->elements_[i]; |
| if (element.is_register() && |
| !frame_registers.is_used(element.reg())) { |
| candidate_registers.Use(element.reg()); |
| @@ -589,16 +569,18 @@ |
| #ifdef DEBUG |
| ASSERT(mergable_elements == kAllElements); |
| ASSERT(cgen_ != NULL); |
| + // All the forward-reaching frames should have been adjusted at the |
| + // jumps to this target. |
| for (int i = 0; i < reaching_frames_.length(); i++) { |
| - ASSERT(reaching_frames_[i]->height() == expected_height_); |
| + ASSERT(reaching_frames_[i] == NULL || |
| + reaching_frames_[i]->height() == expected_height_); |
| } |
| #endif |
| - |
| - // This is a break target so drop leftover statement state from the |
| - // frame before merging. |
| + // This is a break target so we drop leftover statement state from |
| + // the frame before merging, even on the fall through. This is |
| + // because we can bind the return target with state on the frame. |
| if (cgen_->has_valid_frame()) { |
| - int count = cgen_->frame()->height() - expected_height_; |
| - cgen_->frame()->ForgetElements(count); |
| + cgen_->frame()->ForgetElements(cgen_->frame()->height() - expected_height_); |
| } |
| JumpTarget::Bind(mergable_elements); |
| } |