On 07/11/2016 04:35 PM, Jeff Law wrote: > Don't you need a corresponding change to invoke.texi? > > OK with that change. > > jeff
Thanks, I've just mentioned the param in invoke.texi, installed as r238252. Martin
>From c4c456c2bea9225c287f7af0e88f39cf780f815d Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Tue, 21 Jun 2016 14:52:31 +0200 Subject: [PATCH] Introduce new param: AVG_LOOP_NITER gcc/ChangeLog: 2016-06-21 Martin Liska <mli...@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. --- gcc/cfgloopanal.c | 9 ++++----- gcc/doc/invoke.texi | 3 +++ gcc/params.def | 5 +++++ gcc/tree-ssa-loop-ivopts.c | 7 +++---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c index c163986..2739f44 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 997faa1..88fff05 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 894b7f3..b86d592 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 f5f6e78..20cf9ef 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.8.4