This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Change num_loop_insns to better match what it has been doing before VTA merge
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Richard Guenther <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org, Alexandre Oliva <aoliva at redhat dot com>
- Date: Wed, 30 Sep 2009 11:53:24 +0200
- Subject: [PATCH] Change num_loop_insns to better match what it has been doing before VTA merge
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
While looking at 252.eon eon.cc differences on ia64 caused by merge from VTA
branch, I've noticed that some loops are no longer unrolled. The problem is
that num_loop_insns now returns higher number of insns than before and so in
some cases it goes over the limit.
The VTA merge changed:
@@ -176,8 +176,8 @@ num_loop_insns (const struct loop *loop)
{
bb = bbs[i];
ninsns++;
- for (insn = BB_HEAD (bb); insn != BB_END (bb); insn = NEXT_INSN (insn))
- if (INSN_P (insn))
+ FOR_BB_INSNS (bb, insn)
+ if (NONDEBUG_INSN_P (insn))
ninsns++;
}
free(bbs);
The ninsns++ before the loop standed probably for the BB_END (bb) insn that
wasn't counted in the loop. But FOR_BB_INSNS counts it, so after VTA merge
we count number of instructions in the loop plus number of basic blocks.
The following patch changes it to what average_num_loop_insns does, i.e.
don't add one for each bb, just count real insns, and at the end just avoid
returning 0 (because that causes ICs in places where something is divided by
loop->ninsns).
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2009-09-30 Jakub Jelinek <jakub@redhat.com>
PR target/41279
* cfgloopanal.c (num_loop_insns): Don't increment ninsns for each bb
before insn counting loop now that BB_END (bb) is counted. Ensure
the return value isn't zero.
--- gcc/cfgloopanal.c.jj 2009-09-03 09:59:33.000000000 +0200
+++ gcc/cfgloopanal.c 2009-09-30 09:48:35.000000000 +0200
@@ -175,12 +175,14 @@ num_loop_insns (const struct loop *loop)
for (i = 0; i < loop->num_nodes; i++)
{
bb = bbs[i];
- ninsns++;
FOR_BB_INSNS (bb, insn)
if (NONDEBUG_INSN_P (insn))
ninsns++;
}
- free(bbs);
+ free (bbs);
+
+ if (!ninsns)
+ ninsns = 1; /* To avoid division by zero. */
return ninsns;
}
@@ -209,7 +211,7 @@ average_num_loop_insns (const struct loo
: (bb->frequency * BB_FREQ_MAX) / loop->header->frequency;
ninsns += binsns * ratio;
}
- free(bbs);
+ free (bbs);
ninsns /= BB_FREQ_MAX;
if (!ninsns)
Jakub