diff mbox series

Fix PR90716, wrong-debug with loop-distribution

Message ID alpine.LSU.2.20.1906031009580.10704@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR90716, wrong-debug with loop-distribution | expand

Commit Message

Richard Biener June 3, 2019, 8:12 a.m. UTC
Loop removal was processing blocks in the wrong order, reversing
debug stmt execution order between blocks (but having correct
order within a block).

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

The testcase exposes PR90717 and thus currently FAILs with
-flto -fuse-linker-plugin.  We seem to lack a dg-xfail-if
and dg-xfail-run-if isn't applicable here.  Anyhow, hope
that Alex can fix this issue.

Richard.

2019-06-03  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/90716
	* tree-loop-distribution.c (destroy_loop): Process blocks in
	correct order.

	* gcc.dg/guality/pr90716.c: New testcase.
diff mbox series

Patch

Index: gcc/tree-loop-distribution.c
===================================================================
--- gcc/tree-loop-distribution.c	(revision 271803)
+++ gcc/tree-loop-distribution.c	(working copy)
@@ -1104,15 +1104,13 @@  destroy_loop (struct loop *loop)
 
   gimple_stmt_iterator dst_gsi = gsi_after_labels (exit->dest);
   bool safe_p = single_pred_p (exit->dest);
-  i = nbbs;
-  do
+  for (unsigned i = 0; i < nbbs; ++i)
     {
       /* We have made sure to not leave any dangling uses of SSA
          names defined in the loop.  With the exception of virtuals.
 	 Make sure we replace all uses of virtual defs that will remain
 	 outside of the loop with the bare symbol as delete_basic_block
 	 will release them.  */
-      --i;
       for (gphi_iterator gsi = gsi_start_phis (bbs[i]); !gsi_end_p (gsi);
 	   gsi_next (&gsi))
 	{
@@ -1147,7 +1145,6 @@  destroy_loop (struct loop *loop)
 	    gsi_next (&gsi);
 	}
     }
-  while (i != 0);
 
   redirect_edge_pred (exit, src);
   exit->flags &= ~(EDGE_TRUE_VALUE|EDGE_FALSE_VALUE);
Index: gcc/testsuite/gcc.dg/guality/pr90716.c
===================================================================
--- gcc/testsuite/gcc.dg/guality/pr90716.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/guality/pr90716.c	(working copy)
@@ -0,0 +1,25 @@ 
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+void __attribute__((noinline))
+optimize_me_not ()
+{
+  __asm__ volatile ("" : : : "memory");
+}
+int a[7][8];
+int main()
+{
+  int b, j;
+  b = 0;
+  for (; b < 7; b++) {
+      j = 0;
+      for (; j < 8; j++)
+	a[b][j] = 0;
+  }
+  /* j may very well be optimized out, so we cannot test for j == 8.
+     Instead test j + 1 which will make the test UNSUPPORTED if i
+     is optimized out.  Since the test previously had wrong debug
+     with j == 0 this is acceptable.  */
+  optimize_me_not(); /* { dg-final { gdb-test . "j + 1" "9" } } */
+  return 0;
+}