deps: fix up v8 after fd80a3

fd80a31e06 has introduced a segfault
during redundant boundary check elimination (#8208).

The problem consists of two parts:

  1. Abscense of instruction iterator in
     `EliminateRedundantBoundsChecks`. It was present in recent v8, but
     wasn't considered important at the time of backport. However, since
     the function is changing instructions order in block, it is
     important to not rely at `i->next()` at the end of the loop.
  2. Too strict ASSERT in `MoveIndexIfNecessary`. It is essentially a
     backport of a45c96ab from v8's upstream. See
     https://github.com/v8/v8/commit/a45c96ab for details.

fix #8208
pull/23396/head
Fedor Indutny 2014-08-22 03:59:35 +04:00
parent adf2cfd54d
commit 3122e0eae6
1 changed files with 8 additions and 3 deletions

View File

@ -3546,7 +3546,11 @@ class BoundsCheckBbData: public ZoneObject {
void MoveIndexIfNecessary(HValue* index_raw, void MoveIndexIfNecessary(HValue* index_raw,
HBoundsCheck* insert_before, HBoundsCheck* insert_before,
HInstruction* end_of_scan_range) { HInstruction* end_of_scan_range) {
ASSERT(index_raw->IsAdd() || index_raw->IsSub()); if (!index_raw->IsAdd() && !index_raw->IsSub()) {
// index_raw can be HAdd(index_base, offset), HSub(index_base, offset),
// or index_base directly. In the latter case, no need to move anything.
return;
}
HBinaryOperation* index = HBinaryOperation* index =
HArithmeticBinaryOperation::cast(index_raw); HArithmeticBinaryOperation::cast(index_raw);
HValue* left_input = index->left(); HValue* left_input = index->left();
@ -3581,7 +3585,6 @@ class BoundsCheckBbData: public ZoneObject {
HBoundsCheck* tighter_check) { HBoundsCheck* tighter_check) {
ASSERT(original_check->length() == tighter_check->length()); ASSERT(original_check->length() == tighter_check->length());
MoveIndexIfNecessary(tighter_check->index(), original_check, tighter_check); MoveIndexIfNecessary(tighter_check->index(), original_check, tighter_check);
original_check->ReplaceAllUsesWith(original_check->index());
original_check->SetOperandAt(0, tighter_check->index()); original_check->SetOperandAt(0, tighter_check->index());
} }
}; };
@ -3624,7 +3627,9 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb,
BoundsCheckTable* table) { BoundsCheckTable* table) {
BoundsCheckBbData* bb_data_list = NULL; BoundsCheckBbData* bb_data_list = NULL;
for (HInstruction* i = bb->first(); i != NULL; i = i->next()) { HInstruction* next;
for (HInstruction* i = bb->first(); i != NULL; i = next) {
next = i->next();
if (!i->IsBoundsCheck()) continue; if (!i->IsBoundsCheck()) continue;
HBoundsCheck* check = HBoundsCheck::cast(i); HBoundsCheck* check = HBoundsCheck::cast(i);