OpenMP: Fixes for omp critical + hint
authorTobias Burnus <tobias@codesourcery.com>
Tue, 21 Jul 2020 16:29:53 +0000 (18:29 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 22 Jul 2020 07:57:15 +0000 (09:57 +0200)
gcc/c-family/ChangeLog:

* c-omp.c (c_finish_omp_critical): Check for no name but
nonzero hint provided.

gcc/c/ChangeLog:

* c-parser.c (c_parser_omp_clause_hint): Require nonnegative hint clause.
(c_parser_omp_critical): Permit hint(0) clause without named critical.
(c_parser_omp_construct): Don't assert if error_mark_node is returned.

gcc/cp/ChangeLog:

* parser.c (cp_parser_omp_clause_hint): Require nonnegative hint.
(cp_parser_omp_critical): Permit hint(0) clause without named critical.
* pt.c (tsubst_expr): Re-check the latter for templates.

gcc/fortran/ChangeLog:

* openmp.c (gfc_match_omp_critical): Fix handling hints; permit
hint clause without named critical.
(resolve_omp_clauses): Require nonnegative constant integer
for the hint clause.
(gfc_resolve_omp_directive): Check for no name but
nonzero value for hint clause.
* parse.c (parse_omp_structured_block): Fix same-name check
for critical.
* trans-openmp.c (gfc_trans_omp_critical): Handle hint clause properly.

libgomp/ChangeLog:

* omp_lib.f90.in: Add omp_sync_hint_* and omp_sync_hint_kind.
* omp_lib.h.in: Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/gomp/critical-3.C: Add nameless critical with hint testcase.
* c-c++-common/gomp/critical-hint-1.c: New test.
* c-c++-common/gomp/critical-hint-2.c: New test.
* gfortran.dg/gomp/critical-hint-1.f90: New test.
* gfortran.dg/gomp/critical-hint-2.f90: New test.

14 files changed:
gcc/c-family/c-omp.c
gcc/c/c-parser.c
gcc/cp/parser.c
gcc/cp/pt.c
gcc/fortran/openmp.c
gcc/fortran/parse.c
gcc/fortran/trans-openmp.c
gcc/testsuite/c-c++-common/gomp/critical-hint-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/gomp/critical-hint-2.c [new file with mode: 0644]
gcc/testsuite/g++.dg/gomp/critical-3.C
gcc/testsuite/gfortran.dg/gomp/critical-hint-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/critical-hint-2.f90 [new file with mode: 0644]
libgomp/omp_lib.f90.in
libgomp/omp_lib.h.in

index 1ca2802c64ffbb0fa9fad487456e7f4b265099a5..d7cff0f4cca71aea65c23fa37e3b55cbd82bc670 100644 (file)
@@ -106,6 +106,17 @@ c_finish_omp_taskgroup (location_t loc, tree body, tree clauses)
 tree
 c_finish_omp_critical (location_t loc, tree body, tree name, tree clauses)
 {
+  gcc_assert (!clauses || OMP_CLAUSE_CODE (clauses) == OMP_CLAUSE_HINT);
+  if (name == NULL_TREE
+      && clauses != NULL_TREE
+      && integer_nonzerop (OMP_CLAUSE_HINT_EXPR (clauses)))
+    {
+      error_at (OMP_CLAUSE_LOCATION (clauses),
+               "%<#pragma omp critical%> with %<hint%> clause requires "
+               "a name, except when %<omp_sync_hint_none%> is used");
+      return error_mark_node;
+    }
+
   tree stmt = make_node (OMP_CRITICAL);
   TREE_TYPE (stmt) = void_type_node;
   OMP_CRITICAL_BODY (stmt) = body;
index 275b8a382558bf452956249764d8a67ec6a48f4d..7961cbc98bb4f2877218beb2e972b274b53c41b9 100644 (file)
@@ -13901,16 +13901,15 @@ c_parser_omp_clause_hint (c_parser *parser, tree list)
       expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true);
       tree c, t = expr.value;
       t = c_fully_fold (t, false, NULL);
-
-      parens.skip_until_found_close (parser);
-
       if (!INTEGRAL_TYPE_P (TREE_TYPE (t))
-         || TREE_CODE (t) != INTEGER_CST)
+         || TREE_CODE (t) != INTEGER_CST
+         || tree_int_cst_sgn (t) == -1)
        {
-         c_parser_error (parser, "expected constant integer expression");
+         c_parser_error (parser, "expected constant integer expression "
+                                 "with valid sync-hint value");
          return list;
        }
