This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix the LOOP_BRANCH prediction
- From: Dehao Chen <dehao at google dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Jan Hubicka <hubicka at ucw dot cz>, David Li <davidxl at google dot com>
- Date: Tue, 31 Jul 2012 11:17:39 +0800
- Subject: [PATCH] Fix the LOOP_BRANCH prediction
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 <dehao@google.com>
* predict.c (predict_loops): Fix the prediction of LOOP_BRANCH.
gcc/testsuite/ChangeLog
2012-07-31 Dehao Chen <dehao@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)