Hi,
this patch makes ipa-cp to use nonspecialized time as a base for decision about
cloning.  I wonder about the capping - we perhaps want to use sreals further in
the code because time differences can be large (with profile feedback). But I
guess this can be done incrementally - main point of the patch is to update
interfaces from ipa-analysis.

Bootstrapped/regtested x86_64-linux, OK?

Honza

        * ipa-cp.c (perform_estimation_of_a_value): Drop base_time parameter;
        update use of estimate_ipcp_clone_size_and_time.
        (estimate_local_effects): Update use of
        estimate_ipcp_clone_size_and_time and perform_estimation_of_a_value.
        * ipa-inline.h (estimate_ipcp_clone_size_and_time): Update prototype.
        * ipa-inline-analysis.c (estimate_ipcp_clone_size_and_time):
        Return nonspecialized time.
Index: ipa-cp.c
===================================================================
--- ipa-cp.c    (revision 247436)
+++ ipa-cp.c    (working copy)
@@ -2792,16 +2792,16 @@ static void
 perform_estimation_of_a_value (cgraph_node *node, vec<tree> known_csts,
                               vec<ipa_polymorphic_call_context> known_contexts,
                               vec<ipa_agg_jump_function_p> known_aggs_ptrs,
-                              sreal base_time, int removable_params_cost,
+                              int removable_params_cost,
                               int est_move_cost, ipcp_value_base *val)
 {
   int size, time_benefit;
-  sreal time;
+  sreal time, base_time;
   inline_hints hints;
 
   estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts,
                                     known_aggs_ptrs, &size, &time,
-                                    &hints);
+                                    &base_time, &hints);
   base_time -= time;
   if (base_time > 65535)
     base_time = 65535;
@@ -2836,15 +2836,14 @@ estimate_local_effects (struct cgraph_no
   vec<ipa_agg_jump_function> known_aggs;
   vec<ipa_agg_jump_function_p> known_aggs_ptrs;
   bool always_const;
-  sreal base_time = inline_summaries->get (node)->time.to_int ();
   int removable_params_cost;
 
   if (!count || !ipcp_versionable_function_p (node))
     return;
 
   if (dump_file && (dump_flags & TDF_DETAILS))
-    fprintf (dump_file, "\nEstimating effects for %s/%i, base_time: %f.\n",
-            node->name (), node->order, base_time.to_double ());
+    fprintf (dump_file, "\nEstimating effects for %s/%i.\n",
+            node->name (), node->order);
 
   always_const = gather_context_independent_values (info, &known_csts,
                                                    &known_contexts, 
&known_aggs,
@@ -2857,14 +2856,15 @@ estimate_local_effects (struct cgraph_no
     {
       struct caller_statistics stats;
       inline_hints hints;
-      sreal time;
+      sreal time, base_time;
       int size;
 
       init_caller_stats (&stats);
       node->call_for_symbol_thunks_and_aliases (gather_caller_stats, &stats,
                                              false);
       estimate_ipcp_clone_size_and_time (node, known_csts, known_contexts,
-                                        known_aggs_ptrs, &size, &time, &hints);
+                                        known_aggs_ptrs, &size, &time,
+                                        &base_time, &hints);
       time -= devirt_bonus;
       time -= hint_time_bonus (hints);
       time -= removable_params_cost;
@@ -2877,20 +2877,20 @@ estimate_local_effects (struct cgraph_no
       if (size <= 0 || node->local.local)
        {
          info->do_clone_for_all_contexts = true;
-         base_time = time;
 
          if (dump_file)
            fprintf (dump_file, "     Decided to specialize for all "
                     "known contexts, code not going to grow.\n");
        }
-      else if (good_cloning_opportunity_p (node, (base_time - time).to_int (),
+      else if (good_cloning_opportunity_p (node,
+                                          MAX ((base_time - time).to_int (),
+                                               65536),
                                           stats.freq_sum, stats.count_sum,
                                           size))
        {
          if (size + overall_size <= max_new_size)
            {
              info->do_clone_for_all_contexts = true;
-             base_time = time;
              overall_size += size;
 
              if (dump_file)
@@ -2926,7 +2926,7 @@ estimate_local_effects (struct cgraph_no
 
          int emc = estimate_move_cost (TREE_TYPE (val->value), true);
          perform_estimation_of_a_value (node, known_csts, known_contexts,
-                                        known_aggs_ptrs, base_time,
+                                        known_aggs_ptrs,
                                         removable_params_cost, emc, val);
 
          if (dump_file && (dump_flags & TDF_DETAILS))
@@ -2961,7 +2961,7 @@ estimate_local_effects (struct cgraph_no
        {
          known_contexts[i] = val->value;
          perform_estimation_of_a_value (node, known_csts, known_contexts,
-                                        known_aggs_ptrs, base_time,
+                                        known_aggs_ptrs,
                                         removable_params_cost, 0, val);
 
          if (dump_file && (dump_flags & TDF_DETAILS))
@@ -3005,7 +3005,7 @@ estimate_local_effects (struct cgraph_no
              vec_safe_push (ajf->items, item);
 
              perform_estimation_of_a_value (node, known_csts, known_contexts,
-                                            known_aggs_ptrs, base_time,
+                                            known_aggs_ptrs,
                                             removable_params_cost, 0, val);
 
              if (dump_file && (dump_flags & TDF_DETAILS))
Index: ipa-inline.h
===================================================================
--- ipa-inline.h        (revision 247436)
+++ ipa-inline.h        (working copy)
@@ -260,7 +260,8 @@ void estimate_ipcp_clone_size_and_time (
                                        vec<tree>,
                                        vec<ipa_polymorphic_call_context>,
                                        vec<ipa_agg_jump_function_p>,
-                                       int *, sreal *, inline_hints *);
+                                       int *, sreal *, sreal *,
+                                       inline_hints *);
 int estimate_growth (struct cgraph_node *);
 bool growth_likely_positive (struct cgraph_node *, int);
 void inline_merge_summary (struct cgraph_edge *edge);
Index: ipa-inline-analysis.c
===================================================================
--- ipa-inline-analysis.c       (revision 247436)
+++ ipa-inline-analysis.c       (working copy)
@@ -3470,17 +3470,17 @@ estimate_ipcp_clone_size_and_time (struc
                                   known_contexts,
                                   vec<ipa_agg_jump_function_p> known_aggs,
                                   int *ret_size, sreal *ret_time,
+                                  sreal *ret_nonspec_time,
                                   inline_hints *hints)
 {
   clause_t clause, nonspec_clause;
-  sreal nonspec_time;
 
   evaluate_conditions_for_known_args (node, false, known_vals, known_aggs,
                                      &clause, &nonspec_clause);
   estimate_node_size_and_time (node, clause, nonspec_clause,
                               known_vals, known_contexts,
                               known_aggs, ret_size, NULL, ret_time,
-                              &nonspec_time, hints, vNULL);
+                              ret_nonspec_time, hints, vNULL);
 }
 
 /* Translate all conditions from callee representation into caller

Reply via email to