-
+      parens.skip_until_found_close (parser);
       check_no_duplicate_clause (list, OMP_CLAUSE_HINT, "hint");
 
       c = build_omp_clause (hint_loc, OMP_CLAUSE_HINT);
@@ -17795,18 +17794,9 @@ c_parser_omp_critical (location_t loc, c_parser *parser, bool *if_p)
       if (c_parser_next_token_is (parser, CPP_COMMA)
          && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
        c_parser_consume_token (parser);
-
-      clauses = c_parser_omp_all_clauses (parser,
-                                         OMP_CRITICAL_CLAUSE_MASK,
-                                         "#pragma omp critical");
     }
-  else
-    {
-      if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
-       c_parser_error (parser, "expected %<(%> or end of line");
-      c_parser_skip_to_pragma_eol (parser);
-    }
-
+  clauses = c_parser_omp_all_clauses (parser, OMP_CRITICAL_CLAUSE_MASK,
+                                     "#pragma omp critical");
   stmt = c_parser_omp_structured_block (parser, if_p);
   return c_finish_omp_critical (loc, stmt, name, clauses);
 }
@@ -21537,7 +21527,7 @@ c_parser_omp_construct (c_parser *parser, bool *if_p)
       gcc_unreachable ();
     }
 
-  if (stmt)
+  if (stmt && stmt != error_mark_node)
     gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION);
 }
 
index 5a2d73d1ab04a5d5f80118332b43b6a2147a3c4d..0c77c20da8623f7211bb417d0076a927ba38858e 100644 (file)
@@ -35383,12 +35383,21 @@ cp_parser_omp_clause_hint (cp_parser *parser, tree list, location_t location)
 
   t = cp_parser_assignment_expression (parser);
 
+  if (t != error_mark_node)
+    {
+      t = fold_non_dependent_expr (t);
+      if (!value_dependent_expression_p (t)
+         && (!INTEGRAL_TYPE_P (TREE_TYPE (t))
+             || !tree_fits_shwi_p (t)
+             || tree_int_cst_sgn (t) == -1))
+       error_at (location, "expected constant integer expression with "
+                           "valid sync-hint value");
+    }
   if (t == error_mark_node
       || !parens.require_close (parser))
     cp_parser_skip_to_closing_parenthesis (parser, /*recovering=*/true,
                                           /*or_comma=*/false,
                                           /*consume_paren=*/true);
-
   check_no_duplicate_clause (list, OMP_CLAUSE_HINT, "hint", location);
 
   c = build_omp_clause (location, OMP_CLAUSE_HINT);
@@ -38210,13 +38219,10 @@ cp_parser_omp_critical (cp_parser *parser, cp_token *pragma_tok, bool *if_p)
       if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA)
          && cp_lexer_nth_token_is (parser->lexer, 2, CPP_NAME))
        cp_lexer_consume_token (parser->lexer);
-
-      clauses = cp_parser_omp_all_clauses (parser,
-                                          OMP_CRITICAL_CLAUSE_MASK,
-                                          "#pragma omp critical", pragma_tok);
     }
-  else
-    cp_parser_require_pragma_eol (parser, pragma_tok);
+
+  clauses = cp_parser_omp_all_clauses (parser, OMP_CRITICAL_CLAUSE_MASK,
+                                      "#pragma omp critical", pragma_tok);
 
   stmt = cp_parser_omp_structured_block (parser, if_p);
   return c_finish_omp_critical (input_location, stmt, name, clauses);
index f9e80e5a1c37966bcd6c4b9b40eea5cd82065bc6..d9db44f919d7719e211bee8ac6ae8cc6dd4eb968 100644 (file)
@@ -18531,6 +18531,15 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl,
          stmt = pop_stmt_list (stmt);
        }
 
