loop-manip: Avoid -fcompare-debug issues in create_iv [PR94285]
authorJakub Jelinek <jakub@redhat.com>
Tue, 24 Mar 2020 08:36:32 +0000 (09:36 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 24 Mar 2020 08:36:32 +0000 (09:36 +0100)
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.

2020-03-24  Jakub Jelinek  <jakub@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/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr94285.f90 [new file with mode: 0644]
gcc/tree-ssa-loop-manip.c

index 51cb52dbb10f6827041b7b5a0953e615c83943e4..976f87cd4086adfee91448f2d4a5ba146a4553e3 100644 (file)
@@ -1,5 +1,11 @@
 2020-03-24  Jakub Jelinek  <jakub@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.
+
        PR debug/94283
        * tree-if-conv.c (ifcvt_local_dce): For gimple debug stmts, just set
        GF_PLF_2, but don't add them to worklist.  Don't add an assigment to
index e050d159d5c8eb8dfc85cb0b79938f73ffa3f8dd..de25dfb4f86802b048a1ead793fbf35bf6071be0 100644 (file)
@@ -1,5 +1,8 @@
 2020-03-24  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/94285
+       * gfortran.dg/pr94285.f90: New test.
+
        PR debug/94283
        * gcc.target/i386/pr94283.c: New test.
 
diff --git a/gcc/testsuite/gfortran.dg/pr94285.f90 b/gcc/testsuite/gfortran.dg/pr94285.f90
new file mode 100644 (file)
index 0000000..8ee7f7f
--- /dev/null
@@ -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'
index 120b35b8d8b3e306d05ba4808cb62be99efb6cbe..a2717a411a32184f5a609d8aff3b7e83711a7f3e 100644 (file)
@@ -129,7 +129,10 @@ create_iv (tree base, tree step, tree var, class loop *loop,
      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 var, class loop *loop,
     }
   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);
     }