re PR gcov-profile/24487 (Basic block frequencies inaccurate)
authorJan Hubicka <jh@suse.cz>
Mon, 31 Oct 2005 14:48:57 +0000 (15:48 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 31 Oct 2005 14:48:57 +0000 (14:48 +0000)
PR profile/24487
* predict.c (predict_loops): Do not estimate more than
MAX_PRED_LOOP_ITERATIONS in PRED_LOOP_ITERATIONS heuristic.
* predict.def (MAX_PRED_LOOP_ITERATIONS): Define.

From-SVN: r106276

gcc/ChangeLog
gcc/predict.c
gcc/predict.def

index 2f77e79491c12da116d4eee45321f3e56b8472e8..aed015544e277d54c20394725d9ca119a3b38bca 100644 (file)
@@ -1,3 +1,10 @@
+2005-10-31  Jan Hubicka  <jh@suse.cz>
+
+       PR profile/24487
+       * predict.c (predict_loops): Do not estimate more than
+       MAX_PRED_LOOP_ITERATIONS in PRED_LOOP_ITERATIONS heuristic.
+       * predict.def (MAX_PRED_LOOP_ITERATIONS): Define.
+
 2005-10-31  Andrew MacLeod  <amacleod@redhat.com>
        
        PR tree-optimization/19097
index 412af8616e73c5ff5e55b90b851cd7741e408ca1..e2f7262f2850d0cf6a4aeb229e8983ba3ae62c05 100644 (file)
@@ -624,6 +624,8 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
              niter = desc.niter + 1;
              if (niter == 0)        /* We might overflow here.  */
                niter = desc.niter;
+             if (niter > MAX_PRED_LOOP_ITERATIONS)
+               niter = MAX_PRED_LOOP_ITERATIONS;
 
              prob = (REG_BR_PROB_BASE
                      - (REG_BR_PROB_BASE + niter /2) / niter);
@@ -654,13 +656,16 @@ predict_loops (struct loops *loops_info, bool rtlsimpleloops)
                  if (host_integerp (niter, 1)
                      && tree_int_cst_lt (niter,
                                          build_int_cstu (NULL_TREE,
-                                                      REG_BR_PROB_BASE - 1)))
+                                                MAX_PRED_LOOP_ITERATIONS - 1)))
                    {
                      HOST_WIDE_INT nitercst = tree_low_cst (niter, 1) + 1;
-                     probability = (REG_BR_PROB_BASE + nitercst / 2) / nitercst;
+                     probability = ((REG_BR_PROB_BASE + nitercst / 2)
+                                    / nitercst);
                    }
                  else
-                   probability = 1;
+                   probability = ((REG_BR_PROB_BASE
+                                   + MAX_PRED_LOOP_ITERATIONS / 2)
+                                  / MAX_PRED_LOOP_ITERATIONS);
 
                  predict_edge (exits[j], PRED_LOOP_ITERATIONS, probability);
                }
index 997f4d2cc987a765c665f4d8839fe86edaeb761c..fefe2ed3eee50c7acad9b43ea6c624d334f69011 100644 (file)
@@ -58,6 +58,18 @@ DEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS,
 DEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_ALWAYS,
               PRED_FLAG_FIRST_MATCH)
 
+/* For guessed profiles, the loops having unknown number of iterations
+   are predicted to iterate relatively few (10) times at average.
+   For functions containing one loop with large known number of iterations
+   and other loops having unbounded loops we would end up predicting all
+   the other loops cold that is not usually the case.  So we need to artifically
+   flatten the profile.  
+
+   We need to cut the maximal predicted iterations to large enought iterations
+   so the loop appears important, but safely within HOT_BB_COUNT_FRACTION
+   range.  */
+#define MAX_PRED_LOOP_ITERATIONS 100
+
 /* Hints dropped by user via __builtin_expect feature.  */
 DEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY,
               PRED_FLAG_FIRST_MATCH)