diff mbox

[gomp-4_0-branch] misc reduction clause bug fixes

Message ID 53C44C30.6000904@codesourcery.com
State New
Headers show

Commit Message

Cesar Philippidis July 14, 2014, 9:31 p.m. UTC
On 07/11/2014 02:15 AM, Thomas Schwinge wrote:
> Hi Cesar!
> 
> On Thu, 10 Jul 2014 11:43:11 -0700, Cesar Philippidis <cesar@codesourcery.com> wrote:
>> This patch addresses two bugs openacc reduction clause bugs.
> 
> Thanks!  OK; one question/suggestion, though:
> 
>> --- 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);
> 
> Can get rid of this shadow variable stmt?

I've committed the attach patch which incorporates that change.

Cesar
diff mbox

Patch

2014-07-14  Cesar Philippidis  <cesar@codesourcery.com>

	gcc/
	* omp-low.c (process_reduction_data): Check for new
	binding level and skip for-loops which don't have a
	reduction clause.


diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 227ff1b..b08bc6b 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -9679,11 +9679,24 @@  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;
+ 
+      stmt = gsi_stmt (gsi);
 
       switch (gimple_code (stmt))
 	{
@@ -9691,6 +9704,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 +9723,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: