diff options
author | Jan Hubicka <jh@suse.cz> | 2005-08-03 15:34:49 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-08-03 13:34:49 +0000 |
commit | 178df94ff18a589455749496b4cd6888feb567b0 (patch) | |
tree | 1a926b9bc202452ffb1c89f9db59da5c72ea357e /gcc/cfgloopmanip.c | |
parent | 4164b2fb1628493c3b529b1e9ee045a504f44a0e (diff) | |
download | gcc-178df94ff18a589455749496b4cd6888feb567b0.zip gcc-178df94ff18a589455749496b4cd6888feb567b0.tar.gz gcc-178df94ff18a589455749496b4cd6888feb567b0.tar.bz2 |
cfgloop.h (DLTHE_FLAG_COMPLETTE_PEEL): New flag.
* cfgloop.h (DLTHE_FLAG_COMPLETTE_PEEL): New flag.
* cfgloopmanip.c (duplicate_loop_to_header_edge): Special case
profile updating for complette unrolling.
* loop-unroll.c (peel_loop_completely): Use it.
* tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Likewise.
(tree_unroll_loops_completely): Disable code growing unrolling of cold
loops.
* update-conroll.c: New testcase.
* update-conroll-2.c: New testcase.
From-SVN: r102687
Diffstat (limited to 'gcc/cfgloopmanip.c')
-rw-r--r-- | gcc/cfgloopmanip.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index 648e837..1e36427 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -913,7 +913,28 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops, ? prob_pass_wont_exit : prob_pass_thru; - if (is_latch) + /* Complette peeling is special as the probability of exit in last + copy becomes 1. */ + if (flags & DLTHE_FLAG_COMPLETTE_PEEL) + { + int wanted_freq = EDGE_FREQUENCY (e); + + if (wanted_freq > freq_in) + wanted_freq = freq_in; + + gcc_assert (!is_latch); + /* First copy has frequency of incomming edge. Each subseqeuent + frequency should be reduced by prob_pass_wont_exit. Caller + should've managed the flags so all except for original loop + has won't exist set. */ + scale_act = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in); + /* Now simulate the duplication adjustments and compute header + frequency of the last copy. */ + for (i = 0; i < ndupl; i++) + wanted_freq = RDIV (wanted_freq * scale_step[i], REG_BR_PROB_BASE); + scale_main = RDIV (wanted_freq * REG_BR_PROB_BASE, freq_in); + } + else if (is_latch) { prob_pass_main = TEST_BIT (wont_exit, 0) ? prob_pass_wont_exit |