[gcc/devel/omp/gcc-16] Reference reduction localization

Sandra Loosemore via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:ed63902c5dc58f7751f5f200cebae50fe9c741a1

commit ed63902c5dc58f7751f5f200cebae50fe9c741a1
Author: Cesar Philippidis <[email protected]>
Date:   Tue Apr 15 15:56:38 2025 +0000

    Reference reduction localization
    
    gcc/ChangeLog
            * gimplify.cc (privatize_reduction): New struct.
            (localize_reductions_r, localize_reductions): New functions.
            (gimplify_omp_for): Call localize_reductions.
            (gimplify_omp_workshare): Likewise.
            * omp-low.cc (lower_oacc_reductions): Handle localized reductions.
            Create fewer temp vars.
            * tree-core.h (omp_clause_code): Add OMP_CLAUSE_REDUCTION_PRIVATE_DECL
            documentation.
            * tree.cc (omp_clause_num_ops): Bump number of ops for
            OMP_CLAUSE_REDUCTION to 6.
            (walk_tree_1): Adjust accordingly.
            * tree.h (OMP_CLAUSE_REDUCTION_PRIVATE_DECL): Add macro.
    
    gcc/testsuite/ChangeLog
            * gfortran.dg/goacc/modules.f95: Remove xfail on bogus warnings.
    
    libgomp/ChangeLog
            * testsuite/libgomp.oacc-fortran/optional-reduction.f90: Remove
            xfail on bogus warnings.
            * testsuite/libgomp.oacc-fortran/parallel-reduction.f90: Likewise.
            * testsuite/libgomp.oacc-fortran/pr70643.f90: Likewise.
            * testsuite/libgomp.oacc-fortran/reduction-5.f90: Likewise.
            * testsuite/libgomp.oacc-fortran/reduction-7.f90: Likewise.
            * testsuite/libgomp.oacc-fortran/reference-reductions.f90: Likewise.
    
    Co-Authored-By: Julian Brown <[email protected]>
    Co-Authored-By: Sandra Loosemore <[email protected]>

Diff:
---
 gcc/gimplify.cc                                    | 102 +++++++++++++++++++++
 gcc/omp-low.cc                                     |  45 +++------
 gcc/testsuite/gfortran.dg/goacc/modules.f95        |   3 +-
 gcc/tree-core.h                                    |   4 +-
 gcc/tree.cc                                        |   2 +-
 gcc/tree.h                                         |   2 +
 .../libgomp.oacc-fortran/optional-reduction.f90    |  12 +--
 .../libgomp.oacc-fortran/parallel-reduction.f90    |   8 +-
 libgomp/testsuite/libgomp.oacc-fortran/pr70643.f90 |   3 +-
 .../testsuite/libgomp.oacc-fortran/reduction-5.f90 |  18 ++--
 .../testsuite/libgomp.oacc-fortran/reduction-7.f90 |   8 +-
 .../libgomp.oacc-fortran/reference-reductions.f90  |   6 +-
 12 files changed, 140 insertions(+), 73 deletions(-)

diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 8bacc5e921f2..4ecded552408 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -304,6 +304,11 @@ struct gimplify_omp_ctx
   int defaultmap[5];
 };
 
+struct privatize_reduction
+{
+  tree ref_var, local_var;
+};
+
 static struct gimplify_ctx *gimplify_ctxp;
 static struct gimplify_omp_ctx *gimplify_omp_ctxp;
 static bool in_omp_construct;
@@ -17340,6 +17345,80 @@ gimplify_omp_loop_xform (tree *expr_p, gimple_seq *pre_p)
   return GS_ALL_DONE;
 }
 
