From patchwork Thu May 26 08:11:01 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: ICE with -fgraphite-opencl-ignore-dep Date: Wed, 25 May 2011 22:11:01 -0000 From: Alexey Kravets X-Patchwork-Id: 97505 Message-Id: <4DDE0B15.7060508@ispras.ru> To: Sebastian Pop , gcc-patches@gcc.gnu.org On 05/24/2011 10:21 PM, Sebastian Pop wrote: > > Hi Alexey, > > Thanks again for the cleanup patch. > > While I was testing the change, I found out that there are some flag > combinations that are iceing the compiler. Could you please have > a look at this PR: http://gcc.gnu.org/PR49147 > > Thanks, > Sebastian > Hi Sebastian, Here is the patch for this issue. It is caused by the bug in opencl_get_perfect_nested_loop_depth. This functions ignores -fgraphite-opencl-ignore-dep flag while opencl_transform_stmt_list considers this flag. This patch adds a new function, which should be used to check for dependencies in graphite-opencl. I tested it on PolyKernels and on the block-0.c test from graphite testsuite. Is this patch OK for graphite branch? If it is, could you commit it? gcc: 2011-05-26 Alexey Kravets RP middle-end/49147 * graphite-opencl-codegen.c (opencl_get_perfect_nested_loop_depth): Use enabled_dependency_in_clast_loop_p instead of dependency_in_clast_loop_p. graphite-opencl.c (opencl_transform_stmt_list): Ditto. (enabled_dependency_in_clast_loop_p): New. graphite-opencl.h (enabled_dependency_in_clast_loop_p): Export. testsuite: 2011-05-26 Alexey Kravets RP middle-end/49147 * gcc.dg/graphite/pr49147.c: New test. diff --git a/gcc/graphite-opencl-codegen.c b/gcc/graphite-opencl-codegen.c index 891fef0..67588df 100644 --- a/gcc/graphite-opencl-codegen.c +++ b/gcc/graphite-opencl-codegen.c @@ -280,7 +280,7 @@ opencl_get_perfect_nested_loop_depth (opencl_main code_gen, { struct clast_for *child; - if (dependency_in_clast_loop_p (code_gen, meta, loop, depth)) + if (enabled_dependency_in_clast_loop_p (code_gen, meta, loop, depth)) return 0; child = opencl_get_single_loop_child (loop); diff --git a/gcc/graphite-opencl.c b/gcc/graphite-opencl.c index 53704d2..a4ce5aa 100644 --- a/gcc/graphite-opencl.c +++ b/gcc/graphite-opencl.c @@ -2144,9 +2144,8 @@ opencl_transform_stmt_list (struct clast_stmt *s, opencl_main code_gen, bool parallel = false; /* If there are dependencies in loop, it can't be parallelized. */ - if (!flag_graphite_opencl_no_dep_check && - dependency_in_clast_loop_p (code_gen, current_clast, - for_stmt, depth)) + if (enabled_dependency_in_clast_loop_p (code_gen, current_clast, + for_stmt, depth)) { if (dump_p) fprintf (dump_file, "dependency in loop\n"); @@ -2609,6 +2608,20 @@ dependency_in_clast_loop_p (opencl_main code_gen, opencl_clast_meta meta, return false; } +/* Returns true, if dependency checking enabled and there is dependency in + clast loop STMT on depth DEPTH. + CODE_GEN holds information related to code generation. */ + +bool +enabled_dependency_in_clast_loop_p (opencl_main code_gen, + opencl_clast_meta meta, + struct clast_for *stmt, int depth) +{ + if (flag_graphite_opencl_no_dep_check) + return false; + return dependency_in_clast_loop_p (code_gen, meta, stmt, depth); +} + /* Init graphite-opencl pass. Must be called in each function before any scop processing. */ diff --git a/gcc/graphite-opencl.h b/gcc/graphite-opencl.h index dd047c9..1fab592 100644 --- a/gcc/graphite-opencl.h +++ b/gcc/graphite-opencl.h @@ -251,4 +251,6 @@ extern bool opencl_should_be_parallel_p (opencl_main, opencl_clast_meta, int); extern basic_block opencl_create_bb (opencl_main); extern bool dependency_in_clast_loop_p (opencl_main, opencl_clast_meta, struct clast_for *, int); +extern bool enabled_dependency_in_clast_loop_p (opencl_main, opencl_clast_meta, + struct clast_for *, int); extern tree opencl_get_base_object_by_tree (tree); diff --git a/gcc/testsuite/gcc.dg/graphite/pr49147.c b/gcc/testsuite/gcc.dg/graphite/pr49147.c new file mode 100644 index 0000000..d5f5f30 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/pr49147.c @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-options "-fgraphite-opencl -fgraphite-opencl-ignore-dep -g -Ofast" } */ + +#define DEBUG 0 +#if DEBUG +#include +#endif + +#define N 1000 +int a[N]; + +static int __attribute__((noinline)) +foo (void) +{ + int j; + int i; + + /* This is not blocked as it is not profitable. */ + for (i = 0; i < N; i++) + for (j = 0; j < N; j++) + a[j] = a[i] + 1; + + return a[0]; +} + +extern void abort (); + +int +main (void) +{ + int i, res; + + for (i = 0; i < N; i++) + a[i] = i; + + res = foo (); + +#if DEBUG + fprintf (stderr, "res = %d \n", res); +#endif + + if (res != 1999) + abort (); + + return 0; +}