Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2018-01-09  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/83572
        * graphite.c: Include cfganal.h.
        (graphite_transform_loops): Connect infinite loops to exit
        and remove fake edges at the end.

        * gcc.dg/graphite/pr83572.c: New testcase.

Index: gcc/graphite.c
===================================================================
--- gcc/graphite.c      (revision 256343)
+++ gcc/graphite.c      (working copy)
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3.
 #include "tree-pass.h"
 #include "params.h"
 #include "pretty-print.h"
+#include "cfganal.h"
 
 #ifdef HAVE_isl
 #include "cfghooks.h"
@@ -350,6 +351,10 @@ graphite_transform_loops (void)
 
   calculate_dominance_info (CDI_DOMINATORS);
 
+  /* We rely on post-dominators during merging of SESE regions so those
+     have to be meaningful.  */
+  connect_infinite_loops_to_exit ();
+
   ctx = isl_ctx_alloc ();
   isl_options_set_on_error (ctx, ISL_ON_ERROR_ABORT);
   the_isl_ctx = ctx;
@@ -368,6 +373,10 @@ graphite_transform_loops (void)
   build_scops (&scops);
   free_dominance_info (CDI_POST_DOMINATORS);
 
+  /* Remove the fake exits before transform given they are not reflected
+     in loop structures we end up verifying.  */
+  remove_fake_exit_edges ();
+
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       print_graphite_statistics (dump_file, scops);
@@ -428,7 +437,6 @@ graphite_transform_loops (void)
       release_recorded_exits (cfun);
       tree_estimate_probability (false);
     }
-
 }
 
 #else /* If isl is not available: #ifndef HAVE_isl.  */
Index: gcc/testsuite/gcc.dg/graphite/pr83572.c
===================================================================
--- gcc/testsuite/gcc.dg/graphite/pr83572.c     (nonexistent)
+++ gcc/testsuite/gcc.dg/graphite/pr83572.c     (working copy)
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O -floop-nest-optimize -fno-tree-loop-im" } */
+
+int u0, l1;
+
+void
+u3 (int s1)
+{
+  for (;;)
+    {
+      for (u0 = 0; u0 < 2; ++u0)
+       {
+       }
+
+      if (s1 != 0)
+       for (l1 = 0; l1 < 2; ++l1)
+         {
+         }
+
+      l1 = 0;
+    }
+}

Reply via email to