Introduce new param: AVG_LOOP_NITER

* params.def: Add avg-loop niter.
	* tree-ssa-loop-ivopts.c (avg_loop_niter): Use the param.
	* cfgloopanal.c (expected_loop_iterations_unbounded): Likewise.
	* doc/invoke.texi: Document the new parameter.

From-SVN: r238252
This commit is contained in:
Martin Liska 2016-07-12 17:27:36 +02:00 committed by Martin Liska
parent f507d20235
commit 4661839ee3
5 changed files with 22 additions and 9 deletions

View File

@ -1,3 +1,10 @@
2016-07-12 Martin Liska <mliska@suse.cz>
* params.def: Add avg-loop niter.
* tree-ssa-loop-ivopts.c (avg_loop_niter): Use the param.
* cfgloopanal.c (expected_loop_iterations_unbounded): Likewise.
* doc/invoke.texi: Document the new parameter.
2016-07-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2016-07-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR middle-end/71700 PR middle-end/71700

View File

@ -241,10 +241,9 @@ expected_loop_iterations_unbounded (const struct loop *loop,
if (read_profile_p) if (read_profile_p)
*read_profile_p = false; *read_profile_p = false;
/* Average loop rolls about 3 times. If we have no profile at all, it is /* If we have no profile at all, use AVG_LOOP_NITER. */
best we can do. */
if (profile_status_for_fn (cfun) == PROFILE_ABSENT) if (profile_status_for_fn (cfun) == PROFILE_ABSENT)
expected = 3; expected = PARAM_VALUE (PARAM_AVG_LOOP_NITER);
else if (loop->latch->count || loop->header->count) else if (loop->latch->count || loop->header->count)
{ {
gcov_type count_in, count_latch; gcov_type count_in, count_latch;
@ -282,9 +281,9 @@ expected_loop_iterations_unbounded (const struct loop *loop,
if (freq_in == 0) if (freq_in == 0)
{ {
/* If we have no profile at all, expect 3 iterations. */ /* If we have no profile at all, use AVG_LOOP_NITER iterations. */
if (!freq_latch) if (!freq_latch)
expected = 3; expected = PARAM_VALUE (PARAM_AVG_LOOP_NITER);
else else
expected = freq_latch * 2; expected = freq_latch * 2;
} }

View File

@ -9150,6 +9150,9 @@ If the number of candidates in the set is smaller than this value,
always try to remove unnecessary ivs from the set always try to remove unnecessary ivs from the set
when adding a new one. when adding a new one.
@item avg-loop-niter
Average number of iterations of a loop.
@item scev-max-expr-size @item scev-max-expr-size
Bound on size of expressions used in the scalar evolutions analyzer. Bound on size of expressions used in the scalar evolutions analyzer.
Large expressions slow the analyzer. Large expressions slow the analyzer.

View File

@ -527,6 +527,11 @@ DEFPARAM(PARAM_IV_ALWAYS_PRUNE_CAND_SET_BOUND,
"If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization.", "If number of candidates in the set is smaller, we always try to remove unused ivs during its optimization.",
10, 0, 0) 10, 0, 0)
DEFPARAM(PARAM_AVG_LOOP_NITER,
"avg-loop-niter",
"Average number of iterations of a loop.",
10, 1, 0)
DEFPARAM(PARAM_SCEV_MAX_EXPR_SIZE, DEFPARAM(PARAM_SCEV_MAX_EXPR_SIZE,
"scev-max-expr-size", "scev-max-expr-size",
"Bound on size of expressions used in the scalar evolutions analyzer.", "Bound on size of expressions used in the scalar evolutions analyzer.",

View File

@ -115,8 +115,6 @@ along with GCC; see the file COPYING3. If not see
/* The infinite cost. */ /* The infinite cost. */
#define INFTY 10000000 #define INFTY 10000000
#define AVG_LOOP_NITER(LOOP) 5
/* Returns the expected number of loop iterations for LOOP. /* Returns the expected number of loop iterations for LOOP.
The average trip count is computed from profile data if it The average trip count is computed from profile data if it
exists. */ exists. */
@ -128,8 +126,9 @@ avg_loop_niter (struct loop *loop)
if (niter == -1) if (niter == -1)
{ {
niter = likely_max_stmt_executions_int (loop); niter = likely_max_stmt_executions_int (loop);
if (niter == -1 || niter > AVG_LOOP_NITER (loop))
return AVG_LOOP_NITER (loop); if (niter == -1 || niter > PARAM_VALUE (PARAM_AVG_LOOP_NITER))
return PARAM_VALUE (PARAM_AVG_LOOP_NITER);
} }
return niter; return niter;