+      if (TREE_CODE (t) == OMP_CRITICAL
+         && tmp != NULL_TREE
+         && integer_nonzerop (OMP_CLAUSE_HINT_EXPR (tmp)))
+       {
+         error_at (OMP_CLAUSE_LOCATION (tmp),
+                   "%<#pragma omp critical%> with %<hint%> clause requires "
+                   "a name, except when %<omp_sync_hint_none%> is used");
+         RETURN (error_mark_node);
+       }
       t = copy_node (t);
       OMP_BODY (t) = stmt;
       OMP_CLAUSES (t) = tmp;
index 7de2f6e1b1deb5dd93a9bdd32db8afffa4655f85..58552af0982e30d507fb5d0a2dc4e41cd1b09b0d 100644 (file)
@@ -2631,15 +2631,10 @@ gfc_match_omp_critical (void)
   gfc_omp_clauses *c = NULL;
 
   if (gfc_match (" ( %n )", n) != MATCH_YES)
-    {
-      n[0] = '\0';
-      if (gfc_match_omp_eos () != MATCH_YES)
-       {
-         gfc_error ("Unexpected junk after $OMP CRITICAL statement at %C");
-         return MATCH_ERROR;
-       }
-    }
-  else if (gfc_match_omp_clauses (&c, omp_mask (OMP_CLAUSE_HINT)) != MATCH_YES)
+    n[0] = '\0';
+
+  if (gfc_match_omp_clauses (&c, omp_mask (OMP_CLAUSE_HINT),
+                            /* first = */ n[0] == '\0') != MATCH_YES)
     return MATCH_ERROR;
 
   new_st.op = EXEC_OMP_CRITICAL;
@@ -5000,7 +4995,14 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
   if (omp_clauses->device)
     resolve_nonnegative_int_expr (omp_clauses->device, "DEVICE");
   if (omp_clauses->hint)
-    resolve_scalar_int_expr (omp_clauses->hint, "HINT");
+    {
+      resolve_scalar_int_expr (omp_clauses->hint, "HINT");
+    if (omp_clauses->hint->ts.type != BT_INTEGER
+       || omp_clauses->hint->expr_type != EXPR_CONSTANT
+       || mpz_sgn (omp_clauses->hint->value.integer) < 0)
+      gfc_error ("Value of HINT clause at %L shall be a valid "
+                "constant hint expression", &omp_clauses->hint->where);
+    }
   if (omp_clauses->priority)
     resolve_nonnegative_int_expr (omp_clauses->priority, "PRIORITY");
   if (omp_clauses->dist_chunk_size)
@@ -6515,6 +6517,17 @@ gfc_resolve_omp_directive (gfc_code *code, gfc_namespace *ns ATTRIBUTE_UNUSED)
     case EXEC_OMP_ATOMIC:
       resolve_omp_atomic (code);
       break;
+    case EXEC_OMP_CRITICAL:
+      if (code->ext.omp_clauses)
+       resolve_omp_clauses (code, code->ext.omp_clauses, NULL);
+      if (!code->ext.omp_clauses->critical_name
+         && code->ext.omp_clauses->hint
+         && code->ext.omp_clauses->hint->ts.type == BT_INTEGER
+         && code->ext.omp_clauses->hint->expr_type == EXPR_CONSTANT
+         && mpz_sgn (code->ext.omp_clauses->hint->value.integer) != 0)
+       gfc_error ("OMP CRITICAL at %L with HINT clause requires a NAME, "
+                  "except when omp_sync_hint_none is used", &code->loc);
+      break;
     default:
       break;
     }
index d30208febb15356ced57453efa01fa32ec438d17..96fd4aaee5ede6a5790dc63f3957f45093ad2cd3 100644 (file)
@@ -5384,7 +5384,8 @@ parse_omp_structured_block (gfc_statement omp_st, bool workshare_stmts_only)
       cp->ext.omp_clauses->nowait |= new_st.ext.omp_bool;
       break;
     case EXEC_OMP_END_CRITICAL:
