Introduce new param: AVG_LOOP_NITER
authorMartin Liska <mliska@suse.cz>
Tue, 12 Jul 2016 15:27:36 +0000 (17:27 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 12 Jul 2016 15:27:36 +0000 (15:27 +0000)
* 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
gcc/cfgloopanal.c
gcc/doc/invoke.texi
gcc/params.def
gcc/tree-ssa-loop-ivopts.c

index 982ba69fb70df858f3cb5c6ca4a10fb4a95d2838..03040052fb37bde04117bb22d64171d39e13ab00 100644 (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>
 
        PR middle-end/71700
index c16398692788b0407a45e91756bc515db40dd1b5..2739f44a3a62489faa8b9a0c4e7025253cabed1e 100644 (file)
@@ -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;
        }
index 997faa15b6e4e8dc938bad5b8b249f3870598990..88fff0581f857eb6d671c2bb84ebc6c48103406f 100644 (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
 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.
index 894b7f31a00c8c3b545def7d999f8e06f2b23e83..b86d592d81db35fa3c41f640ea25530dd5abdd97 100644 (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.",
         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.",
index f5f6e78bff06b1644249c460a3dcf6cdfbd706a8..20cf9ef0279c3d23c25c94c2513b6d18f66f4010 100644 (file)
@@ -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;