On Thu, 29 Mar 2012, Jan Hubicka wrote:
> >
> > I am playing with doing some internal interface static analysis
> > using the first patch below (and looking at LTO bootstrap results).
> >
> > An example, obvious patch resulting from that is the 2nd patch,
> > resuling from the static analysis output
> >
> > /space/rguenther/src/svn/trunk/gcc/tree-ssa-pre.c:add_to_value can be made
> > static
> > /space/rguenther/src/svn/trunk/gcc/tree-ssa-pre.c:print_value_expressions
> > can be made static
> >
> > the static analysis is very verbose (and does not consider ipa-refs yet).
> > You also need to union results for building all frontends and all
> > targets (well, in theory, or you can simply manually verify things
> > which is a good idea anyway - even unused functions may be useful
> > exported when they implement a generic data structure for example).
> >
> > Excercise for the reader: turn the analysis into a plugin.
> >
> > Richard.
> >
> >
> > Index: gcc/lto/lto.c
> > ===================================================================
> > --- gcc/lto/lto.c (revision 185918)
> > +++ gcc/lto/lto.c (working copy)
> > @@ -2721,6 +2721,65 @@ read_cgraph_and_symbols (unsigned nfiles
> > lto_symtab_merge_cgraph_nodes ();
> > ggc_collect ();
> >
> > + if (flag_wpa)
> > + {
> > + struct cgraph_node *node;
> > + FILE *f = fopen (concat (dump_base_name, ".callers", NULL), "w");
> > + for (node = cgraph_nodes; node; node = node->next)
> > + {
> > + tree caller_tu = NULL_TREE;
> > + struct cgraph_edge *caller;
> > + bool found = true;
> > +
> > + if (!TREE_PUBLIC (node->decl)
> > + || !TREE_STATIC (node->decl)
> > + || resolution_used_from_other_file_p (node->resolution))
> > + continue;
> > +
> > + if (!node->callers)
> > + {
> > + expanded_location loc = expand_location (DECL_SOURCE_LOCATION
> > (node->decl));
> > + fprintf (f, "%s:%s no calls\n",
> > + loc.file, IDENTIFIER_POINTER (DECL_NAME (node->decl)));
> > + }
>
> With Mozilla folks I used the dumps from first WPA unreachable function
> removal pass
> with some degree of success. This gets a lot of non-trivial cases of dead
> code,
> but also there are a lot of funny false positives wrt comdats etc.
> > + for (caller = node->callers; caller; caller = caller->next_caller)
> > + {
> > + if (!caller_tu)
> > + caller_tu = DECL_CONTEXT (caller->caller->decl);
> > + else if (caller_tu
> > + && DECL_CONTEXT (caller->caller->decl) != caller_tu)
> > + found = false;
> > + }
> Extending to IPA-REF should be straighforward.
> > + if (found && caller_tu)
> > + {
> > + expanded_location loc1 = expand_location (DECL_SOURCE_LOCATION
> > (node->decl));
> > + expanded_location loc2 = expand_location (DECL_SOURCE_LOCATION
> > (node->callers->caller->decl));
> > +
> > + if (DECL_CONTEXT (node->decl) == caller_tu)
> > + fprintf (f, "%s:%s can be made static\n",
> > + loc1.file, IDENTIFIER_POINTER (DECL_NAME
> > (node->decl)));
> Indeed, this is also useful. Any plans to turn this into general
> -W<something>,
> or you will also stay just with an internal hack like I did? :)
;) The result has way too many false positives (LTO bootstrap produces
quite some dead functions due to early inlining). So yes, this will
stay internal ;)
Richard.