More profile updating clenaups

This patch commonizes loop_count_in computatoin with
expected_loop_iterations_by_profile (and moves it to cfgloopanal.cc rather than
manip) and fixes roundoff error in scale_loop_profile.  I alos noticed that
I managed to misapply the template change to gcc.dg/unroll-1.c.

Bootstrapped/regtested x86_64-linux, comitted.

gcc/ChangeLog:

	* cfgloop.h (loop_count_in): Declare.
	* cfgloopanal.cc (expected_loop_iterations_by_profile): Use count_in.
	(loop_count_in): Move here from ...
	* cfgloopmanip.cc (loop_count_in): ... here.
	(scale_loop_profile): Improve dumping; cast iteration bound to sreal.

gcc/testsuite/ChangeLog:

	* gcc.dg/unroll-1.c: Fix template.
This commit is contained in:
Jan Hubicka 2023-08-02 09:44:06 +02:00
parent 2e93b92c1e
commit b278d3080e
4 changed files with 32 additions and 51 deletions

View file

@ -922,6 +922,7 @@ extern bool get_max_loop_iterations (const class loop *loop, widest_int *nit);
extern bool get_likely_max_loop_iterations (class loop *loop, widest_int *nit);
extern int bb_loop_depth (const_basic_block);
extern edge single_dom_exit (class loop *);
extern profile_count loop_count_in (const class loop *loop);
/* Converts VAL to widest_int. */

View file

@ -233,6 +233,33 @@ average_num_loop_insns (const class loop *loop)
return ret;
}
/* Compute how many times loop is entered. */
profile_count
loop_count_in (const class loop *loop)
{
/* Compute number of invocations of the loop. */
profile_count count_in = profile_count::zero ();
edge e;
edge_iterator ei;
bool found_latch = false;
if (loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES))
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (!flow_bb_inside_loop_p (loop, e->src))
count_in += e->count ();
else
found_latch = true;
else
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->src != loop->latch)
count_in += e->count ();
else
found_latch = true;
gcc_checking_assert (found_latch);
return count_in;
}
/* Return true if BB profile can be used to determine the expected number of
iterations (that is number of executions of latch edge(s) for each
entry of the loop. If this is the case initialize RET with the number
@ -260,26 +287,7 @@ expected_loop_iterations_by_profile (const class loop *loop, sreal *ret,
|| !header_count.nonzero_p ())
return false;
profile_count count_in = profile_count::zero ();
edge e;
edge_iterator ei;
/* For single-latch loops avoid querying dominators. */
if (loop->latch)
{
bool found = false;
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->src != loop->latch)
count_in += e->count ();
else
found = true;
/* If latch is not found, loop is inconsistent. */
gcc_checking_assert (found);
}
else
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (!dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
count_in += e->count ();
profile_count count_in = loop_count_in (loop);
bool known;
/* Number of iterations is number of executions of latch edge. */

View file

@ -525,33 +525,6 @@ scale_dominated_blocks_in_loop (class loop *loop, basic_block bb,
}
}
/* Compute how many times loop is entered. */
profile_count
loop_count_in (class loop *loop)
{
/* Compute number of invocations of the loop. */
profile_count count_in = profile_count::zero ();
edge e;
edge_iterator ei;
bool found_latch = false;
if (loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES))
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (!flow_bb_inside_loop_p (loop, e->src))
count_in += e->count ();
else
found_latch = true;
else
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->src != loop->latch)
count_in += e->count ();
else
found_latch = true;
gcc_checking_assert (found_latch);
return count_in;
}
/* Return exit that suitable for update when loop iterations
changed. */
@ -739,14 +712,14 @@ scale_loop_profile (class loop *loop, profile_probability p,
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file,
";; guessed iterations of loop %i:%f new upper bound %i:\n",
";; Guessed iterations of loop %i is %f. New upper bound %i.\n",
loop->num,
iterations.to_double (),
(int)iteration_bound);
}
/* See if loop is predicted to iterate too many times. */
if (iterations <= iteration_bound)
if (iterations <= (sreal)iteration_bound)
return;
profile_count count_in = loop_count_in (loop);

View file

@ -1,6 +1,6 @@
/* PR optimization/8599 */
/* { dg-do run } */
/* { dg-options "-O2 -funroll-loops" } */
/* { dg-options "-O2 -funroll-loops -fdump-rtl-loop2_unroll-details-blocks" } */
/* { dg-options "-mtune=k6 -O2 -funroll-loops -fdump-rtl-loop2_unroll-details-blocks" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
@ -26,4 +26,3 @@ int main()
return 0;
}
/* { dg-final { scan-rtl-dump-not "Invalid sum" "loop2_unroll" } } */
/* { dg-final { scan-rtl-dump-not "Invalid sum" "loop2_unroll" } } */