From 4661839ee33dff6b43625e9e69fd9a74830556b4 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 12 Jul 2016 17:27:36 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/cfgloopanal.c | 9 ++++----- gcc/doc/invoke.texi | 3 +++ gcc/params.def | 5 +++++ gcc/tree-ssa-loop-ivopts.c | 7 +++---- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 982ba69fb70..03040052fb3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-07-12 Martin Liska + + * 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 PR middle-end/71700 diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c index c1639869278..2739f44a3a6 100644 --- a/gcc/cfgloopanal.c +++ b/gcc/cfgloopanal.c @@ -241,10 +241,9 @@ expected_loop_iterations_unbounded (const struct loop *loop, if (read_profile_p) *read_profile_p = false; - /* Average loop rolls about 3 times. If we have no profile at all, it is - best we can do. */ + /* If we have no profile at all, use AVG_LOOP_NITER. */ 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) { gcov_type count_in, count_latch; @@ -282,9 +281,9 @@ expected_loop_iterations_unbounded (const struct loop *loop, 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) - expected = 3; + expected = PARAM_VALUE (PARAM_AVG_LOOP_NITER); else expected = freq_latch * 2; } diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 997faa15b6e..88fff0581f8 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 when adding a new one. +@item avg-loop-niter +Average number of iterations of a loop. + @item scev-max-expr-size Bound on size of expressions used in the scalar evolutions analyzer. Large expressions slow the analyzer. diff --git a/gcc/params.def b/gcc/params.def index 894b7f31a00..b86d592d81d 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -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.", 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, "scev-max-expr-size", "Bound on size of expressions used in the scalar evolutions analyzer.", diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index f5f6e78bff0..20cf9ef0279 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -115,8 +115,6 @@ along with GCC; see the file COPYING3. If not see /* The infinite cost. */ #define INFTY 10000000 -#define AVG_LOOP_NITER(LOOP) 5 - /* Returns the expected number of loop iterations for LOOP. The average trip count is computed from profile data if it exists. */ @@ -128,8 +126,9 @@ avg_loop_niter (struct loop *loop) if (niter == -1) { 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; -- 2.30.2