On Tue, Jun 26, 2018 at 5:43 PM David Malcolm <[email protected]> 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
>