On Tue, Jun 26, 2018 at 5:43 PM David Malcolm <dmalc...@redhat.com> wrote: > > This patch adds a concept of nested "scopes" to dumpfile.c's dump_*_loc > calls, and wires it up to the DUMP_VECT_SCOPE macro in tree-vectorizer.h, > so that the nested structure is shown in -fopt-info by indentation. > > For example, this converts -fopt-info-all e.g. from: > > test.c:8:3: note: === analyzing loop === > test.c:8:3: note: === analyze_loop_nest === > test.c:8:3: note: === vect_analyze_loop_form === > test.c:8:3: note: === get_loop_niters === > test.c:8:3: note: symbolic number of iterations is (unsigned int) n_9(D) > test.c:8:3: note: not vectorized: loop contains function calls or data > references that cannot be analyzed > test.c:8:3: note: vectorized 0 loops in function > > to: > > test.c:8:3: note: === analyzing loop === > test.c:8:3: note: === analyze_loop_nest === > test.c:8:3: note: === vect_analyze_loop_form === > test.c:8:3: note: === get_loop_niters === > test.c:8:3: note: symbolic number of iterations is (unsigned int) n_9(D) > test.c:8:3: note: not vectorized: loop contains function calls or data > references that cannot be analyzed > test.c:8:3: note: vectorized 0 loops in function > > showing that the "symbolic number of iterations" message is within > the "=== analyze_loop_nest ===" (and not within the > "=== vect_analyze_loop_form ==="). > > This is also enabling work for followups involving optimization records > (allowing the records to directly capture the nested structure of the > dump messages). > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. > > OK for trunk?
OK and sorry for the delay. Richard. > gcc/ChangeLog: > * dumpfile.c (dump_loc): Add indentation based on scope depth. > (dump_scope_depth): New variable. > (get_dump_scope_depth): New function. > (dump_begin_scope): New function. > (dump_end_scope): New function. > * dumpfile.h (get_dump_scope_depth): New declaration. > (dump_begin_scope): New declaration. > (dump_end_scope): New declaration. > (class auto_dump_scope): New class. > (AUTO_DUMP_SCOPE): New macro. > * tree-vectorizer.h (DUMP_VECT_SCOPE): Reimplement in terms of > AUTO_DUMP_SCOPE. > --- > gcc/dumpfile.c | 35 +++++++++++++++++++++++++++++++++++ > gcc/dumpfile.h | 39 +++++++++++++++++++++++++++++++++++++++ > gcc/tree-vectorizer.h | 15 ++++++++------- > 3 files changed, 82 insertions(+), 7 deletions(-) > > diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c > index 122e420..190b52d 100644 > --- a/gcc/dumpfile.c > +++ b/gcc/dumpfile.c > @@ -419,6 +419,8 @@ dump_loc (dump_flags_t dump_kind, FILE *dfile, > source_location loc) > DECL_SOURCE_FILE (current_function_decl), > DECL_SOURCE_LINE (current_function_decl), > DECL_SOURCE_COLUMN (current_function_decl)); > + /* Indentation based on scope depth. */ > + fprintf (dfile, "%*s", get_dump_scope_depth (), ""); > } > } > > @@ -539,6 +541,39 @@ template void dump_dec (dump_flags_t, const poly_uint64 > &); > template void dump_dec (dump_flags_t, const poly_offset_int &); > template void dump_dec (dump_flags_t, const poly_widest_int &); > > +/* The current dump scope-nesting depth. */ > + > +static int dump_scope_depth; > + > +/* Get the current dump scope-nesting depth. > + For use by dump_*_loc (for showing nesting via indentation). */ > + > +unsigned int > +get_dump_scope_depth () > +{ > + return dump_scope_depth; > +} > + > +/* Push a nested dump scope. > + Print "=== NAME ===\n" to the dumpfile, if any, and to the -fopt-info > + destination, if any. > + Increment the scope depth. */ > + > +void > +dump_begin_scope (const char *name, const dump_location_t &loc) > +{ > + dump_printf_loc (MSG_NOTE, loc, "=== %s ===\n", name); > + dump_scope_depth++; > +} > + > +/* Pop a nested dump scope. */ > + > +void > +dump_end_scope () > +{ > + dump_scope_depth--; > +} > + > /* Start a dump for PHASE. Store user-supplied dump flags in > *FLAG_PTR. Return the number of streams opened. Set globals > DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and > diff --git a/gcc/dumpfile.h b/gcc/dumpfile.h > index 90d8930..89d5c11 100644 > --- a/gcc/dumpfile.h > +++ b/gcc/dumpfile.h > @@ -456,6 +456,45 @@ dump_enabled_p (void) > return (dump_file || alt_dump_file); > } > > +/* Managing nested scopes, so that dumps can express the call chain > + leading to a dump message. */ > + > +extern unsigned int get_dump_scope_depth (); > +extern void dump_begin_scope (const char *name, const dump_location_t &loc); > +extern void dump_end_scope (); > + > +/* Implementation detail of the AUTO_DUMP_SCOPE macro below. > + > + A RAII-style class intended to make it easy to emit dump > + information about entering and exiting a collection of nested > + function calls. */ > + > +class auto_dump_scope > +{ > + public: > + auto_dump_scope (const char *name, dump_location_t loc) > + { > + if (dump_enabled_p ()) > + dump_begin_scope (name, loc); > + } > + ~auto_dump_scope () > + { > + if (dump_enabled_p ()) > + dump_end_scope (); > + } > +}; > + > +/* A macro for calling: > + dump_begin_scope (NAME, LOC); > + via an RAII object, thus printing "=== MSG ===\n" to the dumpfile etc, > + and then calling > + dump_end_scope (); > + once the object goes out of scope, thus capturing the nesting of > + the scopes. */ > + > +#define AUTO_DUMP_SCOPE(NAME, LOC) \ > + auto_dump_scope scope (NAME, LOC) > + > namespace gcc { > > class dump_manager > diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h > index 94a0f38..a8406b3 100644 > --- a/gcc/tree-vectorizer.h > +++ b/gcc/tree-vectorizer.h > @@ -1440,15 +1440,16 @@ vect_get_scalar_dr_size (struct data_reference *dr) > /* Source location + hotness information. */ > extern dump_user_location_t vect_location; > > -/* If dumping is enabled, emit a MSG_NOTE at vect_location about > - entering MSG within the vectorizer. MSG should be a string literal. */ > +/* A macro for calling: > + dump_begin_scope (MSG, vect_location); > + via an RAII object, thus printing "=== MSG ===\n" to the dumpfile etc, > + and then calling > + dump_end_scope (); > + once the object goes out of scope, thus capturing the nesting of > + the scopes. */ > > #define DUMP_VECT_SCOPE(MSG) \ > - do { \ > - if (dump_enabled_p ()) \ > - dump_printf_loc (MSG_NOTE, vect_location, \ > - "=== " MSG " ===\n"); \ > - } while (0) > + AUTO_DUMP_SCOPE (MSG, vect_location) > > /*-----------------------------------------------------------------*/ > /* Function prototypes. */ > -- > 1.8.5.3 >