From cbc1994b2f3fee67209b7476f62ea698902e39f3 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Tue, 26 Jul 2011 18:48:08 +0000 Subject: [PATCH] Fix PR47653: do not handle loops using wrapping semantics in graphite 2011-07-26 Sebastian Pop 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 | 6 ++++++ gcc/graphite-scop-detection.c | 18 +++++++++--------- gcc/testsuite/ChangeLog | 10 ++++++++++ gcc/testsuite/gcc.dg/graphite/interchange-3.c | 2 +- gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c | 17 +++++++++++++++++ gcc/testsuite/gcc.dg/graphite/scop-16.c | 2 +- gcc/testsuite/gcc.dg/graphite/scop-17.c | 2 +- gcc/testsuite/gcc.dg/graphite/scop-21.c | 2 +- .../libgomp.graphite/force-parallel-1.c | 2 +- 9 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d3d99195889..92ca45b4dbc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-26 Sebastian Pop + + PR middle-end/47653 + * graphite-scop-detection.c (graphite_can_represent_loop): Discard + loops using wrapping semantics. + 2011-07-26 Sebastian Pop PR middle-end/48805 diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 45c6c75ccea..346056899d3 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4e0adb14900..4efc523376b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2011-07-26 Sebastian Pop + + 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 PR middle-end/48805 diff --git a/gcc/testsuite/gcc.dg/graphite/interchange-3.c b/gcc/testsuite/gcc.dg/graphite/interchange-3.c index 26ec4d9d5db..1419749243a 100644 --- a/gcc/testsuite/gcc.dg/graphite/interchange-3.c +++ b/gcc/testsuite/gcc.dg/graphite/interchange-3.c @@ -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 index 00000000000..b62b891d996 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/run-id-pr47653.c @@ -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; +} diff --git a/gcc/testsuite/gcc.dg/graphite/scop-16.c b/gcc/testsuite/gcc.dg/graphite/scop-16.c index 0849e86b855..83cbb969866 100644 --- a/gcc/testsuite/gcc.dg/graphite/scop-16.c +++ b/gcc/testsuite/gcc.dg/graphite/scop-16.c @@ -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++) diff --git a/gcc/testsuite/gcc.dg/graphite/scop-17.c b/gcc/testsuite/gcc.dg/graphite/scop-17.c index ee37aea9587..a7dff5f6c02 100644 --- a/gcc/testsuite/gcc.dg/graphite/scop-17.c +++ b/gcc/testsuite/gcc.dg/graphite/scop-17.c @@ -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++) diff --git a/gcc/testsuite/gcc.dg/graphite/scop-21.c b/gcc/testsuite/gcc.dg/graphite/scop-21.c index 5e58834ca78..1cbad5d8cd1 100644 --- a/gcc/testsuite/gcc.dg/graphite/scop-21.c +++ b/gcc/testsuite/gcc.dg/graphite/scop-21.c @@ -3,7 +3,7 @@ void foo (int); int test () { int a[N+6]; - unsigned i; + int i; for (i = 0; i < N; i++) { diff --git a/libgomp/testsuite/libgomp.graphite/force-parallel-1.c b/libgomp/testsuite/libgomp.graphite/force-parallel-1.c index 7f043d83d8b..71ed3324307 100644 --- a/libgomp/testsuite/libgomp.graphite/force-parallel-1.c +++ b/libgomp/testsuite/libgomp.graphite/force-parallel-1.c @@ -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" } } */ -- 2.30.2