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

Reply via email to