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()->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
|
||||||
|
Loading…
Reference in New Issue
Block a user