On Tue, Aug 6, 2013 at 9:01 AM, Martin Jambor <mjam...@suse.cz> wrote:
> Hi,
>
> On Tue, Aug 06, 2013 at 07:14:42AM -0700, Teresa Johnson wrote:
>> On Tue, Aug 6, 2013 at 5:37 AM, Martin Jambor <mjam...@suse.cz> wrote:
>> > On Mon, Aug 05, 2013 at 10:37:00PM -0700, Teresa Johnson wrote:
>> >> This patch ports messages to the new dump framework,
>> >
>> > It would be great this new framework was documented somewhere.  I lost
>> > track of what was agreed it would be and from the uses in the
>> > vectorizer I was never quite sure how to utilize it in other passes.
>>
>> Cc'ing Sharad who implemented this - Sharad, is this documented on a
>> wiki or elsewhere?
>
> Thanks
>
>>
>> >
>> > I'd also like to point out two other minor things inline:
>> >
>> > [...]
>> >
>> >> 2013-08-06  Teresa Johnson  <tejohn...@google.com>
>> >>             Dehao Chen  <de...@google.com>
>> >>
>> >>         * dumpfile.c (dump_loc): Add column number to output, make 
>> >> newlines
>> >>         consistent.
>> >>         * dumpfile.h (OPTGROUP_OTHER): Add and enable under OPTGROUP_ALL.
>> >>         * ipa-inline-transform.c (clone_inlined_nodes):
>> >>         (cgraph_node_opt_info): New function.
>> >>         (cgraph_node_call_chain): Ditto.
>> >>         (dump_inline_decision): Ditto.
>> >>         (inline_call): Invoke dump_inline_decision.
>> >>         * doc/invoke.texi: Document optall -fopt-info flag.
>> >>         * profile.c (read_profile_edge_counts): Use new dump framework.
>> >>         (compute_branch_probabilities): Ditto.
>> >>         * passes.c (pass_manager::register_one_dump_file): Use 
>> >> OPTGROUP_OTHER
>> >>         when pass not in any opt group.
>> >>         * value-prof.c (check_counter): Use new dump framework.
>> >>         (find_func_by_funcdef_no): Ditto.
>> >>         (check_ic_target): Ditto.
>> >>         * coverage.c (get_coverage_counts): Ditto.
>> >>         (coverage_init): Setup new dump framework.
>> >>         * ipa-inline.c (inline_small_functions): Set is_in_ipa_inline.
>> >>         * ipa-inline.h (is_in_ipa_inline): Declare.
>> >>
>> >>         * testsuite/gcc.dg/pr40209.c: Use -fopt-info.
>> >>         * testsuite/gcc.dg/pr26570.c: Ditto.
>> >>         * testsuite/gcc.dg/pr32773.c: Ditto.
>> >>         * testsuite/g++.dg/tree-ssa/dom-invalid.C (struct C): Ditto.
>> >>
>> >
>> > [...]
>> >
>> >> Index: ipa-inline-transform.c
>> >> ===================================================================
>> >> --- ipa-inline-transform.c      (revision 201461)
>> >> +++ ipa-inline-transform.c      (working copy)
>> >> @@ -192,6 +192,108 @@ clone_inlined_nodes (struct cgraph_edge *e, bool d
>> >>  }
>> >>
>> >>
>> >> +#define MAX_INT_LENGTH 20
>> >> +
>> >> +/* Return NODE's name and profile count, if available.  */
>> >> +
>> >> +static const char *
>> >> +cgraph_node_opt_info (struct cgraph_node *node)
>> >> +{
>> >> +  char *buf;
>> >> +  size_t buf_size;
>> >> +  const char *bfd_name = lang_hooks.dwarf_name (node->symbol.decl, 0);
>> >> +
>> >> +  if (!bfd_name)
>> >> +    bfd_name = "unknown";
>> >> +
>> >> +  buf_size = strlen (bfd_name) + 1;
>> >> +  if (profile_info)
>> >> +    buf_size += (MAX_INT_LENGTH + 3);
>> >> +
>> >> +  buf = (char *) xmalloc (buf_size);
>> >> +
>> >> +  strcpy (buf, bfd_name);
>> >> +
>> >> +  if (profile_info)
>> >> +    sprintf (buf, "%s ("HOST_WIDEST_INT_PRINT_DEC")", buf, node->count);
>> >> +  return buf;
>> >> +}
>> >
>> > I'm not sure if output of this function is aimed only at the user or
>> > if it is supposed to be used by gcc developers as well.  If the
>> > latter, an incredibly useful thing is to also dump node->symbol.order
>> > too.  We usually dump it after "/" sign separating it from node name.
>> > It is invaluable when examining decisions in C++ code where you can
>> > have lots of clones of a node (and also because existing dumps print
>> > it, it is easy to combine them).
>>
>> The output is useful for both power users doing performance tuning of
>> their application, and by gcc developers. Adding the id is not so
>> useful for the former, but I agree that it is very useful for compiler
>> developers. In fact, in the google branch version we emit more verbose
>> information (the lipo module id and the funcdef_no) to help uniquely
>> identify the routines and to aid in post-processing by humans and
>> tools. So it is probably useful to add something similar here too. Is
>> the node->symbol.order more or less unique than the funcdef_no? I see
>> that you added a patch a few months ago to print the
>> node->symbol.order in the function header, and it also has the
>> advantage as you note of matching up with existing ipa dumps.
>
> node->symbol.order is unique and if I remember correctly, it is not
> even recycled.  Clones, inline clones, thunks, every symbol table node
> gets its own symbol order so it should be more unique than funcdef_no.
> On the other hand it may be a bit cryptic for users but at the same
> time it is only one number.

