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
This commit is contained in:
kmillikin@chromium.org 2011-01-26 10:25:43 +00:00
parent 26a8dc3818
commit 97f09782fa
2 changed files with 15 additions and 11 deletions

View File

@ -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,
} }
} }
// 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) {

View File

@ -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_; }