From 37261a5c97f0844da609767d0e5f4dfb748dc6e3 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Mon, 29 Aug 2005 09:13:06 +0200 Subject: [PATCH] re PR tree-optimization/23475 (Frequences are not updated for empty loop removal) PR tree-optimization/23475 * tree-ssa-loop-ivcanon.c (remove_empty_loop): Update frequencies and counts. From-SVN: r103593 --- gcc/ChangeLog | 6 ++++++ gcc/tree-ssa-loop-ivcanon.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b2297dd2981..1a2068fad06 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-08-29 Zdenek Dvorak + + PR tree-optimization/23475 + * tree-ssa-loop-ivcanon.c (remove_empty_loop): Update frequencies + and counts. + 2005-08-28 Daniel Berlin Fix PR middle-end/22455 diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index 1788c33e037..9b818b215f2 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -491,9 +491,16 @@ empty_loop_p (struct loop *loop) static void remove_empty_loop (struct loop *loop) { - edge exit = single_dom_exit (loop); + edge exit = single_dom_exit (loop), non_exit; tree cond_stmt = last_stmt (exit->src); tree do_exit; + basic_block *body; + unsigned n_before, freq_in, freq_h; + gcov_type exit_count = exit->count; + + non_exit = EDGE_SUCC (exit->src, 0); + if (non_exit == exit) + non_exit = EDGE_SUCC (exit->src, 1); if (exit->flags & EDGE_TRUE_VALUE) do_exit = boolean_true_node; @@ -502,6 +509,34 @@ remove_empty_loop (struct loop *loop) COND_EXPR_COND (cond_stmt) = do_exit; update_stmt (cond_stmt); + + /* Let us set the probabilities of the edges coming from the exit block. */ + exit->probability = REG_BR_PROB_BASE; + non_exit->probability = 0; + non_exit->count = 0; + + /* Update frequencies and counts. Everything before + the exit needs to be scaled FREQ_IN/FREQ_H times, + where FREQ_IN is the frequency of the entry edge + and FREQ_H is the frequency of the loop header. + Everything after the exit has zero frequency. */ + freq_h = loop->header->frequency; + freq_in = EDGE_FREQUENCY (loop_preheader_edge (loop)); + if (freq_h != 0) + { + body = get_loop_body_in_dom_order (loop); + for (n_before = 1; n_before <= loop->num_nodes; n_before++) + if (body[n_before - 1] == exit->src) + break; + scale_bbs_frequencies_int (body, n_before, freq_in, freq_h); + scale_bbs_frequencies_int (body + n_before, loop->num_nodes - n_before, + 0, 1); + free (body); + } + + /* Number of executions of exit is not changed, thus we need to restore + the original value. */ + exit->count = exit_count; } /* Removes LOOP if it is empty. Returns true if LOOP is removed. CHANGED