-      if (((cp->ext.omp_clauses == NULL) ^ (new_st.ext.omp_name == NULL))
+      if (((cp->ext.omp_clauses->critical_name == NULL)
+           ^ (new_st.ext.omp_name == NULL))
          || (new_st.ext.omp_name != NULL
              && strcmp (cp->ext.omp_clauses->critical_name,
                         new_st.ext.omp_name) != 0))
index 80929c77cc6543b57c8c6c88889483c4dcdc2f06..a63000be314680485c1a406839ce846fb8126d0d 100644 (file)
@@ -4242,12 +4242,20 @@ gfc_trans_omp_cancellation_point (gfc_code *code)
 static tree
 gfc_trans_omp_critical (gfc_code *code)
 {
-  tree name = NULL_TREE, stmt;
-  if (code->ext.omp_clauses != NULL)
+  stmtblock_t block;
+  tree stmt, name = NULL_TREE;
+  if (code->ext.omp_clauses->critical_name != NULL)
     name = get_identifier (code->ext.omp_clauses->critical_name);
-  stmt = gfc_trans_code (code->block->next);
-  return build3_loc (input_location, OMP_CRITICAL, void_type_node, stmt,
-                    NULL_TREE, name);
+  gfc_start_block (&block);
+  stmt = make_node (OMP_CRITICAL);
+  TREE_TYPE (stmt) = void_type_node;
+  OMP_CRITICAL_BODY (stmt) = gfc_trans_code (code->block->next);
+  OMP_CRITICAL_NAME (stmt) = name;
+  OMP_CRITICAL_CLAUSES (stmt) = gfc_trans_omp_clauses (&block,
+                                                      code->ext.omp_clauses,
+                                                      code->loc);
+  gfc_add_expr_to_block (&block, stmt);
+  return gfc_finish_block (&block);
 }
 
 typedef struct dovar_init_d {
diff --git a/gcc/testsuite/c-c++-common/gomp/critical-hint-1.c b/gcc/testsuite/c-c++-common/gomp/critical-hint-1.c
new file mode 100644 (file)
index 0000000..510f8ab
--- /dev/null
@@ -0,0 +1,47 @@
+#include <omp.h>
+
+void
+example_criticial ()
+{
+  int a, b;
+  #pragma omp parallel for
+  for (int i = 0; i < 10; ++i)
+    {
+      #pragma omp critical hint(omp_sync_hint_none)  /* OK */
+      a += i;
+      #pragma omp critical (HASH) hint(omp_sync_hint_none)  /* OK */
+      a += i;
+      #pragma omp critical (HASH2) hint(omp_sync_hint_uncontended)  /* OK */
+      a += i;
+      #pragma omp critical (HASH3) hint(omp_sync_hint_contended)  /* OK */
+      a += i;
+      #pragma omp critical (HASH4) hint(omp_sync_hint_speculative)  /* OK */
+      a += i;
+      #pragma omp critical (HASH5) hint(omp_sync_hint_nonspeculative)  /* OK */
+      a += i;
+      #pragma omp critical (HASH6) hint(omp_sync_hint_contended + omp_sync_hint_speculative)  /* OK */
+      a += i;
+      #pragma omp critical (HASH6) hint(omp_sync_hint_contended | omp_sync_hint_speculative)  /* OK */
+      a += i;
+
+      /* Accepted but invalid: different hint for same name. */
+      #pragma omp critical (HASH6) hint(omp_sync_hint_uncontended + omp_sync_hint_speculative)  
+      a += i;
+      /* Accepted but invalid: Some random integer expr. */
+      #pragma omp critical (HASH) hint(omp_sync_hint_speculative + 1 + 2)
+      a += i;
+
+      #pragma omp critical (HASH) hint(-3)  /* { dg-error "expected constant integer expression" } */
+      a += i;
+      #pragma omp critical (HASH2) hint(b)  /* { dg-error "constant integer expression" } */
+      a += i;
+/*
+  Fails with gcc as 'expected identifier' and
+        with g++ as "clause requires a name, except when 'omp_sync_hint_none'"
+      #pragma omp critical () hint(omp_sync_hint_speculative)
+      a += i;
+*/
+      #pragma omp critical hint(omp_sync_hint_speculative)  /* { dg-error "with 'hint' clause requires a name, except when 'omp_sync_hint_none' is used" } */
+      a += i;
+    }
+}
diff --git a/gcc/testsuite/c-c++-common/gomp/critical-hint-2.c b/gcc/testsuite/c-c++-common/gomp/critical-hint-2.c
new file mode 100644 (file)
index 0000000..effe24a
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-additional-options "-fdump-tree-original" } */
+#include <omp.h>
+
+void
+example_criticial ()
+{
+  int a, b;
+  #pragma omp parallel for
+  for (int i = 0; i < 10; ++i)
+    {
+      #pragma omp critical hint(omp_sync_hint_none)
+      a += i;
+      #pragma omp critical (HASH1) hint(omp_sync_hint_none)
+      a += i;
+      #pragma omp critical (HASH2) hint(omp_sync_hint_uncontended)
+      a += i;
+      #pragma omp critical (HASH3) hint(omp_sync_hint_contended)
+      a += i;
+      #pragma omp critical (HASH4) hint(omp_sync_hint_speculative)
+      a += i;
+      #pragma omp critical (HASH5) hint(omp_sync_hint_nonspeculative)
+      a += i;
+      #pragma omp critical (HASH6) hint(omp_sync_hint_contended + omp_sync_hint_speculative)
+      a += i;
+      #pragma omp critical (HASH7) hint(omp_sync_hint_contended | omp_sync_hint_speculative)
+      a += i;
+    }
+}
+
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH1\\) hint\\(0\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH2\\) hint\\(1\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH3\\) hint\\(2\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH4\\) hint\\(8\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH5\\) hint\\(4\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH6\\) hint\\(10\\)" 1 "original" } } */
+/* { dg-final { scan-tree-dump-times "omp critical \\(HASH7\\) hint\\(10\\)" 1 "original" } } */
index b8dc496198fae1c5c58aca9dca27529d1f518463..788582f367ee5b172a84d9186a67ab7bf56d379f 100644 (file)
@@ -2,12 +2,36 @@ int i;
 
 template <int N>
 void
