On Tue, May 29, 2018 at 10:33 PM David Malcolm <dmalc...@redhat.com> wrote:
>
> This was an experiment to try to capture information on a
> loop optimization.
>
> gcc/ChangeLog:
>         * gimple-loop-interchange.cc (should_interchange_loops): Add
>         optinfo note when interchange gives better data locality behavior.
>         (tree_loop_interchange::interchange): Add OPTINFO_SCOPE.
>         Add optinfo for successful and unsuccessful interchanges.
>         (prepare_perfect_loop_nest): Add OPTINFO_SCOPE.  Add
>         optinfo note.
>         (pass_linterchange::execute): Add OPTINFO_SCOPE.
> ---
>  gcc/gimple-loop-interchange.cc | 36 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/gimple-loop-interchange.cc b/gcc/gimple-loop-interchange.cc
> index eb35263..cd32288 100644
> --- a/gcc/gimple-loop-interchange.cc
> +++ b/gcc/gimple-loop-interchange.cc
> @@ -1556,7 +1556,19 @@ should_interchange_loops (unsigned i_idx, unsigned 
> o_idx,
>    ratio = innermost_loops_p ? INNER_STRIDE_RATIO : OUTER_STRIDE_RATIO;
>    /* Do interchange if it gives better data locality behavior.  */
>    if (wi::gtu_p (iloop_strides, wi::mul (oloop_strides, ratio)))
> -    return true;
> +    {
> +      if (optinfo_enabled_p ())
> +       OPTINFO_NOTE ((gimple *)NULL) // FIXME
> +         << "interchange gives better data locality behavior: "
> +         << "iloop_strides: "
> +         << decu (iloop_strides)
> +         << " > (oloop_strides: "
> +         << decu (oloop_strides)
> +         << " * ratio: "
> +         << decu (ratio)
> +         << ")";

Just randomly inside the thread.

NOOOOOOOOOO!

:/

Please do _not_ add more stream-like APIs.  How do you expect
translators to deal with those?

Yes, I'm aware of the graphite-* ones and I dislike those very much.

What's wrong with the existing dump API?

Richard.

> +      return true;
> +    }
>    if (wi::gtu_p (iloop_strides, oloop_strides))
>      {
>        /* Or it creates more invariant memory references.  */
> @@ -1578,6 +1590,8 @@ bool
>  tree_loop_interchange::interchange (vec<data_reference_p> datarefs,
>                                     vec<ddr_p> ddrs)
>  {
> +  OPTINFO_SCOPE ("tree_loop_interchange::interchange", m_loop_nest[0]);
> +
>    location_t loc = find_loop_location (m_loop_nest[0]);
>    bool changed_p = false;
>    /* In each iteration we try to interchange I-th loop with (I+1)-th loop.
> @@ -1628,6 +1642,10 @@ tree_loop_interchange::interchange 
> (vec<data_reference_p> datarefs,
>             fprintf (dump_file,
>                      "Loop_pair<outer:%d, inner:%d> is interchanged\n\n",
>                      oloop.m_loop->num, iloop.m_loop->num);
> +         if (optinfo_enabled_p ())
> +           OPTINFO_SUCCESS (oloop.m_loop)
> +             << optinfo_printf ("Loop_pair<outer:%d, inner:%d> is 
> interchanged",
> +                                oloop.m_loop->num, iloop.m_loop->num);
>
>           changed_p = true;
>           interchange_loops (iloop, oloop);
> @@ -1641,6 +1659,10 @@ tree_loop_interchange::interchange 
> (vec<data_reference_p> datarefs,
>             fprintf (dump_file,
>                      "Loop_pair<outer:%d, inner:%d> is not interchanged\n\n",
>                      oloop.m_loop->num, iloop.m_loop->num);
> +         if (optinfo_enabled_p ())
> +           OPTINFO_FAILURE (oloop.m_loop)
> +             << optinfo_printf ("Loop_pair<outer:%d, inner:%d> is not 
> interchanged",
> +                                oloop.m_loop->num, iloop.m_loop->num);
>         }
>      }
>    simple_dce_from_worklist (m_dce_seeds);
> @@ -1648,6 +1670,9 @@ tree_loop_interchange::interchange 
> (vec<data_reference_p> datarefs,
>    if (changed_p)
>      dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
>                      "loops interchanged in loop nest\n");
> +  if (optinfo_enabled_p ())
> +    OPTINFO_SUCCESS (m_loop_nest[0])
> +      << "loops interchanged in loop nest";
>
>    return changed_p;
>  }
> @@ -1971,6 +1996,8 @@ static bool
>  prepare_perfect_loop_nest (struct loop *loop, vec<loop_p> *loop_nest,
>                            vec<data_reference_p> *datarefs, vec<ddr_p> *ddrs)
>  {
> +  OPTINFO_SCOPE ("prepare_perfect_loop_nest", loop);
> +
>    struct loop *start_loop = NULL, *innermost = loop;
>    struct loop *outermost = loops_for_fn (cfun)->tree_root;
>
> @@ -2029,6 +2056,12 @@ prepare_perfect_loop_nest (struct loop *loop, 
> vec<loop_p> *loop_nest,
>           fprintf (dump_file,
>                    "\nConsider loop interchange for loop_nest<%d - %d>\n",
>                    start_loop->num, innermost->num);
> +       if (optinfo_enabled_p ())
> +         {
> +           OPTINFO_NOTE (start_loop)
> +             << optinfo_printf ("consider loop interchange for loop_nest<%d 
> - %d>",
> +                                start_loop->num, innermost->num);
> +         }
>
>         if (loop != start_loop)
>           prune_access_strides_not_in_loop (start_loop, innermost, *datarefs);
> @@ -2061,6 +2094,7 @@ pass_linterchange::execute (function *fun)
>    struct loop *loop;
>    FOR_EACH_LOOP (loop, LI_ONLY_INNERMOST)
>      {
> +      OPTINFO_SCOPE ("considering loop for interchange", loop);
>        vec<loop_p> loop_nest = vNULL;
>        vec<data_reference_p> datarefs = vNULL;
>        vec<ddr_p> ddrs = vNULL;
> --
> 1.8.5.3
>

Reply via email to