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.
Review URL: http://codereview.chromium.org/7709025

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8997 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
fschneider@chromium.org 2011-08-23 11:19:08 +00:00
parent 011b136ee0
commit 701146a3d7

View File

@ -2328,17 +2328,8 @@ HGraph* HGraphBuilder::CreateGraph() {
graph()->MarkDeoptimizeOnUndefined(); graph()->MarkDeoptimizeOnUndefined();
graph()->InsertRepresentationChanges(); graph()->InsertRepresentationChanges();
if (FLAG_use_range) {
HRangeAnalysis rangeAnalysis(graph());
rangeAnalysis.Analyze();
}
graph()->InitializeInferredTypes(); graph()->InitializeInferredTypes();
graph()->Canonicalize(); 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. // Perform common subexpression elimination and loop-invariant code motion.
if (FLAG_use_gvn) { if (FLAG_use_gvn) {
@ -2347,6 +2338,16 @@ HGraph* HGraphBuilder::CreateGraph() {
gvn.Analyze(); gvn.Analyze();
} }
if (FLAG_use_range) {
HRangeAnalysis rangeAnalysis(graph());
rangeAnalysis.Analyze();
}
graph()->ComputeMinusZeroChecks();
// Eliminate redundant stack checks on backwards branches.
HStackCheckEliminator sce(graph());
sce.Process();
// Replace the results of check instructions with the original value, if the // 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 // 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 // point. It enables better register allocation since the value produced by