+/* Helper function for localize_reductions.  Replace all uses of REF_VAR with
+   LOCAL_VAR.  */
+
+static tree
+localize_reductions_r (tree *tp, int *walk_subtrees, void *data)
+{
+  enum tree_code tc = TREE_CODE (*tp);
+  struct privatize_reduction *pr = (struct privatize_reduction *) data;
+
+  if (TYPE_P (*tp))
+    *walk_subtrees = 0;
+
+  switch (tc)
+    {
+    case INDIRECT_REF:
+    case MEM_REF:
+      if (TREE_OPERAND (*tp, 0) == pr->ref_var)
+	*tp = pr->local_var;
+
+      *walk_subtrees = 0;
+      break;
+
+    case VAR_DECL:
+    case PARM_DECL:
+    case RESULT_DECL:
+      if (*tp == pr->ref_var)
+	*tp = pr->local_var;
+
+      *walk_subtrees = 0;
+      break;
+
+    default:
+      break;
+    }
+
+  return NULL_TREE;
+}
+
+/* OpenACC worker and vector loop state propagation requires reductions
+   to be inside local variables.  This function replaces all reference-type
+   reductions variables associated with the loop with a local copy.  It is
+   also used to create private copies of reduction variables for those
+   which are not associated with acc loops.  */
+
+static void
+localize_reductions (tree clauses, tree body)
+{
+  tree c, var, type, new_var;
+  struct privatize_reduction pr;
+
+  for (c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
+    if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION)
+      {
+	var = OMP_CLAUSE_DECL (c);
+
+	if (!lang_hooks.decls.omp_privatize_by_reference (var))
+	  {
+	    OMP_CLAUSE_REDUCTION_PRIVATE_DECL (c) = NULL;
+	    continue;
+	  }
+
+	type = TREE_TYPE (TREE_TYPE (var));
+	new_var = create_tmp_var (type, IDENTIFIER_POINTER (DECL_NAME (var)));
+
+	pr.ref_var = var;
+	pr.local_var = new_var;
+
+	walk_tree (&body, localize_reductions_r, &pr, NULL);
+
+	OMP_CLAUSE_REDUCTION_PRIVATE_DECL (c) = new_var;
+      }
+}
+
+
 /* Gimplify the gross structure of an OMP_FOR statement.  */
 
 static enum gimplify_status
@@ -17599,6 +17678,24 @@ gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
       gcc_unreachable ();
     }
 
+  if (ort == ORT_ACC)
+    {
+      gimplify_omp_ctx *outer = gimplify_omp_ctxp;
+
+      while (outer
+	     && outer->region_type != ORT_ACC_PARALLEL
+	     && outer->region_type != ORT_ACC_KERNELS)
+	outer = outer->outer_context;
+
+      /* FIXME: Reductions only work in parallel regions at present.  We avoid
+	 doing the reduction localization transformation in kernels regions
+	 here, because the code to remove reductions in kernels regions cannot
+	 handle that.  */
+      if (outer && outer->region_type == ORT_ACC_PARALLEL)
+	localize_reductions (OMP_FOR_CLAUSES (for_stmt),
+			     OMP_FOR_BODY (for_stmt));
+    }
+
   /* Set OMP_CLAUSE_LINEAR_NO_COPYIN flag on explicit linear
      clause for the IV.  */
   if (ort == ORT_SIMD && TREE_VEC_LENGTH (OMP_FOR_INIT (for_stmt)) == 1)
