Reviewers: Kevin Millikin,
Description:
Perform range analysis after GVN.
This eliminate redundant HChange instructions and allows range information
of
converted values propagated across control-flow splits.
It fixes the performance regression on code like:
if (x > 1) {
y = x - 1;
}
where we should eliminate the overflow check on the sub inside the
if-statement.
Please review this at http://codereview.chromium.org/7709025/
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/
Affected files:
M src/hydrogen.cc
Index: src/hydrogen.cc
===================================================================
--- src/hydrogen.cc (revision 8995)
+++ src/hydrogen.cc (working copy)
@@ -2328,25 +2328,26 @@
graph()->MarkDeoptimizeOnUndefined();
graph()->InsertRepresentationChanges();
+ graph()->InitializeInferredTypes();
+ graph()->Canonicalize();
+
+ // Perform common subexpression elimination and loop-invariant code
motion.
+ if (FLAG_use_gvn) {
+ HPhase phase("Global value numbering", graph());
+ HGlobalValueNumberer gvn(graph(), info());
+ gvn.Analyze();
+ }
+
if (FLAG_use_range) {
HRangeAnalysis rangeAnalysis(graph());
rangeAnalysis.Analyze();
}
- graph()->InitializeInferredTypes();
- graph()->Canonicalize();
graph()->ComputeMinusZeroChecks();
// Eliminate redundant stack checks on backwards branches.
HStackCheckEliminator sce(graph());
sce.Process();
- // Perform common subexpression elimination and loop-invariant code
motion.
- if (FLAG_use_gvn) {
- HPhase phase("Global value numbering", graph());
- HGlobalValueNumberer gvn(graph(), info());
- gvn.Analyze();
- }
-
// Replace the results of check instructions with the original value, if
the
// result is used. This is safe now, since we don't do code motion after
this
// point. It enables better register allocation since the value produced
by
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev