On Tue, 24 Mar 2020, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase FAILs with -fcompare-debug.  The problem is that
> create_iv behaves differently when inserting after into an empty bb (in that
> case sets location to goto_locus), or when inserting before gsi_end_p (i.e.
> at the end of bb; in that case it will not set location, otherwise it will
> set it to the location of next stmt).
> This isn't -fcompare-debug friendly, because if inserting after and the
> bb contains only debug stmts, then the location will not be set with -g
> and will be with -g0, or when inserting before, the location might either
> be set from the following debug stmt rather than some non-debug stmt after
> that, or might not be set with -g0 if it is to be inserted at the end of bb,
> while with -g would be set to location of debug stmt.
> 
> The following patch should fix that, bootstrapped/regtested on x86_64-linux
> and i686-linux, ok for trunk?

OK

> 2020-03-24  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR debug/94285
>       * tree-ssa-loop-manip.c (create_iv): If after, set stmt location to
>       e->goto_locus even if gsi_bb (*incr_pos) contains only debug stmts.
>       If not after and at *incr_pos is a debug stmt, set stmt location to
>       location of next non-debug stmt after it if any.
> 
>       * gfortran.dg/pr94285.f90: New test.
> 
> --- gcc/tree-ssa-loop-manip.c.jj      2020-01-12 11:54:38.506381831 +0100
> +++ gcc/tree-ssa-loop-manip.c 2020-03-23 23:57:41.395225047 +0100
> @@ -129,7 +129,10 @@ create_iv (tree base, tree step, tree va
>       immediately after a statement whose location is known.  */
>    if (after)
>      {
> -      if (gsi_end_p (*incr_pos))
> +      if (gsi_end_p (*incr_pos)
> +       || (is_gimple_debug (gsi_stmt (*incr_pos))
> +           && gsi_bb (*incr_pos)
> +           && gsi_end_p (gsi_last_nondebug_bb (gsi_bb (*incr_pos)))))
>       {
>         edge e = single_succ_edge (gsi_bb (*incr_pos));
>         gimple_set_location (stmt, e->goto_locus);
> @@ -138,8 +141,11 @@ create_iv (tree base, tree step, tree va
>      }
>    else
>      {
> -      if (!gsi_end_p (*incr_pos))
> -     gimple_set_location (stmt, gimple_location (gsi_stmt (*incr_pos)));
> +      gimple_stmt_iterator gsi = *incr_pos;
> +      if (!gsi_end_p (gsi) && is_gimple_debug (gsi_stmt (gsi)))
> +     gsi_next_nondebug (&gsi);
> +      if (!gsi_end_p (gsi))
> +     gimple_set_location (stmt, gimple_location (gsi_stmt (gsi)));
>        gsi_insert_before (incr_pos, stmt, GSI_NEW_STMT);
>      }
>  
> --- gcc/testsuite/gfortran.dg/pr94285.f90.jj  2020-03-23 18:55:19.677902869 
> +0100
> +++ gcc/testsuite/gfortran.dg/pr94285.f90     2020-03-23 18:55:01.300172491 
> +0100
> @@ -0,0 +1,5 @@
> +! PR debug/94285
> +! { dg-do compile }
> +! { dg-options "-Os -fno-tree-dominator-opts -fno-tree-vrp -fcompare-debug" }
> +
> +include 'array_constructor_40.f90'
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to