This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] for PR 23475
- From: Zdenek Dvorak <rakdver at atrey dot karlin dot mff dot cuni dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 27 Aug 2005 10:04:22 +0200
- Subject: [patch] for PR 23475
Hello,
this patch implements updating of frequencies after empty loop removal,
which is currently missing. Bootstrapped & regtested on i686.
Zdenek
PR tree-optimization/23475
* tree-ssa-loop-ivcanon.c (remove_empty_loop): Update frequencies
and counts.
Index: tree-ssa-loop-ivcanon.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-loop-ivcanon.c,v
retrieving revision 2.20
diff -c -3 -p -r2.20 tree-ssa-loop-ivcanon.c
*** tree-ssa-loop-ivcanon.c 13 Aug 2005 17:28:40 -0000 2.20
--- tree-ssa-loop-ivcanon.c 27 Aug 2005 08:03:18 -0000
*************** empty_loop_p (struct loop *loop)
*** 491,499 ****
static void
remove_empty_loop (struct loop *loop)
{
! edge exit = single_dom_exit (loop);
tree cond_stmt = last_stmt (exit->src);
tree do_exit;
if (exit->flags & EDGE_TRUE_VALUE)
do_exit = boolean_true_node;
--- 491,506 ----
static void
remove_empty_loop (struct loop *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;
*************** remove_empty_loop (struct loop *loop)
*** 502,507 ****
--- 509,542 ----
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_H/FREQ_IN 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