Index: src/hydrogen-bce.cc |
diff --git a/src/hydrogen-bce.cc b/src/hydrogen-bce.cc |
index c98a03cb5ab32d78b79a214c07edf5ecd2b1ee97..19931c3e4f484d527ba10a887fe47e03f2b5c5de 100644 |
--- a/src/hydrogen-bce.cc |
+++ b/src/hydrogen-bce.cc |
@@ -30,6 +30,7 @@ |
namespace v8 { |
namespace internal { |
+ |
// We try to "factor up" HBoundsCheck instructions towards the root of the |
// dominator tree. |
// For now we handle checks where the index is like "exp + int32value". |
@@ -173,7 +174,7 @@ class BoundsCheckBbData: public ZoneObject { |
keep_new_check = true; |
upper_check_ = new_check; |
} else { |
- TightenCheck(upper_check_, new_check); |
+ TightenCheck(upper_check_, new_check, new_offset); |
UpdateUpperOffsets(upper_check_, upper_offset_); |
} |
} else if (new_offset < lower_offset_) { |
@@ -182,7 +183,7 @@ class BoundsCheckBbData: public ZoneObject { |
keep_new_check = true; |
lower_check_ = new_check; |
} else { |
- TightenCheck(lower_check_, new_check); |
+ TightenCheck(lower_check_, new_check, new_offset); |
UpdateLowerOffsets(lower_check_, lower_offset_); |
} |
} else { |
@@ -191,12 +192,20 @@ class BoundsCheckBbData: public ZoneObject { |
} |
if (!keep_new_check) { |
+ if (FLAG_trace_bce) { |
+ OS::Print("Eliminating check #%d after tightening\n", |
+ new_check->id()); |
+ } |
new_check->block()->graph()->isolate()->counters()-> |
bounds_checks_eliminated()->Increment(); |
new_check->DeleteAndReplaceWith(new_check->ActualValue()); |
} else { |
HBoundsCheck* first_check = new_check == lower_check_ ? upper_check_ |
: lower_check_; |
+ if (FLAG_trace_bce) { |
+ OS::Print("Moving second check #%d after first check #%d\n", |
+ new_check->id(), first_check->id()); |
+ } |
// The length is guaranteed to be live at first_check. |
ASSERT(new_check->length() == first_check->length()); |
HInstruction* old_position = new_check->next(); |
@@ -275,11 +284,16 @@ class BoundsCheckBbData: public ZoneObject { |
} |
void TightenCheck(HBoundsCheck* original_check, |
- HBoundsCheck* tighter_check) { |
+ HBoundsCheck* tighter_check, |
+ int32_t new_offset) { |
ASSERT(original_check->length() == tighter_check->length()); |
MoveIndexIfNecessary(tighter_check->index(), original_check, tighter_check); |
original_check->ReplaceAllUsesWith(original_check->index()); |
original_check->SetOperandAt(0, tighter_check->index()); |
+ if (FLAG_trace_bce) { |
+ OS::Print("Tightened check #%d with offset %d from #%d\n", |
+ original_check->id(), new_offset, tighter_check->id()); |
+ } |
} |
DISALLOW_COPY_AND_ASSIGN(BoundsCheckBbData); |
@@ -389,11 +403,32 @@ BoundsCheckBbData* HBoundsCheckEliminationPhase::PreProcessBlock( |
bb_data_list, |
NULL); |
*data_p = bb_data_list; |
+ if (FLAG_trace_bce) { |
+ OS::Print("Fresh bounds check data for block #%d: [%d]\n", |
+ bb->block_id(), offset); |
+ } |
} else if (data->OffsetIsCovered(offset)) { |
bb->graph()->isolate()->counters()-> |
bounds_checks_eliminated()->Increment(); |
+ if (FLAG_trace_bce) { |
+ OS::Print("Eliminating bounds check #%d, offset %d is covered\n", |
+ check->id(), offset); |
+ } |
check->DeleteAndReplaceWith(check->ActualValue()); |
} else if (data->BasicBlock() == bb) { |
+ // TODO(jkummerow): I think the following logic would be preferable: |
+ // if (data->Basicblock() == bb || |
+ // graph()->use_optimistic_licm() || |
+ // bb->IsLoopSuccessorDominator()) { |
+ // data->CoverCheck(check, offset) |
+ // } else { |
+ // /* add pristine BCBbData like in (data == NULL) case above */ |
+ // } |
+ // Even better would be: distinguish between read-only dominator-imposed |
+ // knowledge and modifiable upper/lower checks. |
+ // What happens currently is that the first bounds check in a dominated |
+ // block will stay around while any further checks are hoisted out, |
+ // which doesn't make sense. Investigate/fix this in a future CL. |
data->CoverCheck(check, offset); |
} else if (graph()->use_optimistic_licm() || |
bb->IsLoopSuccessorDominator()) { |
@@ -411,6 +446,10 @@ BoundsCheckBbData* HBoundsCheckEliminationPhase::PreProcessBlock( |
data->UpperCheck(), |
bb_data_list, |
data); |
+ if (FLAG_trace_bce) { |
+ OS::Print("Updated bounds check data for block #%d: [%d - %d]\n", |
+ bb->block_id(), new_lower_offset, new_upper_offset); |
+ } |
table_.Insert(key, bb_data_list, zone()); |
} |
} |