I've updated the patch to fix a bug in dump_inline_decision.

Thanks,
Dehao

On Thu, Dec 1, 2011 at 9:59 AM, Dehao Chen <de...@google.com> wrote:
>
> This patch is for google-{main|gcc_4.6} only.
>
> Tested with bootstrap and regression tests.
>
> Dump inline decisions, also output the inline chain.
>
> Dehao
>
> 2011-12-01  Dehao Chen  <de...@google.com>
>
>        * ipa-inline.c (dump_inline_decision): New function.
>        (inline_small_functions): Use it to dump the inline decisions to 
> stderr.
>
> Index: gcc/ipa-inline.c
> ===================================================================
> --- gcc/ipa-inline.c    (revision 181835)
> +++ gcc/ipa-inline.c    (working copy)
> @@ -1377,6 +1377,45 @@
>  }
>
>
> +/* Dump the inline decision of EDGE to stderr.  */
> +
> +static void
> +dump_inline_decision (struct cgraph_edge *edge)
> +{
> +  location_t locus;
> +  size_t buf_size = 4096;
> +  size_t current_string_len = 0;
> +  char *buf = (char *) xmalloc (buf_size);
> +  struct cgraph_node *inlined_to;
> +  gcov_type callee_count = edge->callee->count;
> +  buf[0] = 0;
> +  if (edge->inline_failed == CIF_OK && edge->callee->clone_of)
> +    callee_count += edge->callee->clone_of->count;
> +  for (inlined_to = edge->caller->global.inlined_to;
> +       inlined_to; inlined_to = inlined_to->global.inlined_to)
> +    {
> +      const char *name = cgraph_node_name (inlined_to);
> +      if (!name)
> +       name = "unknown";
> +      current_string_len += (strlen (name) + 4);
> +      while (current_string_len >= buf_size)
> +       {
> +         buf_size *= 2;
> +         buf = (char *) xrealloc (buf, buf_size);
> +       }
> +      strcat (buf, "-->");
> +      strcat (buf, name);
> +    }
> +  locus = gimple_location (edge->call_stmt);
> +  inform (locus, "%s ("HOST_WIDEST_INT_PRINT_DEC") --"
> +         HOST_WIDEST_INT_PRINT_DEC"--> %s ("
> +         HOST_WIDEST_INT_PRINT_DEC") %s : %s",
> +         cgraph_node_name (edge->callee), callee_count, edge->count,
> +         cgraph_node_name (edge->caller), edge->caller->count, buf,
> +         edge->inline_failed == CIF_OK ? "INLINED": "IGNORED");
> +}
> +
> +
>  /* We use greedy algorithm for inlining of small functions:
>    All inline candidates are put into prioritized heap ordered in
>    increasing badness.
> @@ -1428,6 +1467,7 @@
>   overall_size = initial_size;
>   max_size = compute_max_insns (overall_size);
>   min_size = overall_size;
> +  edge = NULL;
>
>   /* Populate the heeap with all edges we might inline.  */
>
> @@ -1462,6 +1502,9 @@
>       int current_badness;
>       int growth;
>
> +      if (edge && flag_opt_info >= OPT_INFO_MIN)
> +       dump_inline_decision (edge);
> +
>       edge = (struct cgraph_edge *) fibheap_extract_min (heap);
>       gcc_assert (edge->aux);
>       edge->aux = NULL;
> @@ -1482,6 +1525,7 @@
>       if (current_badness != badness)
>        {
>          edge->aux = fibheap_insert (heap, current_badness, edge);
> +         edge = NULL;
>          continue;
>        }
>
> @@ -1636,6 +1680,8 @@
>            fprintf (dump_file, "New minimal size reached: %i\n", min_size);
>        }
>     }
> +  if (edge && flag_opt_info >= OPT_INFO_MIN)
> +    dump_inline_decision (edge);
>
>   free_growth_caches ();
>   if (new_indirect_edges)

Reply via email to