omp-low.c (lower_oacc_reductions): Adjust variable lookup to use maybe_lookup_decl...
authorChung-Lin Tang <cltang@codesourcery.com>
Wed, 17 Aug 2016 12:08:30 +0000 (12:08 +0000)
committerChung-Lin Tang <cltang@gcc.gnu.org>
Wed, 17 Aug 2016 12:08:30 +0000 (12:08 +0000)
2016-08-17  Chung-Lin Tang  <cltang@codesourcery.com>

* omp-low.c (lower_oacc_reductions): Adjust variable lookup to use
maybe_lookup_decl, to handle nested acc loop directives.

testsuite/
* c-c++-common/goacc/reduction-6.c: New testcase.

From-SVN: r239530

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/goacc/reduction-6.c [new file with mode: 0644]

index 5142c920e8ee73bf795289174dc08c85aa8202e2..2f19c2585e1b97799f69037aaac415a4321c3efb 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-17  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       * omp-low.c (lower_oacc_reductions): Adjust variable lookup to use
+       maybe_lookup_decl, to handle nested acc loop directives.
+
 2016-08-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/76490
index 678c36ec30749286f26e7ee96fb4900e1de24ce6..3f7debf1fd1e9c5b5d5e9bf32390e4299a7f977a 100644 (file)
@@ -5660,10 +5660,19 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
                outgoing = var;
                incoming = omp_reduction_init_op (loc, rcode, type);
              }
-           else if (ctx->outer)
-             incoming = outgoing = lookup_decl (orig, ctx->outer);
            else
-             incoming = outgoing = orig;
+             {
+               /* Try to look at enclosing contexts for reduction var,
+                  use original if no mapping found.  */
+               tree t = NULL_TREE;
+               omp_context *c = ctx->outer;
+               while (c && !t)
+                 {
+                   t = maybe_lookup_decl (orig, c);
+                   c = c->outer;
+                 }
+               incoming = outgoing = (t ? t : orig);
+             }
              
          has_outer_reduction:;
          }
index ed2ce1c12b344d4fd42732a6918f0dbca3365ece..0595ceb9d75e54b9036fddab9eef8ba5ff109086 100644 (file)
@@ -1,3 +1,7 @@
+2016-08-17  Chung-Lin Tang  <cltang@codesourcery.com>
+
+       * c-c++-common/goacc/reduction-6.c: New testcase.
+
 2016-08-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/76490
diff --git a/gcc/testsuite/c-c++-common/goacc/reduction-6.c b/gcc/testsuite/c-c++-common/goacc/reduction-6.c
new file mode 100644 (file)
index 0000000..619f82b
--- /dev/null
@@ -0,0 +1,58 @@
+/* Check if different occurences of the reduction clause on
+   OpenACC loop nests will compile.  */
+
+int foo (int N)
+{
+  int a = 0, b = 0, c = 0, d = 0, e = 0;
+
+  #pragma acc parallel
+  {
+    #pragma acc loop
+    for (int i = 0; i < N; i++)
+      {
+        #pragma acc loop reduction(+:a)
+       for (int j = 0; j < N; j++)
+         a += 1;
+      }
+  }
+
+  #pragma acc parallel
+  {
+    #pragma acc loop reduction(+:b)
+    for (int i = 0; i < N; i++)
+      {
+        #pragma acc loop
+       for (int j = 0; j < N; j++)
+         b += 1;
+      }
+  }
+
+  #pragma acc parallel
+  {
+    #pragma acc loop reduction(+:c)
+    for (int i = 0; i < N; i++)
+      {
+        #pragma acc loop reduction(+:c)
+       for (int j = 0; j < N; j++)
+         c += 1;
+      }
+  }
+
+  #pragma acc parallel loop
+  for (int i = 0; i < N; i++)
+    {
+      #pragma acc loop reduction(+:d)
+      for (int j = 0; j < N; j++)
+       d += 1;
+    }
+
+  #pragma acc parallel loop reduction(+:e)
+  for (int i = 0; i < N; i++)
+    {
+      #pragma acc loop reduction(+:e)
+      for (int j = 0; j < N; j++)
+       e += 1;
+    }
+
+  return a + b + c + d + e;
+}