Chromium Code Reviews| Index: src/hydrogen.cc |
| =================================================================== |
| --- src/hydrogen.cc (revision 8241) |
| +++ src/hydrogen.cc (working copy) |
| @@ -68,7 +68,8 @@ |
| last_instruction_index_(-1), |
| deleted_phis_(4), |
| parent_loop_header_(NULL), |
| - is_inline_return_target_(false) { } |
| + is_inline_return_target_(false), |
| + is_deoptimizing_(false) { } |
| void HBasicBlock::AttachLoopInformation() { |
| @@ -1449,35 +1450,9 @@ |
| HBasicBlock* loop_header) { |
| // If we've disabled code motion, don't move any instructions. |
| if (!AllowCodeMotion()) return false; |
|
Kevin Millikin (Chromium)
2011/06/09 15:18:00
return AllowCodeMotion() && !instr->block()->IsDeo
fschneider
2011/06/09 15:46:47
Done.
|
| - |
| - // If --aggressive-loop-invariant-motion, move everything except change |
| - // instructions. |
| - if (FLAG_aggressive_loop_invariant_motion && !instr->IsChange()) { |
| - return true; |
| - } |
| - |
| - // Otherwise only move instructions that postdominate the loop header |
| - // (i.e. are always executed inside the loop). This is to avoid |
| - // unnecessary deoptimizations assuming the loop is executed at least |
| - // once. TODO(fschneider): Better type feedback should give us |
| - // information about code that was never executed. |
| - HBasicBlock* block = instr->block(); |
| - bool result = true; |
| - if (block != loop_header) { |
| - for (int i = 1; i < loop_header->predecessors()->length(); ++i) { |
| - bool found = false; |
| - HBasicBlock* pred = loop_header->predecessors()->at(i); |
| - while (pred != loop_header) { |
| - if (pred == block) found = true; |
| - pred = pred->dominator(); |
| - } |
| - if (!found) { |
| - result = false; |
| - break; |
| - } |
| - } |
| - } |
| - return result; |
| + // Don't hoist code from never executed paths. |
| + if (instr->block()->IsDeoptimizing()) return false; |
| + return true; |
| } |
| @@ -4850,6 +4825,7 @@ |
| TypeInfo info = oracle()->UnaryType(expr); |
| if (info.IsUninitialized()) { |
| AddInstruction(new(zone()) HSoftDeoptimize); |
| + current_block()->MarkAsDeoptimizing(); |
| info = TypeInfo::Unknown(); |
| } |
| Representation rep = ToRepresentation(info); |
| @@ -4865,6 +4841,7 @@ |
| TypeInfo info = oracle()->UnaryType(expr); |
| if (info.IsUninitialized()) { |
| AddInstruction(new(zone()) HSoftDeoptimize); |
| + current_block()->MarkAsDeoptimizing(); |
| } |
| HInstruction* instr = new(zone()) HBitNot(value); |
| ast_context()->ReturnInstruction(instr, expr->id()); |
| @@ -5100,6 +5077,7 @@ |
| TypeInfo info = oracle()->BinaryType(expr); |
| if (info.IsUninitialized()) { |
| AddInstruction(new(zone()) HSoftDeoptimize); |
| + current_block()->MarkAsDeoptimizing(); |
| info = TypeInfo::Unknown(); |
| } |
| HInstruction* instr = NULL; |
| @@ -5369,6 +5347,7 @@ |
| // Check if this expression was ever executed according to type feedback. |
| if (type_info.IsUninitialized()) { |
| AddInstruction(new(zone()) HSoftDeoptimize); |
| + current_block()->MarkAsDeoptimizing(); |
| type_info = TypeInfo::Unknown(); |
| } |