]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
C, C++, Fortran, OpenMP: Add support for 'flush seq_cst' construct.
authorMarcel Vollweiler <marcel@codesourcery.com>
Tue, 7 Sep 2021 11:07:02 +0000 (04:07 -0700)
committerMarcel Vollweiler <marcel@codesourcery.com>
Tue, 7 Sep 2021 11:07:02 +0000 (04:07 -0700)
This patch adds support for the 'seq_cst' memory order clause on the 'flush'
directive which was introduced in OpenMP 5.1.

gcc/c-family/ChangeLog:

* c-omp.c (c_finish_omp_flush): Handle MEMMODEL_SEQ_CST.

gcc/c/ChangeLog:

* c-parser.c (c_parser_omp_flush): Parse 'seq_cst' clause on 'flush'
directive.

gcc/cp/ChangeLog:

* parser.c (cp_parser_omp_flush): Parse 'seq_cst' clause on 'flush'
directive.
* semantics.c (finish_omp_flush): Handle MEMMODEL_SEQ_CST.

gcc/fortran/ChangeLog:

* openmp.c (gfc_match_omp_flush): Parse 'seq_cst' clause on 'flush'
directive.
* trans-openmp.c (gfc_trans_omp_flush): Handle OMP_MEMORDER_SEQ_CST.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/flush-1.c: Add test case for 'seq_cst'.
* c-c++-common/gomp/flush-2.c: Add test case for 'seq_cst'.
* g++.dg/gomp/attrs-1.C: Adapt test to handle all flush clauses.
* g++.dg/gomp/attrs-2.C: Adapt test to handle all flush clauses.
* gfortran.dg/gomp/flush-1.f90: Add test case for 'seq_cst'.
* gfortran.dg/gomp/flush-2.f90: Add test case for 'seq_cst'.

(cherry picked from commit ba1cc6956b956eb5b92c45af79a8b1fe426ec4d3)

13 files changed:
gcc/ChangeLog.omp
gcc/c-family/c-omp.c
gcc/c/c-parser.c
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/fortran/openmp.c
gcc/fortran/trans-openmp.c
gcc/testsuite/c-c++-common/gomp/flush-1.c
gcc/testsuite/c-c++-common/gomp/flush-2.c
gcc/testsuite/g++.dg/gomp/attrs-1.C
gcc/testsuite/g++.dg/gomp/attrs-2.C
gcc/testsuite/gfortran.dg/gomp/flush-1.f90
gcc/testsuite/gfortran.dg/gomp/flush-2.f90

index b4231380da4f098170b5b29a57229e333b425b64..8f262337d793ac98df59d95090ae54168ecbb8b2 100644 (file)
@@ -1,3 +1,24 @@
+2021-09-07  Marcel Vollweiler  <marcel@codesourcery.com>
+
+       Backported from master:
+       2021-09-07  Marcel Vollweiler  <marcel@codesourcery.com>
+
+       * c-omp.c (c_finish_omp_flush): Handle MEMMODEL_SEQ_CST.
+       * c-parser.c (c_parser_omp_flush): Parse 'seq_cst' clause on 'flush'
+       directive.
+       * parser.c (cp_parser_omp_flush): Parse 'seq_cst' clause on 'flush'
+       directive.
+       * semantics.c (finish_omp_flush): Handle MEMMODEL_SEQ_CST.
+       * openmp.c (gfc_match_omp_flush): Parse 'seq_cst' clause on 'flush'
+       directive.
+       * trans-openmp.c (gfc_trans_omp_flush): Handle OMP_MEMORDER_SEQ_CST.
+       * c-c++-common/gomp/flush-1.c: Add test case for 'seq_cst'.
+       * c-c++-common/gomp/flush-2.c: Add test case for 'seq_cst'.
+       * g++.dg/gomp/attrs-1.C: Adapt test to handle all flush clauses.
+       * g++.dg/gomp/attrs-2.C: Adapt test to handle all flush clauses.
+       * gfortran.dg/gomp/flush-1.f90: Add test case for 'seq_cst'.
+       * gfortran.dg/gomp/flush-2.f90: Add test case for 'seq_cst'.
+
 2021-09-03  Tobias Burnus  <tobias@codesourcery.com>
 
        2021-09-03  Jakub Jelinek  <jakub@redhat.com>