-foo (void)
+foo0 (void)
+{
+  #pragma omp critical (foo), hint (N + 1)  // { dg-error "critical' with 'hint' clause requires a name, except when 'omp_sync_hint_none' is used" }
+  i++;
+}
+
+template <int N>
+void
+foo_1 (void)
 {
   #pragma omp critical (foo), hint (N + 1)
   i++;
 }
 
+template <int N>
+void
+foobar0 (void)
+{
+  #pragma omp critical hint (N + 0)
+  i++;
+}
+
+template <int N>
+void
+foobar1 (void)
+{
+  #pragma omp critical hint (N + 0)  // { dg-error "critical' with 'hint' clause requires a name, except when 'omp_sync_hint_none' is used" }
+  i++;
+}
+
 template <int N>
 void
 bar (void)
@@ -27,7 +51,10 @@ baz (T x)
 void
 test ()
 {
-  foo <0> ();
+  foo0 <0> ();    // Error
+  foo_1 <-1> ();  // OK
+  foobar0 <0> (); // OK
+  foobar1 <1> (); // Error
   bar <0> ();
   baz (0.0);
 }
diff --git a/gcc/testsuite/gfortran.dg/gomp/critical-hint-1.f90 b/gcc/testsuite/gfortran.dg/gomp/critical-hint-1.f90
new file mode 100644 (file)
index 0000000..c26b617
--- /dev/null
@@ -0,0 +1,94 @@
+subroutine example_criticial ()
+  use omp_lib
+  implicit none
+  integer, parameter :: my_omp_hint = omp_sync_hint_contended
+  integer i, a, b
+
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH0) hint(my_omp_hint)  ! OK
+      a = a + i;
+      !$omp end critical (HASH0)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH1) hint(omp_sync_hint_none)  ! OK
+      a = a + i;
+      !$omp end critical (HASH1)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH2) hint(omp_sync_hint_uncontended)  ! OK
+      a = a + i;
+      !$omp end critical (HASH2)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH3) hint(omp_sync_hint_contended)  ! OK
+      a = a + i;
+      !$omp end critical (HASH3)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH4) hint(omp_sync_hint_speculative)  ! OK
+      a = a + i;
+      !$omp end critical (HASH4)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH5) hint(omp_sync_hint_nonspeculative)  ! OK
+      a = a + i;
+      !$omp end critical (HASH5)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH6) hint(omp_sync_hint_contended + omp_sync_hint_speculative)  ! OK
+      a = a + i;
+      !$omp end critical (HASH6)
+  end do
+
+  !$omp parallel do
+  do i = 1, 10
+      ! Accepted but invalid: different hint for same name.
+      !$omp critical (HASH6) hint(omp_sync_hint_contended + omp_sync_hint_speculative)  ! OK
+      a = a + i;
+      !$omp end critical (HASH6)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      ! Accepted but invalid: Some random integer expr.
+      !$omp critical (HASH) hint(1 + 2)
+      a = a + i;
+      !$omp end critical (HASH)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH) hint(-3)  ! { dg-error "shall be a valid constant hint expression" }
+      a = a + i;
+      !$omp end critical (HASH)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH2) hint(b)  ! { dg-error "shall be a valid constant hint expression" }
+      a = a + i;
+      !$omp end critical (HASH2)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical () hint(omp_hint_speculative)  ! { dg-error "Invalid character in name" }
+      a = a + i;
+!      !$omp end critical
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical hint(omp_sync_hint_none)  ! OK
+      a = a + i;
+      !$omp end critical
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical hint(omp_sync_hint_contended)  ! { dg-error "CRITICAL at .1. with HINT clause requires a NAME, except when omp_sync_hint_none is used" }
+      a = a + i;
+      !$omp end critical
+  end do
+end
diff --git a/gcc/testsuite/gfortran.dg/gomp/critical-hint-2.f90 b/gcc/testsuite/gfortran.dg/gomp/critical-hint-2.f90
new file mode 100644 (file)
index 0000000..15d6206
--- /dev/null
@@ -0,0 +1,65 @@
+! { dg-additional-options "-fdump-tree-original" }
+subroutine example_criticial ()
+  use omp_lib
+  implicit none
+  integer, parameter :: my_omp_hint = omp_sync_hint_contended
+  integer i, a, b
+
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH0) hint(my_omp_hint)
+      a = a + i;
+      !$omp end critical (HASH0)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH1), hint(omp_sync_hint_none)
+      a = a + i;
+      !$omp end critical (HASH1)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH2) hint(omp_sync_hint_uncontended)
+      a = a + i;
+      !$omp end critical (HASH2)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH3) hint(omp_sync_hint_contended)
+      a = a + i;
+      !$omp end critical (HASH3)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH4) hint(omp_sync_hint_speculative)
+      a = a + i;
+      !$omp end critical (HASH4)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH5) hint(omp_sync_hint_nonspeculative)
+      a = a + i;
+      !$omp end critical (HASH5)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical (HASH6), hint(omp_sync_hint_contended + omp_sync_hint_speculative)
+      a = a + i;
+      !$omp end critical (HASH6)
+  end do
+  !$omp parallel do
+  do i = 1, 10
+      !$omp critical hint(omp_sync_hint_none + omp_sync_hint_none)
+      a = a + i;
+      !$omp end critical
+  end do
+end
+
+! { dg-final { scan-tree-dump-times "omp critical \\(hash0\\) hint\\(2\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical \\(hash1\\) hint\\(0\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical \\(hash2\\) hint\\(1\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical \\(hash3\\) hint\\(2\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical \\(hash4\\) hint\\(8\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical \\(hash5\\) hint\\(4\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical \\(hash6\\) hint\\(10\\)" 1 "original" } }
+! { dg-final { scan-tree-dump-times "omp critical hint\\(0\\)" 1 "original" } }
index 666b5152a5fac57fe6fc4aafca5e276a5ebb473d..b22bcbaf77013559cfe1b99fc6901d75da3ded44 100644 (file)
@@ -31,7 +31,8 @@
         integer, parameter :: omp_nest_lock_kind = @OMP_NEST_LOCK_KIND@
         integer, parameter :: omp_sched_kind = 4
         integer, parameter :: omp_proc_bind_kind = 4
