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(); |
} |