index cecc1f96b4dea2b9b2c1924ef0e567d3cbdf375d..ae2bec7ef9bafc84c51debc5c6fb3ce3f4ee72ee 100644 (file)
@@ -606,7 +606,7 @@ c_finish_omp_flush (location_t loc, int mo)
 {
   tree x;
 
-  if (mo == MEMMODEL_LAST)
+  if (mo == MEMMODEL_LAST || mo == MEMMODEL_SEQ_CST)
     {
       x = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
       x = build_call_expr_loc (loc, x, 0);
index 89a06e093ed7b4deb704aa1c8c7f24addf46f815..ce8a2a9e4a5604ca6aba05e031e16ddac45b34f8 100644 (file)
@@ -18363,7 +18363,9 @@ c_parser_omp_flush (c_parser *parser)
       const char *p
        = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
 
-      if (!strcmp (p, "acq_rel"))
+      if (!strcmp (p, "seq_cst"))
+       mo = MEMMODEL_SEQ_CST;
+      else if (!strcmp (p, "acq_rel"))
        mo = MEMMODEL_ACQ_REL;
       else if (!strcmp (p, "release"))
        mo = MEMMODEL_RELEASE;
@@ -18371,7 +18373,8 @@ c_parser_omp_flush (c_parser *parser)
        mo = MEMMODEL_ACQUIRE;
       else
        error_at (c_parser_peek_token (parser)->location,
-                 "expected %<acq_rel%>, %<release%> or %<acquire%>");
+                 "expected %<seq_cst%>, %<acq_rel%>, %<release%> or "
+                 "%<acquire%>");
       c_parser_consume_token (parser);
     }
   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
index 8aec18125bc68701212333528e323cf7c92d866e..ca82c042eccf9e6b452edbf839bec160b75fded2 100644 (file)
@@ -40546,7 +40546,9 @@ cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
     {
       tree id = cp_lexer_peek_token (parser->lexer)->u.value;
       const char *p = IDENTIFIER_POINTER (id);
-      if (!strcmp (p, "acq_rel"))
+      if (!strcmp (p, "seq_cst"))
+       mo = MEMMODEL_SEQ_CST;
+      else if (!strcmp (p, "acq_rel"))
        mo = MEMMODEL_ACQ_REL;
       else if (!strcmp (p, "release"))
        mo = MEMMODEL_RELEASE;
@@ -40554,7 +40556,8 @@ cp_parser_omp_flush (cp_parser *parser, cp_token *pragma_tok)
        mo = MEMMODEL_ACQUIRE;
       else
        error_at (cp_lexer_peek_token (parser->lexer)->location,
-                 "expected %<acq_rel%>, %<release%> or %<acquire%>");
+                 "expected %<seq_cst%>, %<acq_rel%>, %<release%> or "
+                 "%<acquire%>");
       cp_lexer_consume_token (parser->lexer);
     }
   if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN))
