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