Ping.

Thanks,
Sharad
Sharad


On Wed, Sep 5, 2012 at 10:34 AM, Sharad Singhai <sing...@google.com> wrote:
> Ping.
>
> Thanks,
> Sharad
>
> Sharad
>
>
>
>
> On Fri, Aug 24, 2012 at 1:06 AM, Sharad Singhai <sing...@google.com> wrote:
>>
>> Sorry about the delay. Please see comments inline.
>>
>> On Wed, Jul 4, 2012 at 6:33 AM, Richard Guenther
>> <richard.guent...@gmail.com> wrote:
>> > On Tue, Jul 3, 2012 at 11:07 PM, Sharad Singhai <sing...@google.com>
>> > wrote:
>> >> Apologies for the spam. Attempting to resend the patch after shrinking
>> >> it.
>> >>
>> >> I have updated the attached patch to use a new dump message
>> >> classification system for the vectorizer. It currently uses four
>> >> classes, viz, MSG_OPTIMIZED_LOCATIONS, MSG_UNOPTIMIZED_LOCATION,
>> >> MSG_MISSING_OPTIMIZATION, and MSG_NOTE. I have gone through the
>> >> vectorizer passes and have converted each call to fprintf (dump_file,
>> >> ....) to a message classification matching in spirit. Most often, it
>> >> is MSG_OPTIMIZED_LOCATIONS, but occasionally others as well.
>> >>
>> >> For example, the following
>> >>
>> >> if (vect_print_dump_info (REPORT_DETAILS))
>> >>   {
>> >>     fprintf (vect_dump, "niters for prolog loop: ");
>> >>     print_generic_expr (vect_dump, iters, TDF_SLIM);
>> >>   }
>> >>
>> >> gets converted to
>> >>
>> >> if (dump_kind (MSG_OPTIMIZED_LOCATIONS))
>> >>   {
>> >>      dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, vect_location,
>> >>                       "niters for prolog loop: ");
>> >>      dump_generic_expr (MSG_OPTIMIZED_LOCATIONS, TDF_SLIM, iters);
>> >>   }
>> >>
>> >> The asymmetry between the first printf and the second is due to the
>> >> fact that 'vect_print_dump_info (xxx)' prints the location as a
>> >> "side-effect". To preserve the original intent somewhat, I have
>> >> converted the first call within a dump sequence to a dump_printf_loc
>> >> (xxx) which prints the location while the subsequence calls within the
>> >> same conditional get converted to the corresponding plain variants.
>> >
>> > Ok, that looks reasonable.
>> >
>> >> I considered removing the support for alternate dump file, but ended
>> >> up preserving it instead since it is needed for setting the alternate
>> >> dump file to stderr for the case when -fopt-info is given but no dump
>> >> file is available.
>> >>
>> >> The following invocation
>> >> g++ ... -ftree-vectorize -fopt-info=4
>> >>
>> >> dumps *all* available information to stderr. Currently, the opt-info
>> >> level is common to all passes, i.e., a pass can't specify if wants a
>> >> different level of diagnostic info. This can be added as an
>> >> enhancement with a suitable syntax for selecting passes.
>> >>
>> >> I haven't fixed up the documentation/tests but wanted to get some
>> >> feedback about the current state of patch before doing that.
>> >
>> > Some comments / questions.
>> >
>> > +  if (dump_file && (dump_kind & opt_info_flags))
>> > +    {
>> > +      dump_loc (dump_kind, dump_file, loc);
>> > +      print_generic_expr (dump_file, t, dump_flags | extra_dump_flags);
>> > +    }
>> > +
>> > +  if (alt_dump_file && (dump_kind & opt_info_flags))
>> > +    {
>> >
>> > you always test dump_kind against the same opt_info_flags variable.
>> > I would have thought that the alternate dump file has a different
>> > opt_info_flags
>> > setting so I can have -fdump-tree-vect-details -fopt-info=1.  Am I
>> > missing
>> > something?
>>
>> It was an oversight on my part. I have since fixed this. There are two
>> separate flags corresponding to the two types of dump files,
>>
>> pflags ==> pass private dump file
>> alt_flags ==> opt-info dump file
>>
>> > If I do
>> >
>> >> gcc file1.c file2.c -O3 -fdump-tree-vectorize=foo
>> >
>> > what will foo contain afterwards?  I think you need to document the
>> > behavior
>> > when such redirection is used with the compiler-driver feature of
>> > handling
>> > multiple translation units.  Especially the difference (or not
>> > difference) to
>> >
>> >> gcc file1.c -O3 -fdump-tree-vectorize=foo
>> >> gcc file2.c -O3 -fdump-tree-vectorize=foo
>>
>> Yes, the dump file gets overwritten during each invocation. I have
>> noted this in the documentation.
>>
>> > I suppose we do not want to append to foo (but eventually support that
>> > with some alternate syntax?  Like -fdump-tree-vectorize=+foo?)
>>
>> Yes, I agree. We could define a new syntax as you suggested for
>> appending to a dump file. However, this feature can wait for a
>> separate patch.
>>
>> > +
>> > +static void
>> > +set_opt_info (int opt_info_level)
>> > +{
>> >
>> > This function needs a comment.  How do the dump flags translate to
>> > the opt-info flags?  Is this documented anywhere?  I only see
>> >
>> > +/* Different types of dump classifications.  */
>> > +enum dump_msg_kind {
>> > +  MSG_NONE                     = 1 << 0,
>> > +  MSG_OPTIMIZED_LOCATIONS      = 1 << 1,
>> > +  MSG_UNOPTIMIZED_LOCATIONS    = 1 << 2,
>> > +  MSG_MISSED_OPTIMIZATION      = 1 << 3,
>> > +  MSG_NOTE                     = 1 << 4
>> > +};
>>
>> Yes, my mapping was static (pass-agnostic), defined inside the
>> set_opt_info. I
>> have now documented it and revamped it so that -fopt-info is applied
>> to specific passes as explained below.
>>
>> > I suppose the TDF_* flags would all map to
>> >
>> > MSG_OPTIMIZED_LOCATIONS|MSG_UNOPTIMIZED_LOCATIONS|MSG_MISSED_OPTIMIZATION
>> > and only TDF_DETAILS would enable MSG_NOTE?
>>
>> Yes, the mapping is very coarse-grained right now. Currently I have
>> made MSG_* flags an extension of TDF_* flags. This way both kinds of
>> flags can be present in a single word yet still be interpreted by the
>> dumps which are interested in them. TDF_DETAILS gets mapped to a union
>> of all the MSG_* flags. This will allow flags such -fdump-vect-details
>> to continue to work as expected during the transition to the new dump
>> infrastructure. Of coure,  during the transition, we would need to
>> rejigger flags to express the desired behavior.
>>
>> > In the above a flag for MSG_NONE does not make much sense?
>>
>> Removed. It is now implicitly 0.
>>
>> >
>> > How would we map TDF_SCEV?  I suppose we'd add MSG_SCEV for this
>> > (we talked about the possibility of having some special flags for
>> > special passes).
>>
>> Yes, I think this would be necessary. So far, I haven't converted any
>> passes other than vectorization, and I suspect a handful of special
>> case flags would be needed. During the transition, the TDF_* flags are
>> assumed to be an extension of MSG_* flags and things won't break.
>>
>> >
>> > But this also means a linear "opt-info-level" as in
>> >
>> > +static void
>> > +set_opt_info (int opt_info_level)
>> >
>> > may not be a good representation.  Not a pass-ignorant opt_info_flags
>> > value, if you consider -fopt-info=vect,3 (details from the vectorizer
>> > please).
>>
>> Agreed. As I mentioned earlier, I was considering a simple linear view
>> of -fopt-info. However, I understand that making it pass cognizant is
>> certainly better. To this end, I have modified the syntax of
>> -fopt-info somewhat along the lines of -fdump-xxx format. For example,
>>
>> gcc ... -fopt-info-tree-vect-optimized=foo.vect.optimized
>> -fdump-tree-pre-details=stderr ...
>>
>> This would dump info about optimized locations from the vectorizer
>> pass into foo.vect.optimized, and pass dump from the PRE pass on to
>> stderr.
>>
>> >
>> > +}
>> > +
>> > +
>> > +
>> > +DEBUG_FUNCTION void
>> > +dump_combine_stats (int flags)
>> >
>> > debug functions should be called debug_*, please add a comment and
>> > avoid excessive vertical space
>>
>> Fixed.
>>
>> >
>> > Index: tree-pass.h
>> > ===================================================================
>> > --- tree-pass.h (revision 188966)
>> > +++ tree-pass.h (working copy)
>> > @@ -85,7 +85,6 @@ enum tree_dump_index
>> >  #define TDF_CSELIB     (1 << 23)       /* Dump cselib details.  */
>> >  #define TDF_SCEV       (1 << 24)       /* Dump SCEV details.  */
>> >
>> > -
>> >  /* In tree-dump.c */
>> >
>> >  extern char *get_dump_file_name (int);
>> >
>> > please avoid whitespace-only changes (also elsewhere).
>>
>> Fixed.
>>
>> >
>> >  /* Global variables used to communicate with passes.  */
>> >  extern FILE *dump_file;
>> > +extern FILE *alt_dump_file;
>> >  extern int dump_flags;
>> > +extern int opt_info_flags;
>> >
>> > so I expected the primary dump_file to be controlled with dump_flags,
>> > or with a (cached) translation of them to a primary_opt_info_flags.
>>
>> Yes, now I have two sets of flags.
>>
>> >
>> > Index: gimple-pretty-print.h
>> > ===================================================================
>> > --- gimple-pretty-print.h       (revision 188966)
>> > +++ gimple-pretty-print.h       (working copy)
>> > @@ -31,6 +31,6 @@ extern void debug_gimple_seq (gimple_seq);
>> >  extern void print_gimple_seq (FILE *, gimple_seq, int, int);
>> >  extern void print_gimple_stmt (FILE *, gimple, int, int);
>> >  extern void print_gimple_expr (FILE *, gimple, int, int);
>> > -extern void dump_gimple_stmt (pretty_printer *, gimple, int, int);
>> > +extern void print_gimple_stmt_1 (pretty_printer *, gimple, int, int);
>> >
>> > I'd call this pp_gimple_stmt instead.
>>
>> Fixed.
>>
>> >
>> > @@ -1418,6 +1419,16 @@ init_branch_prob (void)
>> >  void
>> >  end_branch_prob (void)
>> >  {
>> > +  end_branch_prob_1 (dump_file);
>> > +  end_branch_prob_1 (alt_dump_file);
>> > +}
>> > +
>> > +/* Helper function for file-level cleanup for DUMP_FILE after
>> > +   branch-prob processing is completed. */
>> > +
>> > +static void
>> > +end_branch_prob_1 (FILE *dump_file)
>> > +{
>> >    if (dump_file)
>> >      {
>> >        fprintf (dump_file, "\n");
>> >
>> > That change looks odd ;)  Can you instead use the new dump_printf
>> > interface?  (side-note: we should not need to export alt_dump_file at
>> > all!)
>>
>> Sorry, it was my ill conceived attempt to avoid converting this pass.
>> :) Anyway, I did a proper fix now, and converted an additional file
>> (profile.c) as a side benefit.
>>
>> >
>> > @@ -2166,10 +2177,6 @@ ftree-vect-loop-version
>> >  Common Report Var(flag_tree_vect_loop_version) Init(1) Optimization
>> >  Enable loop versioning when doing loop vectorization on trees
>> >
>> > -ftree-vectorizer-verbose=
>> > -Common RejectNegative Joined UInteger
>> > --ftree-vectorizer-verbose=<number>     Set the verbosity level of the
>> > vectorizer
>> > -
>> >
>> > we need to preserve old switches for backward compatibility, I suggest
>> > to alias it to -fopt-info for now.
>>
>> Okay. I mapped -ftree-vectorizer-verbose=<number> as
>> 0 ==> No dump output
>> 1 ==> dump optimized locations
>> 2 ==> dump missed optimizations
>> 3 ==> dump notes
>> 4 and up ==> dump all, i.e., 1, 2, 3
>>
>> Curiously, several tests are casualties of reinterpretation of this
>> flag. Here is how -- the old (and odd) behavior was that
>>
>> gcc ... -ftree-vectorize -fdump-tree-vect -ftree-vectorizer-verbose=3
>>
>> would output tree-vect dump as usual but nothing would get printed by
>> -ftree-vectorizer-verbose=3. In this patch I have "fixed" this
>> behavior so that -ftree-vectorizer-verbose=<n> prints on stderr
>> regardless of other flags present(*). This has the unfortunate side
>> effect of extra output being sent to stderr which is interpreted as a
>> test failure. Please advise how to ignore that additional stderr
>> output in tests.
>>
>> (*) Well, not entirely true. Since -ftree-vectorizer-verbose=<n> is
>> implemented in terms of -fopt-info, the output of verbose flag is the
>> stream where ever vectorizer's opt-info is being sent.
>>
>> > @@ -13909,7 +13909,7 @@ unmentioned_reg_p (rtx equiv, rtx expr)
>> >  }
>> >  ^L
>> >  DEBUG_FUNCTION void
>> > -dump_combine_stats (FILE *file)
>> > +print_combine_stats (FILE *file)
>> >
>> > see above, debug_combine_stats.
>>
>> Fixed.
>>
>> >
>> > Index: system.h
>> > ===================================================================
>> > --- system.h    (revision 188966)
>> > +++ system.h    (working copy)
>> > @@ -669,6 +669,7 @@ extern int vsnprintf(char *, size_t, const char *,
>> >     except, maybe, something to the dump file.  */
>> >  #ifdef BUFSIZ
>> >  extern FILE *dump_file;
>> > +extern FILE *alt_dump_file;
>> >
>> > see above - we should not need to export this (nor opt_info_flags).
>>
>> Fixed.
>>
>> Please take another look and see if the attached patch looks okay? I
>> still need to fix the failing tests due to intentional output on
>> stderr.
>>
>> Thanks,
>> Sharad
>>
>> >
>> > Overall I like the patch!
>> >
>> > Thanks,
>> > Richard.
>> >
>> >> Thanks,
>> >> Sharad
>> >>
>> >> On Fri, Jun 15, 2012 at 1:18 AM, Richard Guenther
>> >> <richard.guent...@gmail.com> wrote:
>> >>> On Fri, Jun 15, 2012 at 7:47 AM, Sharad Singhai <sing...@google.com>
>> >>> wrote:
>> >>>> On Wed, Jun 13, 2012 at 4:48 AM, Richard Guenther
>> >>>> <richard.guent...@gmail.com> wrote:
>> >>>>> On Fri, Jun 8, 2012 at 7:16 AM, Sharad Singhai <sing...@google.com>
>> >>>>> wrote:
>> >>>>>> Okay, I have updated the attached patch so that the output from
>> >>>>>> -ftree-vectorizer-verbose is considered diagnostic information and
>> >>>>>> is
>> >>>>>> always
>> >>>>>> sent to stderr. Other functionality remains unchanged. Here is some
>> >>>>>> more context about this patch.
>> >>>>>>
>> >>>>>> This patch improves the dump infrastructure and public interfaces
>> >>>>>> so
>> >>>>>> that the existing private pass-specific dump stream is separated
>> >>>>>> from
>> >>>>>> the diagnostic dump stream (typically stderr).  The optimization
>> >>>>>> passes can output information on the two streams independently.
>> >>>>>>
>> >>>>>> The newly defined interfaces are:
>> >>>>>>
>> >>>>>> Individual passes do not need to access the dump file directly.
>> >>>>>> Thus Instead
>> >>>>>> of doing
>> >>>>>>
>> >>>>>>   if (dump_file && (flags & dump_flags))
>> >>>>>>      fprintf (dump_file, ...);
>> >>>>>>
>> >>>>>> they can do
>> >>>>>>
>> >>>>>>     dump_printf (flags, ...);
>> >>>>>>
>> >>>>>> If the current pass has FLAGS enabled then the information gets
>> >>>>>> printed into the dump file otherwise not.
>> >>>>>>
>> >>>>>> Similar to the dump_printf (), another function is defined, called
>> >>>>>>
>> >>>>>>        diag_printf (dump_flags, ...)
>> >>>>>>
>> >>>>>> This prints information only onto the diagnostic stream, typically
>> >>>>>> standard error. It is useful for separating pass-specific dump
>> >>>>>> information from
>> >>>>>> the diagnostic information.
>> >>>>>>
>> >>>>>> Currently, as a proof of concept, I have converted vectorizer
>> >>>>>> passes
>> >>>>>> to use the new dump format. For this, I have considered
>> >>>>>> information printed in vect_dump file as diagnostic. Thus 'fprintf'
>> >>>>>> calls are changed to 'diag_printf'. Some other information printed
>> >>>>>> to
>> >>>>>> dump_file is sent to the regular dump file via 'dump_printf ()'. It
>> >>>>>> helps to separate the two streams because they might serve
>> >>>>>> different
>> >>>>>> purposes and might have different formatting requirements.
>> >>>>>>
>> >>>>>> For example, using the trunk compiler, the following invocation
>> >>>>>>
>> >>>>>> g++ -S v.cc -ftree-vectorize -fdump-tree-vect
>> >>>>>> -ftree-vectorizer-verbose=2
>> >>>>>>
>> >>>>>> prints tree vectorizer dump into a file named 'v.cc.113t.vect'.
>> >>>>>> However, the verbose diagnostic output is silently
>> >>>>>> ignored. This is not desirable as the two types of dump should not
>> >>>>>> interfere.
>> >>>>>>
>> >>>>>> After this patch, the vectorizer dump is available in
>> >>>>>> 'v.cc.113t.vect'
>> >>>>>> as before, but the verbose vectorizer diagnostic is additionally
>> >>>>>> printed on stderr. Thus both types of dump information are output.
>> >>>>>>
>> >>>>>> An additional feature of this patch is that individual passes can
>> >>>>>> print dump information into command-line named files instead of
>> >>>>>> auto
>> >>>>>> numbered filename. For example,
>> >>>>>
>> >>>>> I'd wish you'd leave out this part for a followup.
>> >>>>>
>> >>>>>>
>> >>>>>> g++ -S -O2 v.cc -ftree-vectorize -fdump-tree-vect=foo.vect
>> >>>>>>     -ftree-vectorizer-verbose=2
>> >>>>>>     -fdump-tree-pre=foo.pre
>> >>>>>>
>> >>>>>> This prints the tree vectorizer dump into 'foo.vect', PRE dump into
>> >>>>>> 'foo.pre', and the vectorizer verbose diagnostic dump onto stderr.
>> >>>>>>
>> >>>>>> Please take another look.
>> >>>>>
>> >>>>> --- tree-vect-loop-manip.c      (revision 188325)
>> >>>>> +++ tree-vect-loop-manip.c      (working copy)
>> >>>>> @@ -789,14 +789,11 @@ slpeel_make_loop_iterate_ntimes (struct loop
>> >>>>> *loop
>> >>>>>   gsi_remove (&loop_cond_gsi, true);
>> >>>>>
>> >>>>>   loop_loc = find_loop_location (loop);
>> >>>>> -  if (dump_file && (dump_flags & TDF_DETAILS))
>> >>>>> -    {
>> >>>>> -      if (loop_loc != UNKNOWN_LOC)
>> >>>>> -        fprintf (dump_file, "\nloop at %s:%d: ",
>> >>>>> +  if (loop_loc != UNKNOWN_LOC)
>> >>>>> +    dump_printf (TDF_DETAILS, "\nloop at %s:%d: ",
>> >>>>>                  LOC_FILE (loop_loc), LOC_LINE (loop_loc));
>> >>>>> -      print_gimple_stmt (dump_file, cond_stmt, 0, TDF_SLIM);
>> >>>>> -    }
>> >>>>> -
>> >>>>> +  if (dump_flags & TDF_DETAILS)
>> >>>>> +    dump_gimple_stmt (TDF_SLIM, cond_stmt, 0);
>> >>>>>   loop->nb_iterations = niters;
>> >>>>>
>> >>>>> I'm confused by this.  Why is this not simply
>> >>>>>
>> >>>>>  if (loop_loc != UNKNOWN_LOC)
>> >>>>>    dump_printf (dump_flags, "\nloop at %s:%d: ",
>> >>>>>                       LOC_FILE (loop_loc), LOC_LINE (loop_loc));
>> >>>>>  dump_gimple_stmt (dump_flags | TDF_SLIM, cond_stmt, 0);
>> >>>>>
>> >>>>> for example.  I notice that you maybe mis-understood the message
>> >>>>> classification
>> >>>>> I asked you to add (maybe I confused you by mentioning to eventually
>> >>>>> re-use
>> >>>>> the TDF_* flags).  I think you basically provided this message
>> >>>>> classification
>> >>>>> by adding two classes by providing both dump_gimple_stmt and
>> >>>>> diag_gimple_stmt.
>> >>>>> But still in the above you keep a dump_flags test _and_ you pass in
>> >>>>> (altered) dump_flags to the dump/diag_gimple_stmt routines.  Let me
>> >>>>> quote them:
>> >>>>>
>> >>>>> +void
>> >>>>> +dump_gimple_stmt (int flags, gimple gs, int spc)
>> >>>>> +{
>> >>>>> +  if (dump_file)
>> >>>>> +    print_gimple_stmt (dump_file, gs, spc, flags);
>> >>>>> +}
>> >>>>>
>> >>>>> +void
>> >>>>> +diag_gimple_stmt (int flags, gimple gs, int spc)
>> >>>>> +{
>> >>>>> +  if (alt_dump_file)
>> >>>>> +    print_gimple_stmt (alt_dump_file, gs, spc, flags);
>> >>>>> +}
>> >>>>>
>> >>>>> I'd say it should have been a single function:
>> >>>>>
>> >>>>> void
>> >>>>> dump_gimple_stmt (enum msg_classification, int additional_flags,
>> >>>>> gimple gs, int spc)
>> >>>>> {
>> >>>>>  if (msg_classification & go-to-dumpfile
>> >>>>>      && dump_file)
>> >>>>>    print_gimple_stmt (dump_file, gs, spc, dump_flags |
>> >>>>> additional_flags);
>> >>>>>  if (msg_classification & go-to-alt-dump-file
>> >>>>>      && alt_dump_file && (alt_dump_flags & msg_classification))
>> >>>>>    print_gimple_stmt (alt_dump_file, gs, spc, alt_dump_flags |
>> >>>>> additional_flags);
>> >>>>> }
>> >>>>
>> >>>> Yes,  I can make the single function work for both regular
>> >>>> (dump_file)
>> >>>> and diagnostic (stderr for now) dump streams. In fact, my original
>> >>>> patch did just that. However, it duplicated output on *both* the
>> >>>> streams. For example,
>> >>>>
>> >>>> gcc -O2 -ftree-vectorize -fdump-tree-vect=foo.vect
>> >>>> -ftree-vectorizer-verbose=2 foo.c
>> >>>>
>> >>>> Since both streams are enabled in this case, a call to dump_printf ()
>> >>>> would duplicate the information to both files, i.e., the dump and
>> >>>> diagnostic will be intermixed. Is that intended? My first thought was
>> >>>> to keep them separated via dump_*() and diag_* () methods.
>> >>>
>> >>> No, I think that's intended.  The regular dump-files should contain
>> >>> everything, the secondary stream (eventually enabled by -fopt-info)
>> >>> should be a filtered regular dump-file.
>> >>>
>> >>> Thanks,
>> >>> Richard.
>> >>>
>> >>>> Thanks,
>> >>>> Sharad
>> >>>>
>> >>>>> where msg_classification would include things to suitably classify
>> >>>>> messages
>> >>>>> for -fopt-info, like MSG_MISSED_OPTIMIZATION, MSG_OPTIMIZED,
>> >>>>> MSG_NOTE.
>> >>>>>
>> >>>>> In another place we have
>> >>>>>
>> >>>>> @@ -1648,7 +1642,7 @@ vect_can_advance_ivs_p (loop_vec_info
>> >>>>> loop_vinfo)
>> >>>>>   /* Analyze phi functions of the loop header.  */
>> >>>>>
>> >>>>>   if (vect_print_dump_info (REPORT_DETAILS))
>> >>>>> -    fprintf (vect_dump, "vect_can_advance_ivs_p:");
>> >>>>> +    diag_printf (TDF_TREE, "vect_can_advance_ivs_p:");
>> >>>>>
>> >>>>> so why's that diag_printf and why TDF_TREE?  I suppose you made all
>> >>>>> dumps to vect_dump diag_* and all dumps to dump_file dump_*?  I
>> >>>>> think it should have been
>> >>>>>
>> >>>>>   dump_printf (REPORT_DETAILS, "vect_can_advance_ivs_p:");
>> >>>>>
>> >>>>> thus dump_printf only gets the msg-classification and the printf
>> >>>>> args
>> >>>>> (dump-flags
>> >>>>> are only meaningful when passed down to pretty-printers).  Thus
>> >>>>>
>> >>>>> @@ -1658,8 +1652,8 @@ vect_can_advance_ivs_p (loop_vec_info
>> >>>>> loop_vinfo)
>> >>>>>       phi = gsi_stmt (gsi);
>> >>>>>       if (vect_print_dump_info (REPORT_DETAILS))
>> >>>>>        {
>> >>>>> -          fprintf (vect_dump, "Analyze phi: ");
>> >>>>> -          print_gimple_stmt (vect_dump, phi, 0, TDF_SLIM);
>> >>>>> +          diag_printf (TDF_TREE, "Analyze phi: ");
>> >>>>> +          diag_gimple_stmt (TDF_SLIM, phi, 0);
>> >>>>>        }
>> >>>>>
>> >>>>> should be
>> >>>>>
>> >>>>>  dump_printf (REPORT_DETAILS, "Analyze phi: ");
>> >>>>>  dump_gimple_stmt (REPORT_DETAILS, TDF_SLIM, phi, 0);
>> >>>>>
>> >>>>> and the if (vect_print_dump_info (REPORT_DETAILS)) should be what
>> >>>>> the dump infrastructure provides and thus hidden.  Eventually we
>> >>>>> should
>> >>>>> have a dump_kind (msg-classification) so we can replace it with
>> >>>>>
>> >>>>>   if (dump_kind (REPORT_DETAILS))
>> >>>>>     {
>> >>>>>       dump_printf (REPORT_DETAILS, "Analyze phi: ");
>> >>>>>       dump_gimple_stmt (REPORT_DETAILS, TDF_SLIM, phi, 0);
>> >>>>>     }
>> >>>>>
>> >>>>> to reduce the runtime overhead when not diagnosing/dumping.
>> >>>>>
>> >>>>> @@ -2464,8 +2458,8 @@ vect_create_cond_for_alias_checks
>> >>>>> (loop_vec_info l
>> >>>>>     }
>> >>>>>
>> >>>>>   if (vect_print_dump_info (REPORT_VECTORIZED_LOCATIONS))
>> >>>>> -    fprintf (vect_dump, "created %u versioning for alias
>> >>>>> checks.\n",
>> >>>>> -             VEC_length (ddr_p, may_alias_ddrs));
>> >>>>> +    diag_printf (TDF_TREE, "created %u versioning for alias
>> >>>>> checks.\n",
>> >>>>> +                 VEC_length (ddr_p, may_alias_ddrs));
>> >>>>>  }
>> >>>>>
>> >>>>> so here we have a different msg-classification,
>> >>>>> REPORT_VECTORIZED_LOCATIONS.  As we eventually want a central
>> >>>>> -fopt-report=... we do not want to leave this implementation detail
>> >>>>> to
>> >>>>> individual passes but gather them in a central place.
>> >>>>>
>> >>>>> Thanks,
>> >>>>> Richard.
>> >>>>>
>> >>>>>> Thanks,
>> >>>>>> Sharad
>> >>>>>>
>> >>>>>>
>> >>>>>> On Thu, Jun 7, 2012 at 12:19 AM, Xinliang David Li
>> >>>>>> <davi...@google.com> wrote:
>> >>>>>>> On Wed, Jun 6, 2012 at 10:58 PM, Sharad Singhai
>> >>>>>>> <sing...@google.com> wrote:
>> >>>>>>>> Sorry about the delay. I have finally incorporated all the
>> >>>>>>>> suggestions
>> >>>>>>>> and reorganized the dump infrastructure a bit. The attached patch
>> >>>>>>>> updates vectorizer passes so that instead of accessing global
>> >>>>>>>> dump_file directly, these passes call dump_printf (FLAG, format,
>> >>>>>>>> ...).
>> >>>>>>>> The dump_printf can choose between two streams, one regular pass
>> >>>>>>>> dump
>> >>>>>>>> file, and another optional command line provided file. Currently,
>> >>>>>>>> it
>> >>>>>>>> doesn't discriminate and all the dump information goes to both
>> >>>>>>>> the
>> >>>>>>>> streams.
>> >>>>>>>>
>> >>>>>>>> Thus, for example,
>> >>>>>>>>
>> >>>>>>>> g++ -O2 v.cc -ftree-vectorize -fdump-tree-vect=foo.v
>> >>>>>>>> -ftree-vectorizer-verbose=3
>> >>>>>>>
>> >>>>>>> But the default form of dump option (-fdump-tree-vect) no longer
>> >>>>>>> interferes with -ftree-vectorize-verbose=xxx output right? (this
>> >>>>>>> is
>> >>>>>>> one of the main requirements). One dumped to the primary stream
>> >>>>>>> (named
>> >>>>>>> dump file) and the other to the stderr -- the default diagnostic
>> >>>>>>> (alt)
>> >>>>>>> stream.
>> >>>>>>>
>> >>>>>>> David
>> >>>>>>>
>> >>>>>>>>
>> >>>>>>>> will output the verbose vectorizer information in both *.vect
>> >>>>>>>> file and
>> >>>>>>>> foo.v file. However, as I have converted only vectorizer passes
>> >>>>>>>> so
>> >>>>>>>> far, there is additional information in *.vect file which is not
>> >>>>>>>> present in foo.v file. Once other passes are converted to use
>> >>>>>>>> this
>> >>>>>>>> scheme, then these two dump files should have identical output.
>> >>>>>>>>
>> >>>>>>>> Also note that in this patch -fdump-xxx=yyy format does not
>> >>>>>>>> override
>> >>>>>>>> any auto named dump files as in my earlier patches. Instead the
>> >>>>>>>> dump
>> >>>>>>>> information is output to both places when a command line dump
>> >>>>>>>> file
>> >>>>>>>> option is provided.
>> >>>>>>>>
>> >>>>>>>> To summarize:
>> >>>>>>>> - instead of using dump_begin () / dump_end (), the passes should
>> >>>>>>>> use
>> >>>>>>>> dump_start ()/dump_finish (). These new variants do not return
>> >>>>>>>> the
>> >>>>>>>> dump_file. However, they still set the global
>> >>>>>>>> dump_file/dump_flags for
>> >>>>>>>> the benefit of other passes during the transition.
>> >>>>>>>> - instead of directly printing to the dump_file, as in
>> >>>>>>>> if (dump_file)
>> >>>>>>>>  fprintf (dump_file, ...);
>> >>>>>>>>
>> >>>>>>>> The passes should do
>> >>>>>>>>
>> >>>>>>>> dump_printf (dump_flag, ...);
>> >>>>>>>> This will output to dump file(s) only when dump_flag is enabled
>> >>>>>>>> for a
>> >>>>>>>> given pass.
>> >>>>>>>>
>> >>>>>>>> I have bootstrapped and tested it on x86_64. Does it look okay?
>> >>>>>>>>
>> >>>>>>>> Thanks,
>> >>>>>>>> Sharad
>> >>>>>>>>
>> >>>>>>>>
>> >>>>>>>> On Mon, May 14, 2012 at 12:26 AM, Richard Guenther
>> >>>>>>>> <richard.guent...@gmail.com> wrote:
>> >>>>>>>>> On Sat, May 12, 2012 at 6:39 PM, Xinliang David Li
>> >>>>>>>>> <davi...@google.com> wrote:
>> >>>>>>>>>> On Sat, May 12, 2012 at 9:26 AM, Gabriel Dos Reis
>> >>>>>>>>>> <g...@integrable-solutions.net> wrote:
>> >>>>>>>>>>> On Sat, May 12, 2012 at 11:05 AM, Xinliang David Li
>> >>>>>>>>>>> <davi...@google.com> wrote:
>> >>>>>>>>>>>
>> >>>>>>>>>>>> The downside is that the dump file format will look different
>> >>>>>>>>>>>> from the
>> >>>>>>>>>>>> stderr output which is less than ideal.
>> >>>>>>>>>>>
>> >>>>>>>>>>> BTW, why do people want to use stderr for dumping internal
>> >>>>>>>>>>> IRs,
>> >>>>>>>>>>> as opposed to stdout or other files?  That does not sound
>> >>>>>>>>>>> right.
>> >>>>>>>>>>>
>> >>>>>>>>>>
>> >>>>>>>>>> I was talking about the transformation information difference.
>> >>>>>>>>>> In
>> >>>>>>>>>> stderr (where diagnostics go to), we may have
>> >>>>>>>>>>
>> >>>>>>>>>> foo.c: in function 'foo':
>> >>>>>>>>>> foo.c:5:6: note: loop was vectorized
>> >>>>>>>>>>
>> >>>>>>>>>> but in dump file the format for the information may be
>> >>>>>>>>>> different,
>> >>>>>>>>>> unless we want to duplicate the machinery in diagnostics.
>> >>>>>>>>>
>> >>>>>>>>> So?  What's the problem with that ("different" diagnostics)?
>> >>>>>>>>>
>> >>>>>>>>> Richard.
>> >>>>>>>>>
>> >>>>>>>>>> David
>> >>>>>>>>>>
>> >>>>>>>>>>> -- Gaby
>
>

Reply via email to