Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
deps: fix up v8 after fd80a3
Browse files Browse the repository at this point in the history
fd80a31 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
     v8/v8@a45c96ab for details.

fix #8208
  • Loading branch information
indutny committed Aug 22, 2014
1 parent adf2cfd commit 3122e0e
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions deps/v8/src/hydrogen.cc
Expand Up @@ -3546,7 +3546,11 @@ class BoundsCheckBbData: public ZoneObject {
void MoveIndexIfNecessary(HValue* index_raw,
HBoundsCheck* insert_before,
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 =
HArithmeticBinaryOperation::cast(index_raw);
HValue* left_input = index->left();
Expand Down Expand Up @@ -3581,7 +3585,6 @@ class BoundsCheckBbData: public ZoneObject {
HBoundsCheck* tighter_check) {
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());
}
};
Expand Down Expand Up @@ -3624,7 +3627,9 @@ void HGraph::EliminateRedundantBoundsChecks(HBasicBlock* bb,
BoundsCheckTable* table) {
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;

HBoundsCheck* check = HBoundsCheck::cast(i);
Expand Down

0 comments on commit 3122e0e

Please sign in to comment.