public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-5621] Consolidate OpenACC "gang reduction on an orphan loop" checking
@ 2021-11-30 12:00 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2021-11-30 12:00 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:77d24d43644909852998043335b5a0e09d1e8f02

commit r12-5621-g77d24d43644909852998043335b5a0e09d1e8f02
Author: Thomas Schwinge <thomas@codesourcery.com>
Date:   Fri Nov 26 12:29:26 2021 +0100

    Consolidate OpenACC "gang reduction on an orphan loop" checking
    
    No need to implement separately in all front ends what we may implement in the
    middle end, once for all.
    
    Follow-up to preceding commit 2b7dac2c0dcb087da9e4018943c023c0678234a3
    "Make OpenACC orphan gang reductions errors".
    
            gcc/
            * omp-offload.c (oacc_loop_process): Implement "gang reduction on
            an orphan loop" checking.
            gcc/c/
            * c-typeck.c (c_finish_omp_clauses): Remove "gang reduction on an
            orphan loop" checking.
            gcc/cp/
            * semantics.c (finish_omp_clauses): Remove "gang reduction on an
            orphan loop" checking.
            gcc/fortran/
            * openmp.c (resolve_oacc_loop_blocks): Remove "gang reduction on
            an orphan loop" checking.
            (oacc_is_parallel, oacc_is_kernels, oacc_is_serial)
            (oacc_is_compute_construct): Remove.
            gcc/testsuite/
            * gfortran.dg/goacc/orphan-reductions-1.f90: Adjust.

Diff:
---
 gcc/c/c-typeck.c                                   |  8 -----
 gcc/cp/semantics.c                                 |  8 -----
 gcc/fortran/openmp.c                               | 37 ----------------------
 gcc/omp-offload.c                                  | 20 +++++++++---
 .../gfortran.dg/goacc/orphan-reductions-1.f90      |  8 ++---
 5 files changed, 20 insertions(+), 61 deletions(-)

diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index a025740e618..7524304f2bd 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -14135,14 +14135,6 @@ c_finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
 	  goto check_dup_generic;
 
 	case OMP_CLAUSE_REDUCTION:
-	  if (ort == C_ORT_ACC && oacc_get_fn_attrib (current_function_decl)
-	      && omp_find_clause (clauses, OMP_CLAUSE_GANG))
-	    {
-	      error_at (OMP_CLAUSE_LOCATION (c),
-			"gang reduction on an orphan loop");
-	      remove = true;
-	      break;
-	    }
 	  if (reduction_seen == 0)
 	    reduction_seen = OMP_CLAUSE_REDUCTION_INSCAN (c) ? -1 : 1;
 	  else if (reduction_seen != -2
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index c84caf43251..cd1956497f8 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -6667,14 +6667,6 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
 	  field_ok = ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP);
 	  goto check_dup_generic;
 	case OMP_CLAUSE_REDUCTION:
-	  if (ort == C_ORT_ACC && oacc_get_fn_attrib (current_function_decl)
-	      && omp_find_clause (clauses, OMP_CLAUSE_GANG))
-	    {
-	      error_at (OMP_CLAUSE_LOCATION (c),
-			"gang reduction on an orphan loop");
-	      remove = true;
-	      break;
-	    }
 	  if (reduction_seen == 0)
 	    reduction_seen = OMP_CLAUSE_REDUCTION_INSCAN (c) ? -1 : 1;
 	  else if (reduction_seen != -2
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 7950c7fb43d..d120be81467 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -8322,31 +8322,6 @@ resolve_omp_do (gfc_code *code)
     }
 }
 
-static bool
-oacc_is_parallel (gfc_code *code)
-{
-  return code->op == EXEC_OACC_PARALLEL || code->op == EXEC_OACC_PARALLEL_LOOP;
-}
-
-static bool
-oacc_is_kernels (gfc_code *code)
-{
-  return code->op == EXEC_OACC_KERNELS || code->op == EXEC_OACC_KERNELS_LOOP;
-}
-
-static bool
-oacc_is_serial (gfc_code *code)
-{
-  return code->op == EXEC_OACC_SERIAL || code->op == EXEC_OACC_SERIAL_LOOP;
-}
-
-static bool
-oacc_is_compute_construct (gfc_code *code)
-{
-  return (oacc_is_parallel (code)
-	  || oacc_is_kernels (code)
-	  || oacc_is_serial (code));
-}
 
 static gfc_statement
 omp_code_to_statement (gfc_code *code)
@@ -8650,18 +8625,6 @@ resolve_oacc_loop_blocks (gfc_code *code)
   if (!oacc_is_loop (code))
     return;
 
-  if (code->op == EXEC_OACC_LOOP
-      && code->ext.omp_clauses->lists[OMP_LIST_REDUCTION]
-      && code->ext.omp_clauses->gang)
-    {
-      fortran_omp_context *c;
-      for (c = omp_current_ctx; c; c = c->previous)
-	if (!oacc_is_loop (c->code))
-	  break;
-      if (c == NULL || !(oacc_is_compute_construct (c->code)))
-	gfc_error ("gang reduction on an orphan loop at %L", &code->loc);
-    }
-
   if (code->ext.omp_clauses->tile_list && code->ext.omp_clauses->gang
       && code->ext.omp_clauses->worker && code->ext.omp_clauses->vector)
     gfc_error ("Tiled loop cannot be parallelized across gangs, workers and "
diff --git a/gcc/omp-offload.c b/gcc/omp-offload.c
index 0aec26b04e7..5110a424584 100644
--- a/gcc/omp-offload.c
+++ b/gcc/omp-offload.c
@@ -1380,10 +1380,10 @@ oacc_loop_xform_head_tail (gcall *from, int level)
    partitioning level etc.  */
 
 static void
-oacc_loop_process (oacc_loop *loop)
+oacc_loop_process (oacc_loop *loop, int fn_level)
 {
   if (loop->child)
-    oacc_loop_process (loop->child);
+    oacc_loop_process (loop->child, fn_level);
 
   if (loop->mask && !loop->routine)
     {
@@ -1432,7 +1432,19 @@ oacc_loop_process (oacc_loop *loop)
     }
 
   if (loop->sibling)
-    oacc_loop_process (loop->sibling);
+    oacc_loop_process (loop->sibling, fn_level);
+
+
+  /* OpenACC 2.6, 2.9.11. "reduction clause" places a restriction such that
+     "The 'reduction' clause may not be specified on an orphaned 'loop'
+     construct with the 'gang' clause, or on an orphaned 'loop' construct that
+     will generate gang parallelism in a procedure that is compiled with the
+     'routine gang' clause."  */
+  if (fn_level == GOMP_DIM_GANG
+      && (loop->mask & GOMP_DIM_MASK (GOMP_DIM_GANG))
+      && (loop->flags & OLF_REDUCTION))
+    error_at (loop->loc,
+	      "gang reduction on an orphan loop");
 }
 
 /* Walk the OpenACC loop heirarchy checking and assigning the
@@ -2072,7 +2084,7 @@ execute_oacc_loop_designation ()
   if (is_oacc_parallel_kernels_gang_single)
     gcc_checking_assert (dims[GOMP_DIM_GANG] == 1);
 
-  oacc_loop_process (loops);
+  oacc_loop_process (loops, fn_level);
   if (dump_file)
     {
       fprintf (dump_file, "OpenACC loops\n");
diff --git a/gcc/testsuite/gfortran.dg/goacc/orphan-reductions-1.f90 b/gcc/testsuite/gfortran.dg/goacc/orphan-reductions-1.f90
index c7fcc9d4ac5..464dee1260a 100644
--- a/gcc/testsuite/gfortran.dg/goacc/orphan-reductions-1.f90
+++ b/gcc/testsuite/gfortran.dg/goacc/orphan-reductions-1.f90
@@ -30,7 +30,7 @@ end subroutine s1
 
 subroutine s2
   implicit none
-  !$acc routine worker
+  !$acc routine gang
 
   integer, parameter :: n = 100
   integer :: i, j, sum
@@ -80,7 +80,7 @@ end function f1
 
 integer function f2 ()
   implicit none
-  !$acc routine worker
+  !$acc routine gang
 
   integer, parameter :: n = 100
   integer :: i, j, sum
@@ -132,7 +132,7 @@ contains
 
   subroutine s4
     implicit none
-    !$acc routine worker
+    !$acc routine gang
 
     integer, parameter :: n = 100
     integer :: i, j, sum
@@ -182,7 +182,7 @@ contains
 
   integer function f4 ()
     implicit none
-    !$acc routine worker
+    !$acc routine gang
 
     integer, parameter :: n = 100
     integer :: i, j, sum


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-11-30 12:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-30 12:00 [gcc r12-5621] Consolidate OpenACC "gang reduction on an orphan loop" checking Thomas Schwinge

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).