@@ -19218,6 +19315,11 @@ gimplify_omp_workshare (tree *expr_p, gimple_seq *pre_p)
       || (ort & ORT_HOST_TEAMS) == ORT_HOST_TEAMS)
     {
       push_gimplify_context ();
+
+      /* FIXME: Reductions are not supported in kernels regions yet.  */
+      if (/*ort == ORT_ACC_KERNELS ||*/ ort == ORT_ACC_PARALLEL)
+	localize_reductions (OMP_CLAUSES (expr), OMP_BODY (expr));
+
       gimple *g = gimplify_and_return_first (OMP_BODY (expr), &body);
       if (gimple_code (g) == GIMPLE_BIND)
 	pop_gimplify_context (g);
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index cf6982d9440e..4142f8497a0c 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -7765,9 +7765,9 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
 
 	tree orig = OMP_CLAUSE_DECL (c);
 	tree orig_clause;
-	tree var = maybe_lookup_decl (orig, ctx);
+	tree var;
 	tree ref_to_res = NULL_TREE;
-	tree incoming, outgoing, v1, v2, v3;
+	tree incoming, outgoing;
 	bool is_private = false;
 	bool is_fpp = false;
 
@@ -7780,6 +7780,9 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
 	  rcode = BIT_IOR_EXPR;
 	tree op = build_int_cst (unsigned_type_node, rcode);
 
+	var = OMP_CLAUSE_REDUCTION_PRIVATE_DECL (c);
+	if (!var)
+	  var = maybe_lookup_decl (orig, ctx);
 	if (!var)
 	  var = orig;
 
@@ -7898,37 +7901,13 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
 	if (!ref_to_res)
 	  ref_to_res = integer_zero_node;
 
-	if (omp_privatize_by_reference (orig))
+	if (omp_privatize_by_reference (outgoing))
 	  {
-	    tree type = TREE_TYPE (var);
-	    const char *id = IDENTIFIER_POINTER (DECL_NAME (var));
-
-	    if (!inner)
-	      {
-		tree x = create_tmp_var (TREE_TYPE (type), id);
-		gimplify_assign (var, build_fold_addr_expr (x), fork_seq);
-	      }
-
-	    v1 = create_tmp_var (type, id);
-	    v2 = create_tmp_var (type, id);
-	    v3 = create_tmp_var (type, id);
-
-	    gimplify_assign (v1, var, fork_seq);
-	    gimplify_assign (v2, var, fork_seq);
-	    gimplify_assign (v3, var, fork_seq);
-
-	    var = build_simple_mem_ref (var);
-	    v1 = build_simple_mem_ref (v1);
-	    v2 = build_simple_mem_ref (v2);
-	    v3 = build_simple_mem_ref (v3);
 	    outgoing = build_simple_mem_ref (outgoing);
 
 	    if (!TREE_CONSTANT (incoming))
 	      incoming = build_simple_mem_ref (incoming);
 	  }
-	else
-	  /* Note that 'var' might be a mem ref.  */
-	  v1 = v2 = v3 = var;
 
 	/* Determine position in reduction buffer, which may be used
 	   by target.  The parser has ensured that this is not a
@@ -7962,21 +7941,21 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
 	  = build_call_expr_internal_loc (loc, IFN_GOACC_REDUCTION,
 					  TREE_TYPE (var), 6, init_code,
 					  unshare_expr (ref_to_res),
-					  unshare_expr (v1), level, op, off);
+					  unshare_expr (var), level, op, off);
 	tree fini_call
 	  = build_call_expr_internal_loc (loc, IFN_GOACC_REDUCTION,
 					  TREE_TYPE (var), 6, fini_code,
 					  unshare_expr (ref_to_res),
-					  unshare_expr (v2), level, op, off);
+					  unshare_expr (var), level, op, off);
 	tree teardown_call
 	  = build_call_expr_internal_loc (loc, IFN_GOACC_REDUCTION,
 					  TREE_TYPE (var), 6, teardown_code,
-					  ref_to_res, unshare_expr (v3),
+					  ref_to_res, unshare_expr (var),
 					  level, op, off);
 
-	gimplify_assign (unshare_expr (v1), setup_call, &before_fork);
-	gimplify_assign (unshare_expr (v2), init_call, &after_fork);
-	gimplify_assign (unshare_expr (v3), fini_call, &before_join);
+	gimplify_assign (unshare_expr (var), setup_call, &before_fork);
+	gimplify_assign (unshare_expr (var), init_call, &after_fork);
+	gimplify_assign (unshare_expr (var), fini_call, &before_join);
 	gimplify_assign (unshare_expr (outgoing), teardown_call, &after_join);
       }
 
diff --git a/gcc/testsuite/gfortran.dg/goacc/modules.f95 b/gcc/testsuite/gfortran.dg/goacc/modules.f95
index 1e8d82641553..42e715ef0861 100644
--- a/gcc/testsuite/gfortran.dg/goacc/modules.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/modules.f95
@@ -18,8 +18,7 @@ SUBROUTINE reduction_kernel(x_min,x_max,y_min,y_max,arr,sum)
 
 !$ACC DATA PRESENT(arr) COPY(sum)
 !$ACC PARALLEL LOOP REDUCTION(+ : sum)
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   DO k=y_min,y_max
     DO j=x_min,x_max
       sum=sum*arr(j,k)
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index 07e9318f5e8b..96bba0e555c6 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -283,7 +283,9 @@ enum omp_clause_code {
                 placeholder used in OMP_CLAUSE_REDUCTION_{INIT,MERGE}.
      Operand 4: OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER: Another dummy
 		VAR_DECL placeholder, used like the above for C/C++ array
-		reductions.  */
+		reductions.
+     Operand 5: OMP_CLAUSE_REDUCTION_PRIVATE_DECL: A private VAR_DECL of
+		the original DECL associated with the reduction clause.  */
   OMP_CLAUSE_REDUCTION,
 
   /* OpenMP clause: task_reduction (operator:variable_list).  */
diff --git a/gcc/tree.cc b/gcc/tree.cc
index 2868cb0867dd..92025b85ec66 100644
--- a/gcc/tree.cc
+++ b/gcc/tree.cc
@@ -304,7 +304,7 @@ unsigned const char omp_clause_num_ops[] =
   1, /* OMP_CLAUSE_SHARED  */
   1, /* OMP_CLAUSE_FIRSTPRIVATE  */
   2, /* OMP_CLAUSE_LASTPRIVATE  */
-  5, /* OMP_CLAUSE_REDUCTION  */
+  6, /* OMP_CLAUSE_REDUCTION  */
   5, /* OMP_CLAUSE_TASK_REDUCTION  */
   5, /* OMP_CLAUSE_IN_REDUCTION  */
   1, /* OMP_CLAUSE_COPYIN  */
diff --git a/gcc/tree.h b/gcc/tree.h
index 9976df44d0f8..5503bb03650b 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2031,6 +2031,8 @@ class auto_suppress_location_wrappers
 #define OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER(NODE) \
   OMP_CLAUSE_OPERAND (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_REDUCTION, \
 					      OMP_CLAUSE_IN_REDUCTION), 4)
+#define OMP_CLAUSE_REDUCTION_PRIVATE_DECL(NODE) \
+  OMP_CLAUSE_OPERAND (OMP_CLAUSE_SUBCODE_CHECK (NODE, OMP_CLAUSE_REDUCTION), 5)
 
 /* True if a REDUCTION clause may reference the original list item (omp_orig)
    in its OMP_CLAUSE_REDUCTION_{,GIMPLE_}INIT.  */
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/optional-reduction.f90 b/libgomp/testsuite/libgomp.oacc-fortran/optional-reduction.f90
index 0bb05b9b869d..91564b294c1a 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/optional-reduction.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/optional-reduction.f90
@@ -34,8 +34,7 @@ contains
 
     !$acc parallel num_gangs(ng) copy(rg)
     !$acc loop reduction(+:rg) gang
-    ! { dg-bogus {'rg\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-    !   { dg-note {'rg\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+    ! { dg-bogus {'rg\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
     do i = 1, n
        rg = rg + array(i)
     end do
@@ -43,8 +42,7 @@ contains
 
     !$acc parallel num_workers(nw) copy(rw)
     !$acc loop reduction(+:rw) worker
-    ! { dg-bogus {'rw\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-    !   { dg-note {'rw\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+    ! { dg-bogus {'rw\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
     do i = 1, n
        rw = rw + array(i)
     end do
@@ -52,8 +50,7 @@ contains
 
     !$acc parallel vector_length(vl) copy(rv)
     !$acc loop reduction(+:rv) vector
-    ! { dg-bogus {'rv\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-    !   { dg-note {'rv\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+    ! { dg-bogus {'rv\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
     do i = 1, n
        rv = rv + array(i)
     end do
@@ -61,8 +58,7 @@ contains
 
     !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
     !$acc loop reduction(+:rc) gang worker vector
-    ! { dg-bogus {'rc\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-    !   { dg-note {'rc\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+    ! { dg-bogus {'rc\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
     do i = 1, n
        rc = rc + array(i)
     end do
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/parallel-reduction.f90 b/libgomp/testsuite/libgomp.oacc-fortran/parallel-reduction.f90
index a7b7adebb09e..2b289c26d5da 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/parallel-reduction.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/parallel-reduction.f90
@@ -46,11 +46,9 @@ subroutine redsub(s1, s2, n)
   integer :: s1, s2, n
 
   !$acc parallel reduction(+:s1,s2) num_gangs (10)  copy(s1)
-  ! { dg-bogus {'s1\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'s1\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
-  ! { dg-bogus {'s2\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-3 }
-  !   { dg-note {'s2\.[0-9]+' was declared here} {} { target *-*-* } .-4 }
-  ! { dg-bogus "\[Ww\]arning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction'" { xfail *-*-* } .-5 }
+  ! { dg-bogus {'s1\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
+  ! { dg-bogus {'s2\.[0-9]+' is used uninitialized} "" { target *-*-* } .-2 }
+  ! { dg-bogus "\[Ww\]arning: region is gang partitioned but does not contain gang partitioned code" "TODO 'reduction'" { xfail *-*-* } .-3 }
   s1 = s1 + 1
   s2 = s2 + 1
   !$acc end parallel
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/pr70643.f90 b/libgomp/testsuite/libgomp.oacc-fortran/pr70643.f90
index 5082e367e020..a9f00abe7f0a 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/pr70643.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/pr70643.f90
@@ -18,8 +18,7 @@ SUBROUTINE reduction_kernel(x_min,x_max,y_min,y_max,arr,sum)
 
 !$ACC DATA PRESENT(arr) COPY(sum)
 !$ACC PARALLEL LOOP REDUCTION(+ : sum)
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   DO k=y_min,y_max
     DO j=x_min,x_max
       sum=sum+arr(j,k)
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/reduction-5.f90 b/libgomp/testsuite/libgomp.oacc-fortran/reduction-5.f90
index 88a691f7ca15..30fb30a8e12a 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/reduction-5.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/reduction-5.f90
@@ -38,8 +38,7 @@ subroutine redsub_gang(sum, n, c)
 
   !$acc parallel copyin (n, c) num_gangs(n) copy(sum)
   !$acc loop reduction(+:sum) gang
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   do i = 1, n
      sum = sum + c
   end do
@@ -54,8 +53,7 @@ subroutine redsub_worker(sum, n, c)
   !$acc parallel copyin (n, c) num_workers(4) vector_length (32) copy(sum)
   ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 }
   !$acc loop reduction(+:sum) worker
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   do i = 1, n
      sum = sum + c
   end do
@@ -69,8 +67,7 @@ subroutine redsub_vector(sum, n, c)
 
   !$acc parallel copyin (n, c) vector_length(32) copy(sum)
   !$acc loop reduction(+:sum) vector
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   do i = 1, n
      sum = sum + c
   end do
@@ -84,8 +81,7 @@ subroutine redsub_combined(sum, n, c)
 
   !$acc parallel num_gangs (8) num_workers (4) vector_length(32) copy(sum)
   !$acc loop reduction(+:sum) gang worker vector
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   do i = 1, n
      sum = sum + c
   end do
@@ -102,12 +98,10 @@ subroutine redsub_nested(sum, n, c)
 
   !$acc parallel num_gangs (8) copy(sum)
   !$acc loop reduction(+:sum) gang
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   do i = 1, ii
      !$acc loop reduction(+:sum) vector
-     ! { dg-bogus {'sum\.[0-9]+' may be used uninitialized} TODO { xfail { ! __OPTIMIZE__ } } .-1 }
-     !   { dg-note {'sum\.[0-9]+' was declared here} {} { target { ! __OPTIMIZE__ } } .-2 }
+     ! { dg-bogus {'sum\.[0-9]+' may be used uninitialized} "" { target { ! __OPTIMIZE__ } } .-1 }
      do j = 1, jj
         sum = sum + c
      end do
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/reduction-7.f90 b/libgomp/testsuite/libgomp.oacc-fortran/reduction-7.f90
index 38148f520da8..1173f1cce55c 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/reduction-7.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/reduction-7.f90
@@ -1,6 +1,6 @@
 ! { dg-do run }
 
-! { dg-additional-options -Wuninitialized }
+! { dg-additional-options "-Wuninitialized -fno-inline" }
 
 !TODO
 ! { dg-xfail-run-if TODO { openacc_radeon_accel_selected && { ! __OPTIMIZE__ } } }
@@ -64,8 +64,7 @@ subroutine redsub_bogus(sum, n)
 
   !$acc parallel firstprivate(sum)
   !$acc loop gang worker vector reduction (+:sum)
-  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
   do i = 1, n
      sum = sum + 1
   end do
@@ -84,8 +83,7 @@ subroutine redsub_combined(sum, n, arr)
      sum = i;
 
      !$acc loop reduction(+:sum)
-     ! { dg-bogus {'sum\.[0-9]+' may be used uninitialized} TODO { xfail { ! __OPTIMIZE__ } } .-1 }
-     !   { dg-note {'sum\.[0-9]+' was declared here} {} { target { ! __OPTIMIZE__ } } .-2 }
+     ! { dg-bogus {'sum\.[0-9]+' may be used uninitialized} "" { target { ! __OPTIMIZE__ } } .-1 }
      do j = 1, n
         sum = sum + 1
      end do
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/reference-reductions.f90 b/libgomp/testsuite/libgomp.oacc-fortran/reference-reductions.f90
index 055d22510c43..635b1b011792 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/reference-reductions.f90
+++ b/libgomp/testsuite/libgomp.oacc-fortran/reference-reductions.f90
@@ -16,12 +16,10 @@ subroutine param_reduction(var)
 
 !$acc parallel copy(var)
 !$acc loop reduction(+ : var) gang
-  ! { dg-bogus {'var\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
-  !   { dg-note {'var\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
+  ! { dg-bogus {'var\.[0-9]+' is used uninitialized} "" { target *-*-* } .-1 }
  do k=1,10
 !$acc loop vector reduction(+ : var)
-    ! { dg-bogus {'var\.[0-9]+' may be used uninitialized} TODO { xfail { ! __OPTIMIZE__ } } .-1 }
-    !   { dg-note {'var\.[0-9]+' was declared here} {} { target { ! __OPTIMIZE__ } } .-2 }
+    ! { dg-bogus {'var\.[0-9]+' may be used uninitialized} "" { target { ! __OPTIMIZE__ } } .-1 }
     do j=1,100
      var = var + 1.0
     enddo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.