diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/omp-low.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/goacc/reduction-6.c | 58 |
4 files changed, 79 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5142c92..2f19c25 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 678c36e..3f7debf 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -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:; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ed2ce1c..0595ceb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..619f82b --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/reduction-6.c @@ -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; +} |