Commit 4661839e by Martin Liska Committed by Martin Liska

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
parent f507d202
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
......
...@@ -241,10 +241,9 @@ expected_loop_iterations_unbounded (const struct loop *loop, ...@@ -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, ...@@ -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;
} }
......
...@@ -9150,6 +9150,9 @@ If the number of candidates in the set is smaller than this value, ...@@ -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.
......
...@@ -527,6 +527,11 @@ DEFPARAM(PARAM_IV_ALWAYS_PRUNE_CAND_SET_BOUND, ...@@ -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.",
......
...@@ -115,8 +115,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -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) ...@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment