Fix PR47653: do not handle loops using wrapping semantics in graphite
authorSebastian Pop <sebastian.pop@amd.com>
Tue, 26 Jul 2011 18:48:08 +0000 (18:48 +0000)
committerSebastian Pop <spop@gcc.gnu.org>
Tue, 26 Jul 2011 18:48:08 +0000 (18:48 +0000)
2011-07-26  Sebastian Pop  <sebastian.pop@amd.com>

PR middle-end/47653
* graphite-scop-detection.c (graphite_can_represent_loop): Discard
loops using wrapping semantics.

* gcc.dg/graphite/run-id-pr47653.c: New.
* gcc.dg/graphite/interchange-3.c: Do not use unsigned types for
induction variables.
* gcc.dg/graphite/scop-16.c: Same.
* gcc.dg/graphite/scop-17.c: Same.
* gcc.dg/graphite/scop-21.c: Same.

From-SVN: r176802

gcc/ChangeLog
gcc/graphite-scop-detection.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/graphite/interchange-3.c
gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/graphite/scop-16.c
gcc/testsuite/gcc.dg/graphite/scop-17.c
gcc/testsuite/gcc.dg/graphite/scop-21.c
libgomp/testsuite/libgomp.graphite/force-parallel-1.c

index d3d99195889358797fb90cfc20f199a1bb0b70a7..92ca45b4dbc12ad863572bd9801124a8eed8f322 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-26  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR middle-end/47653
+       * graphite-scop-detection.c (graphite_can_represent_loop): Discard
+       loops using wrapping semantics.
+
 2011-07-26  Sebastian Pop  <sebastian.pop@amd.com>
 
        PR middle-end/48805
index 45c6c75ccea1fa02a8497574c2f15aad762b2096..346056899d31466379f89ed213ea49de898ec9b9 100644 (file)
@@ -378,17 +378,17 @@ harmful_stmt_in_bb (basic_block scop_entry, loop_p outer_loop, basic_block bb)
 static bool
 graphite_can_represent_loop (basic_block scop_entry, loop_p loop)
 {
-  tree niter = number_of_latch_executions (loop);
+  tree niter;
+  struct tree_niter_desc niter_desc;
 
-  /* Number of iterations unknown.  */
-  if (chrec_contains_undetermined (niter))
-    return false;
-
-  /* Number of iterations not affine.  */
-  if (!graphite_can_represent_expr (scop_entry, loop, niter))
-    return false;
+  /* FIXME: For the moment, graphite cannot be used on loops that
+     iterate using induction variables that wrap.  */
 
-  return true;
+  return number_of_iterations_exit (loop, single_exit (loop), &niter_desc, false)
+    && niter_desc.control.no_overflow
+    && (niter = number_of_latch_executions (loop))
+    && !chrec_contains_undetermined (niter)
+    && graphite_can_represent_expr (scop_entry, loop, niter);
 }
 
 /* Store information needed by scopdet_* functions.  */
index 4e0adb1490023647e635d0fba1fa09c615a2639a..4efc523376b8963f3662b76e783e86141a71ddab 100644 (file)
@@ -1,3 +1,13 @@
+2011-07-26  Sebastian Pop  <sebastian.pop@amd.com>
+
+       PR middle-end/47653
+       * gcc.dg/graphite/run-id-pr47653.c: New.
+       * gcc.dg/graphite/interchange-3.c: Do not use unsigned types for
+       induction variables.
+       * gcc.dg/graphite/scop-16.c: Same.
+       * gcc.dg/graphite/scop-17.c: Same.
+       * gcc.dg/graphite/scop-21.c: Same.
+
 2011-07-26  Sebastian Pop  <sebastian.pop@amd.com>
 
        PR middle-end/48805
index 26ec4d9d5db0fee086e7134e16b0668499522916..1419749243a965cbb684203cfc563b9bc34c5ad4 100644 (file)
@@ -12,7 +12,7 @@ double u[1782225];
 static void __attribute__((noinline))
 foo (int N, int *res)
 {
-  unsigned int i, j;
+  int i, j;
   double sum = 0;
   for (i = 0; i < N; i++)
     {
diff --git a/gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c b/gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c
new file mode 100644 (file)
index 0000000..b62b891
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-options "-O -fstack-check=generic -ftree-pre -fgraphite-identity" } */
+
+int main ()
+{
+  int i, j;
+  int x[8][8];
+  for (i = 0; i < 8; i++)
+    for (j = i; j < 8; j++)
+      x[i][j] = 4;
+
+  for (i = 0; i < 8; i++)
+    for (j = i; j < 8; j++)
+      if (x[i][j] != 4)
+       __builtin_abort ();
+
+  return 0;
+}
index 0849e86b855380fbb4722c3d27d9aca4824fe7cd..83cbb9698668fd759a7511ad534c72ab55b6697d 100644 (file)
@@ -6,7 +6,7 @@ int test ()
 {
   int a[N][N];
   int b[N][N];
-  unsigned i, j;
+  int i, j;
 
   for (i = 0; i < N; i++) 
     for (j = 0; j < N; j++)
index ee37aea95872b1e1276011d631d3bab4a339de1d..a7dff5f6c02ab3a51e192c4eff353071cba3990e 100644 (file)
@@ -5,7 +5,7 @@ void foo (int);
 int test ()
 {
   int a[N][N];
-  unsigned i, j;
+  int i, j;
 
   for (i = 0; i < N; i++) 
     for (j = 0; j < N; j++)
index 5e58834ca78b7ac5795314f9c8c214f005e75c02..1cbad5d8cd15efaca8afb84d801b7b37d48d01bc 100644 (file)
@@ -3,7 +3,7 @@ void foo (int);
 int test ()
 {
   int a[N+6];
-  unsigned i;
+  int i;
 
   for (i = 0; i < N; i++)
     {
index 7f043d83d8b11fce586eb6f65b2f6cda0438eceb..71ed3324307f7b8d43beb819d8ae8223c392255b 100644 (file)
@@ -23,7 +23,7 @@ int main(void)
 }
 
 /* Check that parallel code generation part make the right answer.  */
-/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 2 "graphite" } } */
+/* { dg-final { scan-tree-dump-times "1 loops carried no dependency" 2 "graphite" { xfail *-*-* } } } */
 /* { dg-final { cleanup-tree-dump "graphite" } } */
 /* { dg-final { scan-tree-dump-times "loopfn" 5 "optimized" } } */
 /* { dg-final { cleanup-tree-dump "parloops" } } */