Reviewers: fschneider, Mads Ager,
Description:
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.
Please review this at http://codereview.chromium.org/6378012/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/hydrogen.h
M src/hydrogen.cc
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
7ede51de447c2b8ca623457fcc733b0c11c57671..5d7fdcf9e666733578b87c546a9e93f44f4ca159
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -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;
}
@@ -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,
HBasicBlock* loop_header) {
- if (FLAG_aggressive_loop_invariant_motion &&
- !instr->IsChange() &&
- (!instr->IsCheckInstruction() ||
- graph_->AllowAggressiveOptimizations())) {
+ // If we've disabled code motion, don't move any instructions.
+ if (!graph_->AllowCodeMotion()) return false;
+
+ // 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) {
Index: src/hydrogen.h
diff --git a/src/hydrogen.h b/src/hydrogen.h
index
3524df949524a4835aea6a4ec4ab439b89e51f23..dbcb82e6e8eadb5b625ed81ce27889c6eeb9ac56
100644
--- a/src/hydrogen.h
+++ b/src/hydrogen.h
@@ -297,7 +297,7 @@ class HGraph: public HSubgraph {
CompilationInfo* info() const { return info_; }
- bool AllowAggressiveOptimizations() const;
+ bool AllowCodeMotion() const;
const ZoneList<HBasicBlock*>* blocks() const { return &blocks_; }
const ZoneList<HPhi*>* phi_list() const { return phi_list_; }
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev