]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
openmp: Introduce gimple_omp_ordered_standalone_p
authorJakub Jelinek <jakub@redhat.com>
Tue, 6 Sep 2022 07:19:24 +0000 (09:19 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 6 Sep 2022 07:19:24 +0000 (09:19 +0200)
On Sat, Sep 03, 2022 at 10:07:27AM +0200, Jakub Jelinek via Gcc-patches wrote:
> Incrementally, I'd like to change the way we differentiate between
> stand-alone and block-associated ordered constructs, because the current
> way of looking for presence of doacross clause doesn't work well if those
> clauses are removed because they had been invalid (wrong syntax or
> unknown variables in it etc.)

The following, so far only lightly tested, patch implements that.

2022-09-06  Jakub Jelinek  <jakub@redhat.com>

gcc/
* gimple.h (enum gf_mask): Add GF_OMP_ORDERED_STANDALONE enumerator.
(gimple_omp_subcode):  Use GIMPLE_OMP_ORDERED instead of
GIMPLE_OMP_TEAMS as upper bound.
(gimple_omp_ordered_standalone_p, gimple_omp_ordered_standalone): New
inline functions.
* gimplify.cc (find_standalone_omp_ordered): Look for OMP_ORDERED with
NULL OMP_ORDERED_BODY rather than with OMP_DOACROSS clause.
(gimplify_expr): Call gimple_omp_ordered_standalone for OMP_ORDERED
with NULL OMP_ORDERED_BODY.
* omp-low.cc (check_omp_nesting_restrictions): Use
gimple_omp_ordered_standalone_p test instead of
omp_find_clause (..., OMP_CLAUSE_DOACROSS).
(lower_omp_ordered): Likewise.
* omp-expand.cc (expand_omp, build_omp_regions_1,
omp_make_gimple_edges): Likewise.
gcc/cp/
* pt.cc (tsubst_expr) <case OMP_ORDERED>: If OMP_BODY was NULL, keep
it NULL after instantiation too.
gcc/testsuite/
* c-c++-common/gomp/sink-3.c: Don't expect a superfluous error during
error recovery.
* c-c++-common/gomp/doacross-6.c (foo): Add further tests.

gcc/cp/pt.cc
gcc/gimple.h
gcc/gimplify.cc
gcc/omp-expand.cc
gcc/omp-low.cc
gcc/testsuite/c-c++-common/gomp/doacross-6.c
gcc/testsuite/c-c++-common/gomp/sink-3.c

index cd0d8920ed02b5a668e2487db43f287a5043661b..c5fc0f1eab8db1b2e641477b99084dd48e83eaff 100644 (file)
@@ -19526,9 +19526,14 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
     case OMP_ORDERED:
       tmp = tsubst_omp_clauses (OMP_ORDERED_CLAUSES (t), C_ORT_OMP, args,
                                complain, in_decl);
-      stmt = push_stmt_list ();
-      RECUR (OMP_BODY (t));
-      stmt = pop_stmt_list (stmt);
+      if (OMP_BODY (t))
+       {
+         stmt = push_stmt_list ();
+         RECUR (OMP_BODY (t));
+         stmt = pop_stmt_list (stmt);
+       }
+      else
+       stmt = NULL_TREE;
 
       t = copy_node (t);
       OMP_BODY (t) = stmt;
index 1d15ff98ac2e15c3a6f3aa0b9fe35ea04b024505..77ac1495c46def4af050a86237ca03e1c655744f 100644 (file)
@@ -194,6 +194,7 @@ enum gf_mask {
     GF_OMP_RETURN_NOWAIT       = 1 << 0,
 
     GF_OMP_SECTION_LAST                = 1 << 0,
+    GF_OMP_ORDERED_STANDALONE   = 1 << 0,
     GF_OMP_ATOMIC_MEMORY_ORDER  = (1 << 6) - 1,
     GF_OMP_ATOMIC_NEED_VALUE   = 1 << 6,
     GF_OMP_ATOMIC_WEAK         = 1 << 7,
@@ -2312,7 +2313,7 @@ static inline unsigned
 gimple_omp_subcode (const gimple *s)
 {
   gcc_gimple_checking_assert (gimple_code (s) >= GIMPLE_OMP_ATOMIC_LOAD
-                             && gimple_code (s) <= GIMPLE_OMP_TEAMS);
+                             && gimple_code (s) <= GIMPLE_OMP_ORDERED);
   return s->subcode;
 }
 
@@ -2402,6 +2403,27 @@ gimple_omp_section_set_last (gimple *g)
 }
 
 
+/* Return true if OMP ordered construct is stand-alone
+   (G has the GF_OMP_ORDERED_STANDALONE flag set).  */
+
+static inline bool
+gimple_omp_ordered_standalone_p (const gimple *g)
+{
+  GIMPLE_CHECK (g, GIMPLE_OMP_ORDERED);
+  return (gimple_omp_subcode (g) & GF_OMP_ORDERED_STANDALONE) != 0;
+}
+
+
+/* Set the GF_OMP_ORDERED_STANDALONE flag on G.  */
+
+static inline void
+gimple_omp_ordered_standalone (gimple *g)
+{
+  GIMPLE_CHECK (g, GIMPLE_OMP_ORDERED);
+  g->subcode |= GF_OMP_ORDERED_STANDALONE;
+}
+
+
 /* Return true if OMP parallel statement G has the
    GF_OMP_PARALLEL_COMBINED flag set.  */
 
index 988fc93a7f71c6ab6c46f14e4e6a6587815e0c22..dcdc8523ff55e751d4f5dad2d81d40ada7bbf7d9 100644 (file)
@@ -12427,7 +12427,7 @@ gimplify_omp_taskloop_expr (tree type, tree *tp, gimple_seq *pre_p,
 }
 
 /* Helper function of gimplify_omp_for, find OMP_ORDERED with
-   OMP_CLAUSE_DOACROSS clause inside of OMP_FOR's body.  */
+   null OMP_ORDERED_BODY inside of OMP_FOR's body.  */
 
 static tree
 find_standalone_omp_ordered (tree *tp, int *walk_subtrees, void *)
@@ -12435,7 +12435,7 @@ find_standalone_omp_ordered (tree *tp, int *walk_subtrees, void *)
   switch (TREE_CODE (*tp))
     {
     case OMP_ORDERED:
-      if (omp_find_clause (OMP_ORDERED_CLAUSES (*tp), OMP_CLAUSE_DOACROSS))
+      if (OMP_ORDERED_BODY (*tp) == NULL_TREE)
        return *tp;
       break;
     case OMP_SIMD:
@@ -15839,6 +15839,9 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
                break;
              case OMP_ORDERED:
                g = gimplify_omp_ordered (*expr_p, body);
+               if (OMP_BODY (*expr_p) == NULL_TREE
+                   && gimple_code (g) == GIMPLE_OMP_ORDERED)
+                 gimple_omp_ordered_standalone (g);
                break;
              case OMP_MASKED:
                gimplify_scan_omp_clauses (&OMP_MASKED_CLAUSES (*expr_p),
index 55c513d0d22ab6c4fd803e22d9b853b231035856..8d90b318e867562a8b5c15a7d10dff0fc07ee69c 100644 (file)
@@ -10487,8 +10487,7 @@ expand_omp (struct omp_region *region)
          {
            gomp_ordered *ord_stmt
              = as_a <gomp_ordered *> (last_stmt (region->entry));
-           if (omp_find_clause (gimple_omp_ordered_clauses (ord_stmt),
-                                OMP_CLAUSE_DOACROSS))
+           if (gimple_omp_ordered_standalone_p (ord_stmt))
              {
                /* We'll expand these when expanding corresponding
                   worksharing region with ordered(n) clause.  */
@@ -10616,9 +10615,7 @@ build_omp_regions_1 (basic_block bb, struct omp_region *parent,
                }
            }
          else if (code == GIMPLE_OMP_ORDERED
-                  && omp_find_clause (gimple_omp_ordered_clauses
-                                        (as_a <gomp_ordered *> (stmt)),
-                                      OMP_CLAUSE_DOACROSS))
+                  && gimple_omp_ordered_standalone_p (stmt))
            /* #pragma omp ordered depend is also just a stand-alone
               directive.  */
            region = NULL;
@@ -10842,9 +10839,7 @@ omp_make_gimple_edges (basic_block bb, struct omp_region **region,
     case GIMPLE_OMP_ORDERED:
       cur_region = new_omp_region (bb, code, cur_region);
       fallthru = true;
-      if (omp_find_clause (gimple_omp_ordered_clauses
-                            (as_a <gomp_ordered *> (last)),
-                          OMP_CLAUSE_DOACROSS))
+      if (gimple_omp_ordered_standalone_p (last))
        cur_region = cur_region->outer;
       break;
 
index b32336b8d69102d2bec17ca9202c0c4ec8a1f7ab..fd0ccd53fbaa0193ea26b97395670096b2b3439b 100644 (file)
@@ -3718,7 +3718,7 @@ check_omp_nesting_restrictions (gimple *stmt, omp_context *ctx)
                          "a loop region with an %<ordered%> clause");
                return false;
              }
-           if (omp_find_clause (c, OMP_CLAUSE_DOACROSS) == NULL_TREE)
+           if (!gimple_omp_ordered_standalone_p (stmt))
              {
                if (OMP_CLAUSE_ORDERED_DOACROSS (o))
                  {
@@ -9989,8 +9989,7 @@ lower_omp_ordered (gimple_stmt_iterator *gsi_p, omp_context *ctx)
   bool threads = omp_find_clause (gimple_omp_ordered_clauses (ord_stmt),
                                  OMP_CLAUSE_THREADS);
 
-  if (omp_find_clause (gimple_omp_ordered_clauses (ord_stmt),
-                      OMP_CLAUSE_DOACROSS))
+  if (gimple_omp_ordered_standalone_p (ord_stmt))
     {
       /* FIXME: This is needs to be moved to the expansion to verify various
         conditions only testable on cfg with dominators computed, and also
index d126ad1bb2de1a5de2f4bb2536590d918600a0da..d9e9f80655bafc34e1e466360024254417f488e8 100644 (file)
@@ -22,6 +22,18 @@ foo (int n)
     {
       #pragma omp ordered doacross(sink)               /* { dg-error "expected ':' before '\\\)' token" } */
     }
+  #pragma omp for ordered
+  for (i = 0; i < 8; i += n)
+    {
+      #pragma omp ordered doacross(source)             /* { dg-error "expected ':' before '\\\)' token" } */
+      #pragma omp ordered doacross(sink:i-1)
+    }
+  #pragma omp for ordered
+  for (i = 0; i < 8; i += n)
+    {
+      #pragma omp ordered doacross(source:)
+      #pragma omp ordered doacross(sink)               /* { dg-error "expected ':' before '\\\)' token" } */
+    }
 }
 
 void
index 3f7ba5e307db3731b44cf5e7ecc19ef4d37bb359..7cb16ed0f76005024f8ba070bf51ff97568c32b9 100644 (file)
@@ -14,7 +14,7 @@ foo ()
   for (i=0; i < 100; ++i)
     {
 #pragma omp ordered depend(sink:poo-1,paa+1) /* { dg-error "poo.*declared.*paa.*declared" } */
-    bar(&i);                                /* { dg-error "must not have the same binding region" "" { target *-*-* } .-1 } */
+    bar(&i);
 #pragma omp ordered depend(source)
     }
 }