-        integer, parameter :: omp_lock_hint_kind = 4
+        integer, parameter :: omp_sync_hint_kind = 4
+        integer, parameter :: omp_lock_hint_kind = omp_sync_hint_kind
         integer, parameter :: omp_pause_resource_kind = 4
         integer, parameter :: omp_allocator_handle_kind = c_intptr_t
         integer, parameter :: omp_alloctrait_key_kind = c_int
         integer (omp_proc_bind_kind), &
                  parameter :: omp_proc_bind_spread = 4
         integer (omp_lock_hint_kind), &
-                 parameter :: omp_lock_hint_none = 0
+                 parameter :: omp_sync_hint_none = 0
         integer (omp_lock_hint_kind), &
-                 parameter :: omp_lock_hint_uncontended = 1
+                 parameter :: omp_lock_hint_none = omp_sync_hint_none
         integer (omp_lock_hint_kind), &
-                 parameter :: omp_lock_hint_contended = 2
+                 parameter :: omp_sync_hint_uncontended = 1
         integer (omp_lock_hint_kind), &
-                 parameter :: omp_lock_hint_nonspeculative = 4
+                 parameter :: omp_lock_hint_uncontended &
+                 = omp_sync_hint_uncontended
         integer (omp_lock_hint_kind), &
-                 parameter :: omp_lock_hint_speculative = 8
+                 parameter :: omp_sync_hint_contended = 2
+        integer (omp_lock_hint_kind), &
+                 parameter :: omp_lock_hint_contended &
+                 = omp_sync_hint_contended
+        integer (omp_lock_hint_kind), &
+                 parameter :: omp_sync_hint_nonspeculative = 4
+        integer (omp_lock_hint_kind), &
+                 parameter :: omp_lock_hint_nonspeculative &
+                 = omp_sync_hint_nonspeculative
+        integer (omp_lock_hint_kind), &
+                 parameter :: omp_sync_hint_speculative = 8
+        integer (omp_lock_hint_kind), &
+                 parameter :: omp_lock_hint_speculative &
+                 = omp_sync_hint_speculative
         integer (kind=omp_pause_resource_kind), &
                  parameter :: omp_pause_soft = 1
         integer (kind=omp_pause_resource_kind), &
