Revision f230a1cf deps/v8/src/hydrogen-gvn.cc

View differences:

deps/v8/src/hydrogen-gvn.cc
396 396
  for (int i = graph()->blocks()->length() - 1; i >= 0; --i) {
397 397
    // Compute side effects for the block.
398 398
    HBasicBlock* block = graph()->blocks()->at(i);
399
    int id = block->block_id();
400 399
    GVNFlagSet side_effects;
401
    for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
402
      HInstruction* instr = it.Current();
403
      side_effects.Add(instr->ChangesFlags());
404
      if (instr->IsDeoptimize()) {
405
        block_side_effects_[id].RemoveAll();
406
        side_effects.RemoveAll();
407
        break;
400
    if (block->IsReachable() && !block->IsDeoptimizing()) {
401
      int id = block->block_id();
402
      for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
403
        HInstruction* instr = it.Current();
404
        side_effects.Add(instr->ChangesFlags());
408 405
      }
409
    }
410
    block_side_effects_[id].Add(side_effects);
406
      block_side_effects_[id].Add(side_effects);
411 407

  
412
    // Loop headers are part of their loop.
413
    if (block->IsLoopHeader()) {
414
      loop_side_effects_[id].Add(side_effects);
415
    }
408
      // Loop headers are part of their loop.
409
      if (block->IsLoopHeader()) {
410
        loop_side_effects_[id].Add(side_effects);
411
      }
416 412

  
417
    // Propagate loop side effects upwards.
418
    if (block->HasParentLoopHeader()) {
419
      int header_id = block->parent_loop_header()->block_id();
420
      loop_side_effects_[header_id].Add(block->IsLoopHeader()
421
                                        ? loop_side_effects_[id]
422
                                        : side_effects);
413
      // Propagate loop side effects upwards.
414
      if (block->HasParentLoopHeader()) {
415
        int header_id = block->parent_loop_header()->block_id();
416
        loop_side_effects_[header_id].Add(block->IsLoopHeader()
417
                                          ? loop_side_effects_[id]
418
                                          : side_effects);
419
      }
423 420
    }
424 421
  }
425 422
}
......
609 606
                                            HBasicBlock* loop_header) {
610 607
  // If we've disabled code motion or we're in a block that unconditionally
611 608
  // deoptimizes, don't move any instructions.
612
  return AllowCodeMotion() && !instr->block()->IsDeoptimizing();
609
  return AllowCodeMotion() && !instr->block()->IsDeoptimizing() &&
610
      instr->block()->IsReachable();
613 611
}
614 612

  
615 613

  

Also available in: Unified diff