This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Change num_loop_insns to better match what it has been doing before VTA merge


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]