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?

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

Reply via email to