Hi Thomas, This patch addresses two bugs openacc reduction clause bugs. The first bug occurred because I didn't anticipate a GIMPLE_BIND stmt to be passed to process_reduction_data. Turns out, this could happen with the collapse clause. That's because the variables which were declared inside the inner loops need to be declared outside of the collapsed loop nest.
The second issue is that process_reduction_clause adds unnecessary code if a reduction clause isn't present. The patch prevents that from happening. Is this OK for gomp-4_0-branch? I didn't include any test cases, because these bugs were exposed by the collapse clause patch. Thanks, Cesar
diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 227ff1b..eb078b6 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -9679,11 +9679,23 @@ process_reduction_data (gimple_seq *body, gimple_seq *in_stmt_seqp, gcc_assert (is_gimple_omp_oacc_specifically (ctx->stmt)); gimple_stmt_iterator gsi; + gimple_seq inner; + gimple stmt; + + /* A collapse clause may have inserted a new bind block. */ + stmt = gimple_seq_first (*body); + if (stmt && gimple_code (stmt) == GIMPLE_BIND) + { + inner = gimple_bind_body (gimple_seq_first (*body)); + body = &inner; + } for (gsi = gsi_start (*body); !gsi_end_p (gsi); gsi_next (&gsi)) { gimple stmt = gsi_stmt (gsi); tree call; + tree clauses, nthreads, t, c; + bool reduction_found = false; switch (gimple_code (stmt)) { @@ -9691,6 +9703,18 @@ process_reduction_data (gimple_seq *body, gimple_seq *in_stmt_seqp, tree clauses, nthreads, t; clauses = gimple_omp_for_clauses (stmt); + + /* Search for a reduction clause. */ + for (c = clauses; c; c = OMP_CLAUSE_CHAIN (c)) + if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION) + { + reduction_found = true; + break; + } + + if (!reduction_found) + break; + ctx = maybe_lookup_ctx (stmt); t = NULL_TREE; @@ -9698,8 +9722,6 @@ process_reduction_data (gimple_seq *body, gimple_seq *in_stmt_seqp, Scan for the innermost vector_length clause. */ for (omp_context *oc = ctx; oc; oc = oc->outer) { - tree c; - switch (gimple_code (oc->stmt)) { case GIMPLE_OACC_PARALLEL: