public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-2487] openmp: Introduce gimple_omp_ordered_standalone_p
@ 2022-09-06 7:20 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2022-09-06 7:20 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:3f585bdaa7f6fb02753ba7b4918f065357a6b7fd
commit r13-2487-g3f585bdaa7f6fb02753ba7b4918f065357a6b7fd
Author: Jakub Jelinek <jakub@redhat.com>
Date: Tue Sep 6 09:19:24 2022 +0200
openmp: Introduce gimple_omp_ordered_standalone_p
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.
Diff:
---
gcc/cp/pt.cc | 11 ++++++++---
gcc/gimple.h | 24 +++++++++++++++++++++++-
gcc/gimplify.cc | 7 +++++--
gcc/omp-expand.cc | 11 +++--------
gcc/omp-low.cc | 5 ++---
gcc/testsuite/c-c++-common/gomp/doacross-6.c | 12 ++++++++++++
gcc/testsuite/c-c++-common/gomp/sink-3.c | 2 +-
7 files changed, 54 insertions(+), 18 deletions(-)
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index cd0d8920ed0..c5fc0f1eab8 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -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;
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 1d15ff98ac2..77ac1495c46 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -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. */
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 988fc93a7f7..dcdc8523ff5 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -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),
diff --git a/gcc/omp-expand.cc b/gcc/omp-expand.cc
index 55c513d0d22..8d90b318e86 100644
--- a/gcc/omp-expand.cc
+++ b/gcc/omp-expand.cc
@@ -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;
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index b32336b8d69..fd0ccd53fba 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -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
diff --git a/gcc/testsuite/c-c++-common/gomp/doacross-6.c b/gcc/testsuite/c-c++-common/gomp/doacross-6.c
index d126ad1bb2d..d9e9f80655b 100644
--- a/gcc/testsuite/c-c++-common/gomp/doacross-6.c
+++ b/gcc/testsuite/c-c++-common/gomp/doacross-6.c
@@ -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
diff --git a/gcc/testsuite/c-c++-common/gomp/sink-3.c b/gcc/testsuite/c-c++-common/gomp/sink-3.c
index 3f7ba5e307d..7cb16ed0f76 100644
--- a/gcc/testsuite/c-c++-common/gomp/sink-3.c
+++ b/gcc/testsuite/c-c++-common/gomp/sink-3.c
@@ -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)
}
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-09-06 7:20 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-06 7:20 [gcc r13-2487] openmp: Introduce gimple_omp_ordered_standalone_p Jakub Jelinek
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).