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:
parent
011b136ee0
commit
701146a3d7
@ -2328,17 +2328,8 @@ HGraph* HGraphBuilder::CreateGraph() {
|
||||
graph()->MarkDeoptimizeOnUndefined();
|
||||
graph()->InsertRepresentationChanges();
|
||||
|
||||
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) {
|
||||
@ -2347,6 +2338,16 @@ HGraph* HGraphBuilder::CreateGraph() {
|
||||
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
|
||||
// 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
|
||||
|
Loading…
Reference in New Issue
Block a user