[gcc(refs/users/marxin/heads/marxin-gcc-benchmark-branch)] loop-manip: Avoid -fcompare-debug issues in create_iv [PR94285]

Martin Liska marxin@gcc.gnu.org
Mon Mar 30 11:04:20 GMT 2020


https://gcc.gnu.org/g:565ab7efbdc68cca5a2a81d872015f33359048b4

commit 565ab7efbdc68cca5a2a81d872015f33359048b4
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Mar 24 09:36:32 2020 +0100

    loop-manip: Avoid -fcompare-debug issues in create_iv [PR94285]
    
    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.

Diff:
---
 gcc/ChangeLog                         |  6 ++++++
 gcc/testsuite/ChangeLog               |  3 +++
 gcc/testsuite/gfortran.dg/pr94285.f90 |  5 +++++
 gcc/tree-ssa-loop-manip.c             | 12 +++++++++---
 4 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 51cb52dbb10..976f87cd408 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e050d159d5c..de25dfb4f86 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..8ee7f7f9021
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr94285.f90
@@ -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'
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index 120b35b8d8b..a2717a411a3 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -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);
     }


More information about the Gcc-cvs mailing list