Disable all code motion on the final optimization attempt.

Before, we disabled code motion for check instructions on the final
optimization attempt.  It is unsafe to prevent movement of check
instructions but to allow movement of instructions that assume the checks
were performed.

Review URL: http://codereview.chromium.org/6378012

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6485 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 26a8dc38
...@@ -684,7 +684,7 @@ HGraph::HGraph(CompilationInfo* info) ...@@ -684,7 +684,7 @@ HGraph::HGraph(CompilationInfo* info)
} }
bool HGraph::AllowAggressiveOptimizations() const { bool HGraph::AllowCodeMotion() const {
return info()->shared_info()->opt_count() + 1 < Compiler::kDefaultMaxOptCount; return info()->shared_info()->opt_count() + 1 < Compiler::kDefaultMaxOptCount;
} }
...@@ -1446,19 +1446,23 @@ void HGlobalValueNumberer::ProcessLoopBlock(HBasicBlock* block, ...@@ -1446,19 +1446,23 @@ void HGlobalValueNumberer::ProcessLoopBlock(HBasicBlock* block,
} }
} }
// 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.
bool HGlobalValueNumberer::ShouldMove(HInstruction* instr, bool HGlobalValueNumberer::ShouldMove(HInstruction* instr,
HBasicBlock* loop_header) { HBasicBlock* loop_header) {
if (FLAG_aggressive_loop_invariant_motion && // If we've disabled code motion, don't move any instructions.
!instr->IsChange() && if (!graph_->AllowCodeMotion()) return false;
(!instr->IsCheckInstruction() ||
graph_->AllowAggressiveOptimizations())) { // If --aggressive-loop-invariant-motion, move everything except change
// instructions.
if (FLAG_aggressive_loop_invariant_motion && !instr->IsChange()) {
return true; 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(); HBasicBlock* block = instr->block();
bool result = true; bool result = true;
if (block != loop_header) { if (block != loop_header) {
......
...@@ -297,7 +297,7 @@ class HGraph: public HSubgraph { ...@@ -297,7 +297,7 @@ class HGraph: public HSubgraph {
CompilationInfo* info() const { return info_; } CompilationInfo* info() const { return info_; }
bool AllowAggressiveOptimizations() const; bool AllowCodeMotion() const;
const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; } const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; }
const ZoneList<HPhi*>* phi_list() const { return phi_list_; } const ZoneList<HPhi*>* phi_list() const { return phi_list_; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment