 Chromium Code Reviews
 Chromium Code Reviews Issue 7003087:
  Simplify the check when to perform loop invariant code motion.  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
    
  
    Issue 7003087:
  Simplify the check when to perform loop invariant code motion.  (Closed) 
  Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/| 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(); | 
| } |