more ia32 bugs (unrolling)

Mike Stump mrs@wrs.com
Tue Jun 22 18:59:00 GMT 1999


Ok, here is the next one:

void
rescan () {
  if (fee())
    {
      while (1) {
      }
    }
 
  {
    int newlines = foo();
    while (0 < newlines--)
      bar();
  }
}

is is derived from cccp.c during a bootstrap.  In unroll.c:

  /* If there is a more than a single jump to the top of the loop
     we cannot (easily) determine the iteration count.  */
=>if (LABEL_NUSES (JUMP_LABEL (last_loop_insn)) > 1)
    {
      if (loop_dump_stream)
        fprintf (loop_dump_stream,
                 "Loop iterations: Loop has multiple back edges.\n");
      return 0;
    }

JUMP_LABEL comes up 0.  :-( And we die for it.  In the old compiler,
no such code.  I checked the source out, and this is new code:

revision 1.43
date: 1999/01/15 10:05:56;  author: law;  state: Exp;  lines: +26 -5
8
        * unroll.c (loop_iterations): Return 0 if the last loop insn
        is not a jump insn or if the loop has multiple back edges.

I think there is a bug in that work.  Maybe the below patch is the
right fix, maybe not.  It does make the testcase work.

      * unroll.c (loop_iterations): Don't assume that JUMP_LABEL is set.

Doing diffs in unroll.c.~1~:
*** unroll.c.~1~	Fri Jun 18 15:03:49 1999
--- unroll.c	Tue Jun 22 18:51:14 1999
*************** loop_iterations (loop_start, loop_end, l
*** 3669,3675 ****
  
    /* If there is a more than a single jump to the top of the loop
       we cannot (easily) determine the iteration count.  */
!   if (LABEL_NUSES (JUMP_LABEL (last_loop_insn)) > 1)
      {
        if (loop_dump_stream)
  	fprintf (loop_dump_stream,
--- 3669,3676 ----
  
    /* If there is a more than a single jump to the top of the loop
       we cannot (easily) determine the iteration count.  */
!   if (JUMP_LABEL (last_loop_insn) == 0
!       || LABEL_NUSES (JUMP_LABEL (last_loop_insn)) > 1)
      {
        if (loop_dump_stream)
  	fprintf (loop_dump_stream,
--------------


More information about the Gcc-patches mailing list