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  <kayr...@ispras.ru>

        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  <kayr...@ispras.ru>

        RP middle-end/49147
        * gcc.dg/graphite/pr49147.c: New test.
--
Alexey Kravets

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 <stdio.h>
+#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;
+}

Reply via email to