Revision f230a1cf deps/v8/src/hydrogen-gvn.cc
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