index 323ff63c2b743dee29e47a05f8f0be52aba89cbe..2e4ec5107ef366ac9c8daff133b496e95d3e7444 100644 (file)
@@ -10663,7 +10663,7 @@ finish_omp_flush (int mo)
 {
   tree fn = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
   releasing_vec vec;
-  if (mo != MEMMODEL_LAST)
+  if (mo != MEMMODEL_LAST && mo != MEMMODEL_SEQ_CST)
     {
       fn = builtin_decl_explicit (BUILT_IN_ATOMIC_THREAD_FENCE);
       vec->quick_push (build_int_cst (integer_type_node, mo));
index 09aff7fac788edde4c89e1ae3d44a0f7783fd74e..52200a1df51a147f072ccc4c29b48e670898b321 100644 (file)
@@ -3770,7 +3770,9 @@ gfc_match_omp_flush (void)
   enum gfc_omp_memorder mo = OMP_MEMORDER_UNSET;
   if (gfc_match_omp_eos () == MATCH_NO && gfc_peek_ascii_char () != '(')
     {
-      if (gfc_match ("acq_rel") == MATCH_YES)
+      if (gfc_match ("seq_cst") == MATCH_YES)
+       mo = OMP_MEMORDER_SEQ_CST;
+      else if (gfc_match ("acq_rel") == MATCH_YES)
        mo = OMP_MEMORDER_ACQ_REL;
       else if (gfc_match ("release") == MATCH_YES)
        mo = OMP_MEMORDER_RELEASE;
@@ -3778,7 +3780,7 @@ gfc_match_omp_flush (void)
        mo = OMP_MEMORDER_ACQUIRE;
       else
        {
-         gfc_error ("Expected AQC_REL, RELEASE, or ACQUIRE at %C");
+         gfc_error ("Expected SEQ_CST, AQC_REL, RELEASE, or ACQUIRE at %C");
          return MATCH_ERROR;
        }
       c = gfc_get_omp_clauses ();
index 8cf9b28bfafcd92fcff992f3437a575f4df2ec66..f7f3043ac9d96f3a43c85f1bbd9fa437103ec59f 100644 (file)
@@ -5450,7 +5450,8 @@ gfc_trans_omp_flush (gfc_code *code)
 {
   tree call;
   if (!code->ext.omp_clauses
-      || code->ext.omp_clauses->memorder == OMP_MEMORDER_UNSET)
+      || code->ext.omp_clauses->memorder == OMP_MEMORDER_UNSET
+      || code->ext.omp_clauses->memorder == OMP_MEMORDER_SEQ_CST)
     {
       call = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
       call = build_call_expr_loc (input_location, call, 0);
index 7c3e5294a051e78a8b127c246ea3b8874512f3fc..717b951160fa38ff306e778732f1df0258f92a80 100644 (file)
@@ -1,4 +1,5 @@
 /* { dg-additional-options "-fdump-tree-gimple" } */
+/* { dg-final { scan-tree-dump "foo \\(6\\);\[\n\r]*  __sync_synchronize \\(\\);\[\n\r]*  foo \\(6\\);" "gimple" } } */
 /* { dg-final { scan-tree-dump "foo \\(4\\);\[\n\r]*  __atomic_thread_fence \\(4\\);\[\n\r]*  foo \\(4\\);" "gimple" } } */
 /* { dg-final { scan-tree-dump "foo \\(3\\);\[\n\r]*  __atomic_thread_fence \\(3\\);\[\n\r]*  foo \\(3\\);" "gimple" } } */
 /* { dg-final { scan-tree-dump "foo \\(2\\);\[\n\r]*  __atomic_thread_fence \\(2\\);\[\n\r]*  foo \\(2\\);" "gimple" } } */
@@ -37,3 +38,11 @@ f4 (void)
   #pragma omp flush
   foo (5);
 }
+
+void
+f5 (void)
+{
+  foo (6);
+  #pragma omp flush seq_cst
+  foo (6);
+}
index 00baa8ac67f8f93126172d96b016b69879a7191d..30ef5982712f43e38faf7f676366c0d5c7567191 100644 (file)
@@ -8,10 +8,11 @@ foo (void)
   #pragma omp flush acquire
   #pragma omp flush release
   #pragma omp flush acq_rel
-  #pragma omp flush relaxed            /* { dg-error "expected 'acq_rel', 'release' or 'acquire'" } */
-  #pragma omp flush seq_cst            /* { dg-error "expected 'acq_rel', 'release' or 'acquire'" } */
-  #pragma omp flush foobar             /* { dg-error "expected 'acq_rel', 'release' or 'acquire'" } */
+  #pragma omp flush seq_cst
+  #pragma omp flush relaxed            /* { dg-error "expected 'seq_cst', 'acq_rel', 'release' or 'acquire'" } */
+  #pragma omp flush foobar             /* { dg-error "expected 'seq_cst', 'acq_rel', 'release' or 'acquire'" } */
   #pragma omp flush acquire (a, b)     /* { dg-error "'flush' list specified together with memory order clause" } */
   #pragma omp flush release (a, b)     /* { dg-error "'flush' list specified together with memory order clause" } */
   #pragma omp flush acq_rel (a, b)     /* { dg-error "'flush' list specified together with memory order clause" } */
+  #pragma omp flush seq_cst (a, b)     /* { dg-error "'flush' list specified together with memory order clause" } */
 }
index cd20845b634d7ca7ce48ba254d6c99e6a1413213..c871c51728fc3d1888f1519d44ec5cacbf7bb843 100644 (file)
@@ -528,6 +528,12 @@ bar (int d, int m, int i1, int i2, int i3, int p, int *idp, int s,
   ;
   [[omp::directive (flush acq_rel)]]
   ;
+  [[omp::directive (flush acquire)]]
+  ;
+  [[omp::directive (flush release)]]
+  ;
+  [[omp::directive (flush seq_cst)]]
+  ;
   [[omp::directive (flush (p, f))]]
   ;
   [[omp::directive (simd
index 5c54905576d1fe19b09ab1a27bce4179c4b216c1..5ec19b32fb0e3b63ab8af416f29d918047feafdb 100644 (file)
@@ -528,6 +528,12 @@ bar (int d, int m, int i1, int i2, int i3, int p, int *idp, int s,
   ;
   [[omp::directive (flush, acq_rel)]]
   ;
+  [[omp::directive (flush, acquire)]]
+  ;
+  [[omp::directive (flush, release)]]
+  ;
+  [[omp::directive (flush, seq_cst)]]
+  ;
   [[omp::directive (flush (p, f))]]
   ;
   [[omp::directive (simd,
index d0b7f9eb82d3d90dd5261f7205bba2c742a8ebce..904bb1d03aab49d10eccad75e1e2776e8e05e5da 100644 (file)
@@ -1,4 +1,5 @@
 ! { dg-additional-options "-fdump-tree-gimple" }
+! { dg-final { scan-tree-dump "foo \\(6\\);\[\n\r]*  __sync_synchronize \\(\\);\[\n\r]*  foo \\(6\\);" "gimple" } }
 ! { dg-final { scan-tree-dump "foo \\(4\\);\[\n\r]*  __atomic_thread_fence \\(4\\);\[\n\r]*  foo \\(4\\);" "gimple" } }
 ! { dg-final { scan-tree-dump "foo \\(3\\);\[\n\r]*  __atomic_thread_fence \\(3\\);\[\n\r]*  foo \\(3\\);" "gimple" } }
 ! { dg-final { scan-tree-dump "foo \\(2\\);\[\n\r]*  __atomic_thread_fence \\(2\\);\[\n\r]*  foo \\(2\\);" "gimple" } }
@@ -39,3 +40,10 @@ subroutine f4
   !$omp flush
   call foo (5)
 end
+
+subroutine f5
+  use m
+  call foo (6)
+  !$omp flush seq_cst
+  call foo (6)
+end
index 685737116490701b87143485a2a5718a5f4e3051..ba234448a60d711d2a739afa1caa373f04b69203 100644 (file)
@@ -9,10 +9,11 @@ subroutine foo (void)
   !$omp flush acquire
   !$omp flush release
   !$omp flush acq_rel
-  !$omp flush relaxed          ! { dg-error "Expected AQC_REL, RELEASE, or ACQUIRE" }
-  !$omp flush seq_cst          ! { dg-error "Expected AQC_REL, RELEASE, or ACQUIRE" }
-  !$omp flush foobar           ! { dg-error "Expected AQC_REL, RELEASE, or ACQUIRE" }
+  !$omp flush seq_cst
+  !$omp flush relaxed          ! { dg-error "Expected SEQ_CST, AQC_REL, RELEASE, or ACQUIRE" }
+  !$omp flush foobar           ! { dg-error "Expected SEQ_CST, AQC_REL, RELEASE, or ACQUIRE" }
   !$omp flush acquire (a, b)   ! { dg-error "List specified together with memory order clause in FLUSH directive" }
   !$omp flush release (a, b)   ! { dg-error "List specified together with memory order clause in FLUSH directive" }
   !$omp flush acq_rel (a, b)   ! { dg-error "List specified together with memory order clause in FLUSH directive" }
-end
+  !$omp flush seq_cst (a, b)   ! { dg-error "List specified together with memory order clause in FLUSH directive" }
+  end