Revert r185948, which causes regression to major applications. Bootstrapped.
OK for google-4_6? Thanks, Dehao Index: gcc/testsuite/gcc.dg/predict-3.c =================================================================== --- gcc/testsuite/gcc.dg/predict-3.c (revision 186128) +++ gcc/testsuite/gcc.dg/predict-3.c (working copy) @@ -10,16 +10,10 @@ int i, ret = 0; for (i = 0; i <= bound; i++) { - if (i < bound - 2) - global += bar (i); - if (i <= bound) - global += bar (i); - if (i + 1 < bound) - global += bar (i); if (i != bound) global += bar (i); } } -/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 100.0%" 4 "profile_estimate"} } */ +/* { dg-final { scan-tree-dump "loop iv compare heuristics" "profile_estimate"} } */ /* { dg-final { cleanup-tree-dump "profile_estimate" } } */ Index: gcc/testsuite/gcc.dg/predict-4.c =================================================================== --- gcc/testsuite/gcc.dg/predict-4.c (revision 186128) +++ gcc/testsuite/gcc.dg/predict-4.c (working copy) @@ -15,5 +15,5 @@ } } -/* { dg-final { scan-tree-dump "loop iv compare heuristics: 50.0%" "profile_estimate"} } */ +/* { dg-final { scan-tree-dump "loop iv compare heuristics" "profile_estimate"} } */ /* { dg-final { cleanup-tree-dump "profile_estimate" } } */ Index: gcc/testsuite/gcc.dg/predict-1.c =================================================================== --- gcc/testsuite/gcc.dg/predict-1.c (revision 186128) +++ gcc/testsuite/gcc.dg/predict-1.c (working copy) @@ -10,18 +10,10 @@ int i, ret = 0; for (i = 0; i < bound; i++) { - if (i > bound) - global += bar (i); - if (i >= bound + 2) - global += bar (i); if (i > bound - 2) global += bar (i); - if (i + 2 > bound) - global += bar (i); - if (i == 10) - global += bar (i); } } -/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 0.0%" 5 "profile_estimate"} } */ +/* { dg-final { scan-tree-dump "loop iv compare heuristics" "profile_estimate"} } */ /* { dg-final { cleanup-tree-dump "profile_estimate" } } */ Index: gcc/testsuite/gcc.dg/predict-5.c =================================================================== --- gcc/testsuite/gcc.dg/predict-5.c (revision 186128) +++ gcc/testsuite/gcc.dg/predict-5.c (working copy) @@ -1,25 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ - -extern int global; - -int bar (int); - -void foo (int base, int bound) -{ - int i, ret = 0; - for (i = base; i <= bound; i++) - { - if (i > base) - global += bar (i); - if (i > base + 1) - global += bar (i); - if (i >= base + 3) - global += bar (i); - if (i - 2 >= base) - global += bar (i); - } -} - -/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 100.0%" 4 "profile_estimate"} } */ -/* { dg-final { cleanup-tree-dump "profile_estimate" } } */ Index: gcc/testsuite/gcc.dg/predict-2.c =================================================================== --- gcc/testsuite/gcc.dg/predict-2.c (revision 186128) +++ gcc/testsuite/gcc.dg/predict-2.c (working copy) @@ -5,20 +5,12 @@ int bar(int); -void foo (int base, int bound) +void foo (int bound) { int i, ret = 0; - for (i = base; i < bound; i++) + for (i = 0; i < bound; i++) { - if (i > bound * bound) - global += bar (i); - if (i > bound + 10) - global += bar (i); - if (i <= bound + 10) - global += bar (i); - if (i > base + 10) - global += bar (i); - if (i < base - 10) + if (i > bound * bound ) global += bar (i); } } Index: gcc/testsuite/gcc.dg/predict-6.c =================================================================== --- gcc/testsuite/gcc.dg/predict-6.c (revision 186128) +++ gcc/testsuite/gcc.dg/predict-6.c (working copy) @@ -1,25 +0,0 @@ -/* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ - -extern int global; - -int bar (int); - -void foo (int base, int bound) -{ - int i, ret = 0; - for (i = base; i <= bound; i++) - { - if (i < base) - global += bar (i); - if (i < base + 1) - global += bar (i); - if (i <= base + 3) - global += bar (i); - if (i - 1 < base) - global += bar (i); - } -} - -/* { dg-final { scan-tree-dump-times "loop iv compare heuristics: 0.0%" 4 "profile_estimate"} } */ -/* { dg-final { cleanup-tree-dump "profile_estimate" } } */ Index: gcc/predict.c =================================================================== --- gcc/predict.c (revision 186128) +++ gcc/predict.c (working copy) @@ -1070,10 +1070,6 @@ bound = get_base_value (bound); if (!bound) return false; - if (TREE_CODE (base) != INTEGER_CST) - base = get_base_value (base); - if (!base) - return false; *loop_invariant = bound; *compare_code = code; @@ -1189,7 +1185,8 @@ return; } - if (!expr_coherent_p(loop_iv_base_var, compare_base)) + if (!expr_coherent_p (loop_bound_var, compare_var) + || loop_iv_base_var != compare_base) return; /* If loop bound, base and compare bound are all constents, we can @@ -1233,52 +1230,34 @@ return; } - if (expr_coherent_p (loop_bound_var, compare_var)) - { - if ((loop_bound_code == LT_EXPR || loop_bound_code == LE_EXPR) - && (compare_code == LT_EXPR || compare_code == LE_EXPR)) - predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); - else if ((loop_bound_code == GT_EXPR || loop_bound_code == GE_EXPR) - && (compare_code == GT_EXPR || compare_code == GE_EXPR)) - predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); - else if (loop_bound_code == NE_EXPR) - { - /* If the loop backedge condition is "(i != bound)", we do - the comparison based on the step of IV: - * step < 0 : backedge condition is like (i > bound) - * step > 0 : backedge condition is like (i < bound) */ - gcc_assert (loop_bound_step != 0); - if (loop_bound_step > 0 - && (compare_code == LT_EXPR - || compare_code == LE_EXPR)) - predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); - else if (loop_bound_step < 0 - && (compare_code == GT_EXPR - || compare_code == GE_EXPR)) - predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); - else - predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, NOT_TAKEN); - } - else - /* The branch is predicted not-taken if loop_bound_code is - opposite with compare_code. */ - predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, NOT_TAKEN); - } - else if (expr_coherent_p (loop_iv_base_var, compare_var)) - { - /* For cases like: - for (i = s; i < h; i++) - if (i > s + 2) .... - The branch should be predicted taken. */ + if ((loop_bound_code == LT_EXPR || loop_bound_code == LE_EXPR) + && (compare_code == LT_EXPR || compare_code == LE_EXPR)) + predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); + else if ((loop_bound_code == GT_EXPR || loop_bound_code == GE_EXPR) + && (compare_code == GT_EXPR || compare_code == GE_EXPR)) + predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); + else if (loop_bound_code == NE_EXPR) + { + /* If the loop backedge condition is "(i != bound)", we do + the comparison based on the step of IV: + * step < 0 : backedge condition is like (i > bound) + * step > 0 : backedge condition is like (i < bound) */ + gcc_assert (loop_bound_step != 0); if (loop_bound_step > 0 - && (compare_code == GT_EXPR || compare_code == GE_EXPR)) + && (compare_code == LT_EXPR + || compare_code == LE_EXPR)) predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); else if (loop_bound_step < 0 - && (compare_code == LT_EXPR || compare_code == LE_EXPR)) + && (compare_code == GT_EXPR + || compare_code == GE_EXPR)) predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, TAKEN); else predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, NOT_TAKEN); } + else + /* The branch is predicted not-taken if loop_bound_code is + opposite with compare_code. */ + predict_edge_def (then_edge, PRED_LOOP_IV_COMPARE, NOT_TAKEN); } /* Predict edge probabilities by exploiting loop structure. */