index 34babe93ab9d726c8523663e0d2c25f23b934adc..c7d444d4a97f73d79241ccf514ed55b6cabcfcae 100644 (file)
       parameter (omp_proc_bind_master = 2)
       parameter (omp_proc_bind_close = 3)
       parameter (omp_proc_bind_spread = 4)
+      integer omp_sync_hint_kind
       integer omp_lock_hint_kind
-      parameter (omp_lock_hint_kind = 4)
+      parameter (omp_sync_hint_kind = 4)
+      parameter (omp_lock_hint_kind = omp_sync_hint_kind)
+      integer (omp_sync_hint_kind) omp_sync_hint_none
       integer (omp_lock_hint_kind) omp_lock_hint_none
+      integer (omp_sync_hint_kind) omp_sync_hint_uncontended
       integer (omp_lock_hint_kind) omp_lock_hint_uncontended
-      integer (omp_lock_hint_kind) omp_lock_hint_contended
+      integer (omp_sync_hint_kind) omp_sync_hint_contended
+      integer (omp_sync_hint_kind) omp_lock_hint_contended
+      integer (omp_lock_hint_kind) omp_sync_hint_nonspeculative
       integer (omp_lock_hint_kind) omp_lock_hint_nonspeculative
+      integer (omp_sync_hint_kind) omp_sync_hint_speculative
       integer (omp_lock_hint_kind) omp_lock_hint_speculative
+      parameter (omp_sync_hint_none = 0)
       parameter (omp_lock_hint_none = 0)
+      parameter (omp_sync_hint_uncontended = 1)
       parameter (omp_lock_hint_uncontended = 1)
+      parameter (omp_sync_hint_contended = 2)
       parameter (omp_lock_hint_contended = 2)
+      parameter (omp_sync_hint_nonspeculative = 4)
       parameter (omp_lock_hint_nonspeculative = 4)
+      parameter (omp_sync_hint_speculative = 8)
       parameter (omp_lock_hint_speculative = 8)
       parameter (openmp_version = 201511)
       integer omp_pause_resource_kind