Hi, This patch fixed the problem when a LOOP_EXIT edge for the inner loop happened to target at the LOOP_LATCH of the outer loop. As the outer loop is processed first, the LOOP_BRANCH heuristic is honored (first_match), thus the inner loop's trip count is 0. (The attached unittest demonstrates this).
Bootstrapped and passed gcc regression test. Is it ok for trunk? Thanks, Dehao gcc/ChangeLog 2012-07-30 Dehao Chen <de...@google.com> * predict.c (predict_loops): Fix the prediction of LOOP_BRANCH. gcc/testsuite/ChangeLog 2012-07-31 Dehao Chen <de...@google.com> * gcc.dg/predict-7.c: New test. Index: gcc/testsuite/gcc.dg/predict-7.c =================================================================== --- gcc/testsuite/gcc.dg/predict-7.c (revision 0) +++ gcc/testsuite/gcc.dg/predict-7.c (revision 0) @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-profile_estimate" } */ + +extern int global; + +int bar (int); + +void foo (int base) +{ + int i; + while (global < 10) + for (i = base; i < 10; i++) + bar (i); +} + +/* { dg-final { scan-tree-dump-times "loop branch heuristics" 0 "profile_estimate"} } */ +/* { dg-final { cleanup-tree-dump "profile_estimate" } } */ Index: gcc/predict.c =================================================================== --- gcc/predict.c (revision 189835) +++ gcc/predict.c (working copy) @@ -1404,7 +1404,7 @@ /* Loop branch heuristics - predict an edge back to a loop's head as taken. */ - if (bb == loop->latch) + if (bb == loop->latch && bb->loop_father == loop) { e = find_edge (loop->latch, loop->header); if (e)