On Wed, Feb 21, 2018 at 11:11 AM, Alexandre Oliva <aol...@redhat.com> wrote:
> On Feb 15, 2018, Szabolcs Nagy <szabolcs.n...@arm.com> wrote:
>
>> i see assembler slow downs with these location view patches
>> i opened https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84408
>
>
> [LVU] reset view at function entry, omit views at line zero
>
> Location views might be associated with locations that lack line
> number information (line number zero), but since we omit .loc
> directives that would have been issued with line number zero, we also
> omit the symbolic view numbers that would have been issued at such
> points.
>
> Resetting views at function entry points address some of these issues,
> and alleviate the huge chains of symbolic views that have burdened
> assemblers since we disabled -ginternal-reset-location-views by
> default, but other problems of undefined views remain when it's not
> the whole function that lacks line number info, just parts of it.
>
> So, when we encounter a request to output a view that may have been
> referenced, but we decide to omit the .loc because the line is zero,
> we will now omit the view as well, i.e., we will internally regard
> that view as zero-numbered.
>
> Regstrapped on x86_64-linux-gnu and i686-linux-gnu.  Ok to install?
>
> Uros, could you please confirm whether this fixes the 84404 go problem
> you reported on alpha?  I'm guessing it's the same issue.  TIA,

I can confirm, that all "leb128 operand is an undefined symbol" errors
are gone. I'm running full alpha native bootstrap & regression test,
but I don't expect any surprises here.

Thanks,
Uros.

