Problem in propagating profiling information through loop unrolling

Jan Hubicka jh@suse.cz
Thu Apr 22 22:12:00 GMT 2004


> 
> Zdenek, Jan,
> I have incorporated your suggestions in the patch below.
> Passed bootstrap on powerpc-apple-darwin7.2.0. I have
> measured the number of times Doloop optimization was
> successful over SPEC2000; following are the results:
> 
>            Before fix         After fix       Diff
> 164.gzip        73              75              2
> 175.vpr         79              83              4
> 176.gcc         378             378             0
> 181.mcf         3               3               0
> 186.crafty      83              85              2
> 197.parser      79              81              2
> 252.eon         0               0               0
> 253.perlbmk     144             145             1
> 254.gap         386             386             0
> 255.vortex      18              18              0
> 256.bzip2       50              51              1
> 300.twolf       69              69              0
> 168.wupwise     23              23              0
> 171.swim        23              30              7
> 172.mgrid       48              48              0
> 173.applu       65              65              0
> 177.mesa        619             620             1
> 178.galgel      532             551             19
> 179.art         46              62              16
> 183.equake      21              22              1
> 187.facerec     126             126             0
> 188.ammp        24              24              0
> 189.lucas       33              33              0
> 191.fma3d       0               0               0
> 200.sixtrack    39              39              0
> 301.apsi        206             206             0
> 
> Total                                           56
> 
> If this is OK for mainline, can anybody commit it?
> 
> ChangeLog
> 
> 2004-04-21 Mostafa Hagog <mustafa@il.ibm.com>
>       * cfgloopmanip.c (scale_bbs_frequencies): Use RDIV macro
>       * cfgloopanal.c (expected_loop_iterations): Change the return value

Thanks,  I've bootstrapped/regtested the change and installed it as
obvious (I've run across this problem once already and I don't want to
get it forgotten again as it solves problems in some of my other
experiments).

I've modified the patch slightly to watch the overflows and increase the
loop iterations.

Index: cfgloopanal.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgloopanal.c,v
retrieving revision 1.23
diff -c -3 -p -r1.23 cfgloopanal.c
*** cfgloopanal.c	18 Mar 2004 16:42:30 -0000	1.23
--- cfgloopanal.c	21 Apr 2004 13:00:19 -0000
*************** expected_loop_iterations (const struct l
*** 431,439 ****
  	  count_in += e->count;
  
        if (count_in == 0)
! 	return 0;
! 
!       expected = (count_latch + count_in - 1) / count_in;
  
        /* Avoid overflows.  */
        return (expected > REG_BR_PROB_BASE ? REG_BR_PROB_BASE : expected);
--- 431,439 ----
  	  count_in += e->count;
  
        if (count_in == 0)
!         expected = count_latch * 2;
!       else
!         expected = (count_latch + count_in - 1) / count_in;
  
        /* Avoid overflows.  */
        return (expected > REG_BR_PROB_BASE ? REG_BR_PROB_BASE : expected);
*************** expected_loop_iterations (const struct l
*** 452,458 ****
  	  freq_in += EDGE_FREQUENCY (e);
  
        if (freq_in == 0)
! 	return 0;
  
        return (freq_latch + freq_in - 1) / freq_in;
      }
--- 452,458 ----
  	  freq_in += EDGE_FREQUENCY (e);
  
        if (freq_in == 0)
! 	return freq_latch * 2;
  
        return (freq_latch + freq_in - 1) / freq_in;
      }
Index: cfgloopmanip.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cfgloopmanip.c,v
retrieving revision 1.23
diff -c -3 -p -r1.23 cfgloopmanip.c
*** cfgloopmanip.c	24 Feb 2004 23:39:54 -0000	1.23
--- cfgloopmanip.c	21 Apr 2004 13:00:19 -0000
*************** static void scale_bbs_frequencies (basic
*** 50,55 ****
--- 50,57 ----
  static basic_block create_preheader (struct loop *, int);
  static void fix_irreducible_loops (basic_block);
  
+ #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
+ 
  /* Splits basic block BB after INSN, returns created edge.  Updates loops
     and dominators.  */
  edge
*************** scale_bbs_frequencies (basic_block *bbs,
*** 458,464 ****
    for (i = 0; i < nbbs; i++)
      {
        bbs[i]->frequency = (bbs[i]->frequency * num) / den;
!       bbs[i]->count = (bbs[i]->count * num) / den;
        for (e = bbs[i]->succ; e; e = e->succ_next)
  	e->count = (e->count * num) /den;
      }
--- 460,466 ----
    for (i = 0; i < nbbs; i++)
      {
        bbs[i]->frequency = (bbs[i]->frequency * num) / den;
!       bbs[i]->count = RDIV (bbs[i]->count * num, den);
        for (e = bbs[i]->succ; e; e = e->succ_next)
  	e->count = (e->count * num) /den;
      }
*************** can_duplicate_loop_p (struct loop *loop)
*** 812,818 ****
    return ret;
  }
  
- #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
  
  /* Duplicates body of LOOP to given edge E NDUPL times.  Takes care of updating
     LOOPS structure and dominators.  E's destination must be LOOP header for
--- 814,819 ----



More information about the Gcc mailing list