diff mbox series

loop-manip: Avoid -fcompare-debug issues in create_iv [PR94285]

Message ID 20200324081559.GN2156@tucnak
State New
Headers show
Series loop-manip: Avoid -fcompare-debug issues in create_iv [PR94285] | expand

Commit Message

Li, Pan2 via Gcc-patches March 24, 2020, 8:15 a.m. UTC
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  <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.


	Jakub

Comments

Richard Biener March 24, 2020, 8:17 a.m. UTC | #1
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  <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/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
> 
>
diff mbox series

Patch

--- 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'