> for  gcc/ChangeLog
>
>         PR debug/84404
>         PR debug/84408
>         * dwarf2out.c (struct dw_line_info_table): Update comments for
>         view == -1.
>         (FORCE_RESET_NEXT_VIEW): New.
>         (FORCE_RESETTING_VIEW_P): New.
>         (RESETTING_VIEW_P): Check for -1 too.
>         (ZERO_VIEW_P): Likewise.
>         (new_line_info_table): Force-reset next view.
>         (dwarf2out_begin_function): Likewise.
>         (dwarf2out_source_line): Simplify zero_view_p initialization.
>         Test FORCE_RESETTING_VIEW_P and RESETTING_VIEW_P instead of
>         view directly.  Omit view when omitting .loc at line 0.
>
> for  gcc/testsuite/ChangeLog
>
>         PR debug/84404
>         PR debug/84408
>         * gcc.dg/graphite/pr84404.c: New.
> ---
>  gcc/dwarf2out.c                         |   89 
> ++++++++++++++++++++++++-------
>  gcc/testsuite/gcc.dg/graphite/pr84404.c |   18 ++++++
>  2 files changed, 87 insertions(+), 20 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/graphite/pr84404.c
>
> diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
> index 5e88c7bacf06..7bbe20e495ac 100644
> --- a/gcc/dwarf2out.c
> +++ b/gcc/dwarf2out.c
> @@ -2940,8 +2940,8 @@ struct GTY(()) dw_line_info_table {
>       If it is 0, it is known that the NEXT view will be the first view
>       at the given PC.
>
> -     If it is -1, we've advanced PC but we haven't emitted a line location 
> yet,
> -     so we shouldn't use this view number.
> +     If it is -1, we're forcing the view number to be reset, e.g. at a
> +     function entry.
>
>       The meaning of other nonzero values depends on whether we're
>       computing views internally or leaving it for the assembler to do
> @@ -2951,8 +2951,10 @@ struct GTY(()) dw_line_info_table {
>       going to ask the assembler to assign.  */
>    var_loc_view view;
>
> +#define FORCE_RESET_NEXT_VIEW(x) ((x) = (var_loc_view)-1)
>  #define RESET_NEXT_VIEW(x) ((x) = (var_loc_view)0)
> -#define RESETTING_VIEW_P(x) ((x) == (var_loc_view)0)
> +#define FORCE_RESETTING_VIEW_P(x) ((x) == (var_loc_view)-1)
> +#define RESETTING_VIEW_P(x) ((x) == (var_loc_view)0 || 
> FORCE_RESETTING_VIEW_P (x))
>
>    vec<dw_line_info_entry, va_gc> *entries;
>  };
> @@ -2985,7 +2987,7 @@ maybe_reset_location_view (rtx_insn *insn, 
> dw_line_info_table *table)
>    else if (get_attr_min_length (insn) > 0)
>      reset = 1;
>
> -  if (reset > 0)
> +  if (reset > 0 && !RESETTING_VIEW_P (table->view))
>      RESET_NEXT_VIEW (table->view);
>  }
>
> @@ -3235,9 +3237,10 @@ static GTY(()) bitmap zero_view_p;
>     that must be view number zero.  Otherwise, ZERO_VIEW_P is allocated
>     and views label numbers recorded in it are the ones known to be
>     zero.  */
> -#define ZERO_VIEW_P(N) (zero_view_p                            \
> -                       ? bitmap_bit_p (zero_view_p, (N))       \
> -                       : (N) == 0)
> +#define ZERO_VIEW_P(N) ((N) == (var_loc_view)0                         \
> +                       || (N) == (var_loc_view)-1                      \
> +                       || (zero_view_p                                 \
> +                           && bitmap_bit_p (zero_view_p, (N))))
>
>  /* Return true iff we're to emit .loc directives for the assembler to
>     generate line number sections.
> @@ -27210,6 +27213,18 @@ create_label:
>           last_postcall_label = ggc_strdup (loclabel);
>         }
>        newloc->label = last_postcall_label;
> +      /* ??? This view is at last_label, not last_label-1, but we
> +        could only assume view at last_label-1 is zero if we could
> +        assume calls always have length greater than one.  This is
> +        probably true in general, though there might be a rare
> +        exception to this rule, e.g. if a call insn is optimized out
> +        by target magic.  Then, even the -1 in the label will be
> +        wrong, which might invalidate the range.  Anyway, using view,
> +        though technically possibly incorrect, will work as far as
> +        ranges go: since L-1 is in the middle of the call insn,
> +        (L-1).0 and (L-1).V shouldn't make any difference, and having
> +        the loclist entry refer to the .loc entry might be useful, so
> +        leave it like this.  */
>        newloc->view = view;
>      }
>
> @@ -27391,7 +27406,7 @@ new_line_info_table (void)
>    table->file_num = 1;
>    table->line_num = 1;
>    table->is_stmt = DWARF_LINE_DEFAULT_IS_STMT_START;
> -  RESET_NEXT_VIEW (table->view);
> +  FORCE_RESET_NEXT_VIEW (table->view);
>
>    return table;
>  }
> @@ -27475,6 +27490,7 @@ dwarf2out_begin_function (tree fun)
>    tail_call_site_count = 0;
>
>    set_cur_line_info_table (sec);
> +  FORCE_RESET_NEXT_VIEW (cur_line_info_table->view);
>  }
>
>  /* Helper function of dwarf2out_end_function, called only after emitting
> @@ -27572,10 +27588,44 @@ dwarf2out_source_line (unsigned int line, unsigned 
> int column,
>  {
>    unsigned int file_num;
>    dw_line_info_table *table;
> +  static var_loc_view lvugid;
>
> -  if (debug_info_level < DINFO_LEVEL_TERSE || line == 0)
> +  if (debug_info_level < DINFO_LEVEL_TERSE)
>      return;
>
> +  table = cur_line_info_table;
> +
> +  if (line == 0)
> +    {
> +      if (debug_variable_location_views
> +         && output_asm_line_debug_info ()
> +         && table && !RESETTING_VIEW_P (table->view))
> +       {
> +         /* If we're using the assembler to compute view numbers, we
> +            can't issue a .loc directive for line zero, so we can't
> +            get a view number at this point.  We might attempt to
> +            compute it from the previous view, but since we're
> +            omitting the line number entry, we might as well omit the
> +            view number as well.  That means pretending it's a view
> +            number zero, which might very well turn out to be
> +            correct.  */
> +         if (!zero_view_p)
> +           zero_view_p = BITMAP_GGC_ALLOC ();
> +         bitmap_set_bit (zero_view_p, table->view);
> +         if (flag_debug_asm)
> +           {
> +             char label[MAX_ARTIFICIAL_LABEL_BYTES];
> +             ASM_GENERATE_INTERNAL_LABEL (label, "LVU", table->view);
> +             fprintf (asm_out_file, "\t%s line 0, omitted view ",
> +                      ASM_COMMENT_START);
> +             assemble_name (asm_out_file, label);
> +             putc ('\n', asm_out_file);
> +           }
> +         table->view = ++lvugid;
> +       }
> +      return;
> +    }
> +
>    /* The discriminator column was added in dwarf4.  Simplify the below
>       by simply removing it if we're not supposed to output it.  */
>    if (dwarf_version < 4 && dwarf_strict)
> @@ -27584,7 +27634,6 @@ dwarf2out_source_line (unsigned int line, unsigned 
> int column,
>    if (!debug_column_info)
>      column = 0;
>
> -  table = cur_line_info_table;
>    file_num = maybe_emit_file (lookup_filename (filename));
>
>    /* ??? TODO: Elide duplicate line number entries.  Traditionally,
> @@ -27646,13 +27695,6 @@ dwarf2out_source_line (unsigned int line, unsigned 
> int column,
>         }
>        if (debug_variable_location_views)
>         {
> -         static var_loc_view lvugid;
> -         if (!lvugid)
> -           {
> -             gcc_assert (!zero_view_p);
> -             zero_view_p = BITMAP_GGC_ALLOC ();
> -             bitmap_set_bit (zero_view_p, 0);
> -           }
>           if (!RESETTING_VIEW_P (table->view))
>             {
>               /* When we're using the assembler to compute view
> @@ -27673,7 +27715,7 @@ dwarf2out_source_line (unsigned int line, unsigned 
> int column,
>             }
>           else
>             {
> -             if (!table->in_use)
> +             if (FORCE_RESETTING_VIEW_P (table->view))
>                 fputs (" view -0", asm_out_file);
>               else
>                 fputs (" view 0", asm_out_file);
> @@ -27684,6 +27726,8 @@ dwarf2out_source_line (unsigned int line, unsigned 
> int column,
>                  known to be zero, because then we may be able to
>                  optimize out locviews that are all zeros, so take
>                  note of it in zero_view_p.  */
> +             if (!zero_view_p)
> +               zero_view_p = BITMAP_GGC_ALLOC ();
>               bitmap_set_bit (zero_view_p, lvugid);
>               table->view = ++lvugid;
>             }
> @@ -27696,17 +27740,22 @@ dwarf2out_source_line (unsigned int line, unsigned 
> int column,
>
>        targetm.asm_out.internal_label (asm_out_file, LINE_CODE_LABEL, 
> label_num);
>
> -      if (debug_variable_location_views && table->view)
> +      if (debug_variable_location_views && !RESETTING_VIEW_P (table->view))
>         push_dw_line_info_entry (table, LI_adv_address, label_num);
>        else
>         push_dw_line_info_entry (table, LI_set_address, label_num);
>        if (debug_variable_location_views)
>         {
> +         bool resetting = FORCE_RESETTING_VIEW_P (table->view);
> +         if (resetting)
> +           table->view = 0;
> +
>           if (flag_debug_asm)
>             fprintf (asm_out_file, "\t%s view %s%d\n",
>                      ASM_COMMENT_START,
> -                    table->in_use ? "" : "-",
> +                    resetting ? "-" : "",
>                      table->view);
> +
>           table->view++;
>         }
>        if (file_num != table->file_num)
> diff --git a/gcc/testsuite/gcc.dg/graphite/pr84404.c 
> b/gcc/testsuite/gcc.dg/graphite/pr84404.c
> new file mode 100644
> index 000000000000..858e651cfab7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/graphite/pr84404.c
> @@ -0,0 +1,18 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -ftree-parallelize-loops=2 -floop-nest-optimize -g" } */
> +
> +int te[9];
> +
> +void
> +dt (int cz)
> +{
> +  while (cz < 1)
> +    {
> +      int xy;
> +
> +      for (xy = 0; xy < 9; ++xy)
> +        te[xy] = 0;
> +
> +      ++cz;
> +    }
> +}
>
>
> --
> Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
> You must be the change you wish to see in the world. -- Gandhi
> Be Free! -- http://FSFLA.org/   FSF Latin America board member
> Free Software Evangelist|Red Hat Brasil GNU Toolchain Engineer

Reply via email to