Ok, I am going to go ahead and add this to the output.

>
>>
>> >
>> > [...]
>> >
>> >> Index: ipa-inline.c
>> >> ===================================================================
>> >> --- ipa-inline.c        (revision 201461)
>> >> +++ ipa-inline.c        (working copy)
>> >> @@ -118,6 +118,9 @@ along with GCC; see the file COPYING3.  If not see
>> >>  static int overall_size;
>> >>  static gcov_type max_count;
>> >>
>> >> +/* Global variable to denote if it is in ipa-inline pass. */
>> >> +bool is_in_ipa_inline = false;
>> >> +
>> >>  /* Return false when inlining edge E would lead to violating
>> >>     limits on function unit growth or stack usage growth.
>> >>
>> >
>> > In this age of removing global variables, are you sure you need this?
>> > The only user of this seems to be a function that is only being called
>> > from inline_call... can that ever happen when not inlining?  If you
>> > plan to use this function also elsewhere, perhaps the callers will
>> > know whether we are inlining or not and can provide this in a
>> > parameter?
>>
>> This is to distinguish early inlining from ipa inlining.
>
> Oh, right, I did not realize that the IPA part was the important bit
> of the name.
>
>> The volume of
>> early inlining messages is too high to be on for the default setting
>> of -fopt-info, and are not as interesting usually for performance
>> tuning. The dumper will only emit the early inline messages under a
>> more verbose setting (MSG_NOTE):
>>       dump_printf_loc (is_in_ipa_inline ? MSG_OPTIMIZED_LOCATIONS : MSG_NOTE 
>> ...
>> The other way I can see to distinguish this would be to check the
>> always_inline_functions_inlined flag on the caller's function. It
>> could also be possible to pass down a flag from the callers of
>> inline_call, but at least one caller (flatten_functions) is shared
>> between early and late inlining, so the flag needs to be passed
>> through that as well. WDYT?
>
> Did you mean flatten_function?  It already has a bool "early"
> parameter.  But I can see that being able to quickly figure out
> whether we are in early inliner or ipa inliner without much hassle is
> useful enough to justify a global variable a month ago, however I
> suppose we should not be introducing them now and so you'd have to put
> such stuff into... well, you'd probably have to put into the universe
> object somewhere because it is basically shared between two passes.
> Another option, even though somewhat hackish, would be to look at
> current_pass and see which pass it is.  I don't know, do what is
> easier or what you like more, just be aware of the problem.

After thinking about this some more, I think passing down an early
flag from callers is the cleanest way to go.

I'll fix these and post a new patch later today.

Thanks,
Teresa

>
> Thanks,
>
> Martin



-- 
Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413

Reply via email to