]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP: Add strictly nested API call check [PR102972]
authorTobias Burnus <tobias@codesourcery.com>
Sat, 30 Oct 2021 21:45:32 +0000 (23:45 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Sun, 27 Feb 2022 20:25:51 +0000 (21:25 +0100)
The teams construct only permits omp_get_num_teams and omp_get_team_num
as API call in strictly nested regions - check for it.

Additionally, for Fortran, using DECL_NAME does not show the mangled
name, hence, DECL_ASSEMBLER_NAME had to be used to.

Finally, 'target device(ancestor:1)' wrongly rejected non-API calls
as well.

PR middle-end/102972
gcc/ChangeLog:

* omp-low.c (omp_runtime_api_call): Use DECL_ASSEMBLER_NAME to get
internal Fortran name; new permit_num_teams arg to permit
omp_get_num_teams and omp_get_team_num.
(scan_omp_1_stmt): Update call to it, add missing call for
reverse offload, and check for strictly nested API calls in teams.

gcc/testsuite/ChangeLog:

* c-c++-common/gomp/target-device-ancestor-3.c: Add non-API
routine test.
* gfortran.dg/gomp/order-6.f90: Add missing bind(C).
* c-c++-common/gomp/teams-3.c: New test.
* gfortran.dg/gomp/teams-3.f90: New test.
* gfortran.dg/gomp/teams-4.f90: New test.

libgomp/ChangeLog:
* testsuite/libgomp.c-c++-common/icv-3.c: Nest API calls inside
parallel construct.
* testsuite/libgomp.c-c++-common/icv-4.c: Likewise.
* testsuite/libgomp.c/target-3.c: Likewise.
* testsuite/libgomp.c/target-5.c: Likewise.
* testsuite/libgomp.c/target-6.c: Likewise.
* testsuite/libgomp.c/target-teams-1.c: Likewise.
* testsuite/libgomp.c/teams-1.c: Likewise.
* testsuite/libgomp.c/thread-limit-2.c: Likewise.
* testsuite/libgomp.c/thread-limit-3.c: Likewise.
* testsuite/libgomp.c/thread-limit-4.c: Likewise.
* testsuite/libgomp.c/thread-limit-5.c: Likewise.
* testsuite/libgomp.fortran/icv-3.f90: Likewise.
* testsuite/libgomp.fortran/icv-4.f90: Likewise.
* testsuite/libgomp.fortran/teams1.f90: Likewise.

(cherry picked from commit 948d461954f2642ca187f86c19d297ba7a86320f)

23 files changed:
gcc/ChangeLog.omp
gcc/omp-low.c
gcc/testsuite/ChangeLog.omp
gcc/testsuite/c-c++-common/gomp/target-device-ancestor-3.c
gcc/testsuite/c-c++-common/gomp/teams-3.c [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/order-6.f90
gcc/testsuite/gfortran.dg/gomp/teams-3.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/teams-4.f90 [new file with mode: 0644]
libgomp/ChangeLog.omp
libgomp/testsuite/libgomp.c-c++-common/icv-3.c
libgomp/testsuite/libgomp.c-c++-common/icv-4.c
libgomp/testsuite/libgomp.c/target-3.c
libgomp/testsuite/libgomp.c/target-5.c
libgomp/testsuite/libgomp.c/target-6.c
libgomp/testsuite/libgomp.c/target-teams-1.c
libgomp/testsuite/libgomp.c/teams-1.c
libgomp/testsuite/libgomp.c/thread-limit-2.c
libgomp/testsuite/libgomp.c/thread-limit-3.c
libgomp/testsuite/libgomp.c/thread-limit-4.c
libgomp/testsuite/libgomp.c/thread-limit-5.c
libgomp/testsuite/libgomp.fortran/icv-3.f90
libgomp/testsuite/libgomp.fortran/icv-4.f90
libgomp/testsuite/libgomp.fortran/teams1.f90

index 35dafbba30f0a7756cd9b3749e119920a7fe9d2c..6ae003c760044ccaf39565216479831d2a74c404 100644 (file)
@@ -1,3 +1,15 @@
+2022-02-27  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-10-30  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/102972
+       * omp-low.c (omp_runtime_api_call): Use DECL_ASSEMBLER_NAME to get
+       internal Fortran name; new permit_num_teams arg to permit
+       omp_get_num_teams and omp_get_team_num.
+       (scan_omp_1_stmt): Update call to it, add missing call for
+       reverse offload, and check for strictly nested API calls in teams.
+
 2022-02-11  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * omp-general.c (DELAY_METADIRECTIVES_AFTER_LTO): Check that cfun is
index 05e32f225f375e0e349b81ecddcf614122ad17b5..8f748a442c8fa13064ad0d2562c50379356f826e 100644 (file)
@@ -4386,7 +4386,8 @@ omp_runtime_api_call (const_tree fndecl)
       "target_memcpy",
       "target_memcpy_rect",
       NULL,
-      /* Now omp_* calls that are available as omp_* and omp_*_.  */
+      /* Now omp_* calls that are available as omp_* and omp_*_; however, the
+        DECL_NAME is always omp_* without tailing underscore.  */
       "capture_affinity",
       "destroy_allocator",
       "destroy_lock",
@@ -4438,7 +4439,8 @@ omp_runtime_api_call (const_tree fndecl)
       "unset_lock",
       "unset_nest_lock",
       NULL,
-      /* And finally calls available as omp_*, omp_*_ and omp_*_8_.  */
+      /* And finally calls available as omp_*, omp_*_ and omp_*_8_; however,
+        as DECL_NAME only omp_* and omp_*_8 appear.  */
       "display_env",
       "get_ancestor_thread_num",
       "init_allocator",
@@ -4468,11 +4470,7 @@ omp_runtime_api_call (const_tree fndecl)
       size_t len = strlen (omp_runtime_apis[i]);
       if (strncmp (name + 4, omp_runtime_apis[i], len) == 0
          && (name[4 + len] == '\0'
-             || (mode > 0
-                 && name[4 + len] == '_'
-                 && (name[4 + len + 1] == '\0'
-                     || (mode > 1
-                         && strcmp (name + 4 + len + 1, "8_") == 0)))))
+             || (mode > 1 && strcmp (name + 4 + len, "_8") == 0)))
        return true;
     }
   return false;
@@ -4539,9 +4537,26 @@ scan_omp_1_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
                            "OpenMP runtime API call %qD in a region with "
                            "%<order(concurrent)%> clause", fndecl);
                }
+             if (gimple_code (ctx->stmt) == GIMPLE_OMP_TEAMS
+                 && omp_runtime_api_call (fndecl)
+                 && ((IDENTIFIER_LENGTH (DECL_NAME (fndecl))
+                      != strlen ("omp_get_num_teams"))
+                     || strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)),
+                                "omp_get_num_teams") != 0)
+                 && ((IDENTIFIER_LENGTH (DECL_NAME (fndecl))
+                      != strlen ("omp_get_team_num"))
+                     || strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)),
+                                "omp_get_team_num") != 0))
+               {
+                 remove = true;
+                 error_at (gimple_location (stmt),
+                           "OpenMP runtime API call %qD strictly nested in a "
+                           "%<teams%> region", fndecl);
+               }
              if (gimple_code (ctx->stmt) == GIMPLE_OMP_TARGET
                  && (gimple_omp_target_kind (ctx->stmt)
-                     == GF_OMP_TARGET_KIND_REGION))
+                     == GF_OMP_TARGET_KIND_REGION)
+                 && omp_runtime_api_call (fndecl))
                {
                  tree tgt_clauses = gimple_omp_target_clauses (ctx->stmt);
                  tree c = omp_find_clause (tgt_clauses, OMP_CLAUSE_DEVICE);
index 1bfbf8c9312300377ffb0d986297a11f2fccf6b8..02ab20e8faa07b131f8421dedf09fc2404156de1 100644 (file)
@@ -1,3 +1,16 @@
+2022-02-27  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-10-30  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/102972
+       * c-c++-common/gomp/target-device-ancestor-3.c: Add non-API
+       routine test.
+       * gfortran.dg/gomp/order-6.f90: Add missing bind(C).
+       * c-c++-common/gomp/teams-3.c: New test.
+       * gfortran.dg/gomp/teams-3.f90: New test.
+       * gfortran.dg/gomp/teams-4.f90: New test.
+
 2022-02-18  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * c-c++-common/gomp/metadirective-1.c (f): Add test for
index 61098a5109a7809a8aec4ccf2c3ac0a95a60565e..d16590107d2fe461f2b220bcf522340e690ddafc 100644 (file)
@@ -3,6 +3,7 @@ extern "C" {
 #endif
 
 int omp_get_num_teams (void);
+int bar (void);
 
 #ifdef __cplusplus
 }
@@ -22,6 +23,7 @@ foo (void)
 
   #pragma omp target device (ancestor: 1)
     {
+      a = bar (); /* OK */
       a = omp_get_num_teams (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_teams\[^\n\r]*' in a region with 'device\\(ancestor\\)' clause" }  */
     }
 
diff --git a/gcc/testsuite/c-c++-common/gomp/teams-3.c b/gcc/testsuite/c-c++-common/gomp/teams-3.c
new file mode 100644 (file)
index 0000000..7f8b47f
--- /dev/null
@@ -0,0 +1,64 @@
+/* PR middle-end/102972 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* From omp.h  */
+extern int omp_get_num_teams (void);
+extern void omp_set_num_teams (int);
+extern int omp_get_team_size (int);
+extern int omp_get_team_num (void);
+extern int omp_get_max_teams (void);
+extern void omp_set_teams_thread_limit (int);
+extern int omp_get_teams_thread_limit (void);
+extern int omp_is_initial_device (void);
+extern int omp_get_num_threads (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+void valid ()
+{
+  #pragma omp teams
+  {
+    #pragma omp distribute
+    for (int i = 0; i < 64; i++)
+      ;
+
+    int n = omp_get_num_teams ();
+    if (n >= omp_get_team_num ())
+      __builtin_abort ();
+
+    #pragma omp parallel for
+    for (int i = 0; i < 64; i++)
+      if (!omp_is_initial_device () || omp_get_num_threads () < 0)
+       __builtin_abort ();
+
+    #pragma omp loop
+    for (int i = 0; i < 64; i++)
+      ;
+  }
+}
+
+void invalid_nest ()
+{
+  #pragma omp teams
+  {
+    #pragma distribute parallel for simd
+    for (int i = 0; i < 64; i++)
+      ;
+
+    int n = 0;
+    n += omp_get_team_size (0);  /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_team_size\[^\n\r]*' strictly nested in a 'teams' region" }  */
+    n += omp_get_num_teams ();
+    n += omp_get_team_num ();
+    omp_set_num_teams (n);  /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_set_num_teams\[^\n\r]*' strictly nested in a 'teams' region" }  */
+    n += omp_get_max_teams ();  /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_max_teams\[^\n\r]*' strictly nested in a 'teams' region" }  */
+    n += omp_get_teams_thread_limit ();  /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_teams_thread_limit\[^\n\r]*' strictly nested in a 'teams' region" }  */
+    omp_set_teams_thread_limit (n);  /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_set_teams_thread_limit\[^\n\r]*' strictly nested in a 'teams' region" }  */
+  }
+}
index c8aeecb6f27e91d0dfba395321239e86a94f4251..8d7f9c57a98dd78edb1ca6d46b2dcd576a03ea6b 100644 (file)
@@ -8,7 +8,7 @@ module m
     end
     integer function omp_get_num_threads ()
     end
-    integer function omp_target_is_present (x, i)
+    integer function omp_target_is_present (x, i) bind(c)
       import :: c_ptr
       type(c_ptr) :: x
       integer, value :: i
diff --git a/gcc/testsuite/gfortran.dg/gomp/teams-3.f90 b/gcc/testsuite/gfortran.dg/gomp/teams-3.f90
new file mode 100644 (file)
index 0000000..fac3393
--- /dev/null
@@ -0,0 +1,65 @@
+! PR middle-end/102972
+
+module m
+implicit none (type, external)
+interface
+subroutine omp_set_num_teams (num_teams); integer :: num_teams; end
+subroutine omp_set_teams_thread_limit (thread_limit); integer :: thread_limit; end
+subroutine omp_set_num_teams_8 (num_teams); integer(8) :: num_teams; end
+subroutine omp_set_num_teams_9 (num_teams); integer :: num_teams; end
+subroutine omp_set_teams_thread_limit_8 (thread_limit); integer(8) :: thread_limit; end
+integer function omp_get_num_teams (); end
+integer function omp_get_team_size (level); integer :: level; end
+integer function omp_get_team_num (); end
+integer function omp_get_max_teams (); end
+integer function omp_get_teams_thread_limit (); end
+logical function omp_is_initial_device (); end
+integer function omp_get_num_threads (); end
+end interface
+
+contains
+
+subroutine valid ()
+  integer :: i, n
+  !$omp teams
+    !$omp distribute
+    do i = 1, 64
+    end do
+
+    n = omp_get_num_teams ()
+    if (n >= omp_get_team_num ()) &
+      error stop
+
+    !$omp parallel do
+    do i = 1, 64
+      if (.not.omp_is_initial_device () .or. omp_get_num_threads () < 0) &
+        error stop
+    end do
+
+    !$omp loop
+    do i = 1, 64
+    end do
+  !$omp end teams
+end
+
+subroutine invalid_nest ()
+  integer :: i, n
+  !$omp teams
+    !$omp distribute parallel do simd
+    do i = 1, 64
+    end do
+
+    n = 0
+    n = n + omp_get_team_size (0)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_team_size\[^\n\r]*' strictly nested in a 'teams' region" }
+    n = n + omp_get_num_teams ()
+    n = n + omp_get_team_num ()
+    call omp_set_num_teams (n)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_set_num_teams\[^\n\r]*' strictly nested in a 'teams' region" }
+    call omp_set_num_teams_8 (4_8)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_set_num_teams_8\[^\n\r]*' strictly nested in a 'teams' region" }
+    call omp_set_num_teams_9 (4)  ! OK - but misnamed user function
+    n = n + omp_get_max_teams ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_max_teams\[^\n\r]*' strictly nested in a 'teams' region" }
+    n = n + omp_get_teams_thread_limit ()  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_teams_thread_limit\[^\n\r]*' strictly nested in a 'teams' region" }
+    call omp_set_teams_thread_limit (n)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_set_teams_thread_limit'\[^\n\r]* strictly nested in a 'teams' region" }
+    call omp_set_teams_thread_limit_8 (3_8)  ! { dg-error "OpenMP runtime API call '\[^\n\r]*omp_set_teams_thread_limit_8'\[^\n\r]* strictly nested in a 'teams' region" }
+  !$omp end teams
+end
+end module
diff --git a/gcc/testsuite/gfortran.dg/gomp/teams-4.f90 b/gcc/testsuite/gfortran.dg/gomp/teams-4.f90
new file mode 100644 (file)
index 0000000..422c2c9
--- /dev/null
@@ -0,0 +1,47 @@
+! PR middle-end/102972
+
+module m
+implicit none (type, external)
+
+! Note: Those are module functions - not an interface
+! Hence, they are internally manged to contain the module name!
+
+contains
+
+subroutine omp_set_num_teams (num_teams); integer :: num_teams; end
+subroutine omp_set_teams_thread_limit (thread_limit); integer :: thread_limit; end
+subroutine omp_set_num_teams_8 (num_teams); integer(8) :: num_teams; end
+subroutine omp_set_num_teams_9 (num_teams); integer :: num_teams; end
+subroutine omp_set_teams_thread_limit_8 (thread_limit); integer(8) :: thread_limit; end
+integer function omp_get_num_teams (); omp_get_num_teams = 0; end
+integer function omp_get_team_size (level); integer :: level; omp_get_team_size = 0; end
+integer function omp_get_team_num (); omp_get_team_num = 0; end
+integer function omp_get_max_teams (); omp_get_max_teams = 0; end
+integer function omp_get_teams_thread_limit (); omp_get_teams_thread_limit = 0; end
+logical function omp_is_initial_device (); omp_is_initial_device = .true.; end
+integer function omp_get_num_threads (); omp_get_num_threads = 0; end
+end module
+
+subroutine nest_test ()
+  use m
+  implicit none (type, external)
+  
+  integer :: i, n
+  !$omp teams
+    !$omp distribute parallel do simd
+    do i = 1, 64
+    end do
+
+    n = 0
+    n = n + omp_get_team_size (0)
+    n = n + omp_get_num_teams ()
+    n = n + omp_get_team_num ()
+    call omp_set_num_teams (n)
+    call omp_set_num_teams_8 (4_8)
+    call omp_set_num_teams_9 (4)
+    n = n + omp_get_max_teams ()
+    n = n + omp_get_teams_thread_limit ()
+    call omp_set_teams_thread_limit (n)
+    call omp_set_teams_thread_limit_8 (3_8)
+  !$omp end teams
+end
index a3de02f445f4bb7993b62e25c29d5fb4230f7109..0546effcbcddf0135153d993c55d7bed25de4216 100644 (file)
@@ -1,3 +1,25 @@
+2022-02-27  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-10-30  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/102972
+       * testsuite/libgomp.c-c++-common/icv-3.c: Nest API calls inside
+       parallel construct.
+       * testsuite/libgomp.c-c++-common/icv-4.c: Likewise.
+       * testsuite/libgomp.c/target-3.c: Likewise.
+       * testsuite/libgomp.c/target-5.c: Likewise.
+       * testsuite/libgomp.c/target-6.c: Likewise.
+       * testsuite/libgomp.c/target-teams-1.c: Likewise.
+       * testsuite/libgomp.c/teams-1.c: Likewise.
+       * testsuite/libgomp.c/thread-limit-2.c: Likewise.
+       * testsuite/libgomp.c/thread-limit-3.c: Likewise.
+       * testsuite/libgomp.c/thread-limit-4.c: Likewise.
+       * testsuite/libgomp.c/thread-limit-5.c: Likewise.
+       * testsuite/libgomp.fortran/icv-3.f90: Likewise.
+       * testsuite/libgomp.fortran/icv-4.f90: Likewise.
+       * testsuite/libgomp.fortran/teams1.f90: Likewise.
+
 2022-01-28  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * testsuite/libgomp.c-c++-common/metadirective-2.c (main): Add
index 54cbf99b5974534ddd0024277ec4309c7abf85f0..8bf24d93662a2ee115853c954566dc7363a09bc7 100644 (file)
@@ -18,6 +18,7 @@ main ()
     abort ();
   #pragma omp teams
   {
+    #pragma omp parallel if(0)
     if (omp_get_max_teams () != 7
        || omp_get_teams_thread_limit () != 15
        || omp_get_num_teams () < 1
@@ -30,6 +31,7 @@ main ()
   }
   #pragma omp teams num_teams(5) thread_limit (13)
   {
+    #pragma omp parallel if(0)
     if (omp_get_max_teams () != 7
        || omp_get_teams_thread_limit () != 15
        || omp_get_num_teams () != 5
@@ -41,6 +43,7 @@ main ()
   }
   #pragma omp teams num_teams(8) thread_limit (16)
   {
+    #pragma omp parallel if(0)
     if (omp_get_max_teams () != 7
        || omp_get_teams_thread_limit () != 15
        || omp_get_num_teams () != 8
index 6cb671d8ac74c87bc4184ca79b93a37e2d8c1307..b987a33292b381f4816d946e12977667d86a2e6f 100644 (file)
@@ -26,6 +26,7 @@ main ()
     omp_set_teams_thread_limit (12);
   #pragma omp teams
   {
+    #pragma omp parallel if(0)
     if (omp_get_max_teams () != 6
        || omp_get_teams_thread_limit () != 12
        || omp_get_num_teams () < 1
index 7002cf287f92900c16cecebaab514a458f5eae71..ec818d24f6912e24082fb76ff03e1ca8c98e117c 100644 (file)
@@ -11,7 +11,9 @@ main ()
     abort ();
   #pragma omp target if (0)
   #pragma omp teams
-  if (omp_get_level ())
-    abort ();
+  #pragma omp distribute dist_schedule(static,1)
+  for (int i = 0; i < 1; ++i)
+    if (omp_get_level ())
+      abort ();
   return 0;
 }
index 21a69ea68121238347ba711e2bc543078c90e266..20b1b4d2474adb58c3cbce584aaae23d1b124826 100644 (file)
@@ -55,6 +55,7 @@ main ()
     abort ();
   #pragma omp target if (0)
   #pragma omp teams
+  #pragma omp parallel if(0)
   {
     omp_sched_t s_c;
     int c_c;
index 8ffcb5b5b6ae01340594fa23860bcceb8b3d032c..1c4d8caf0a6b9fc85f08cb81b2fd49616104dd0f 100644 (file)
@@ -47,11 +47,13 @@ main ()
                {
                  #pragma omp teams thread_limit (2)
                    {
-                     if (omp_in_parallel ()
-                         || omp_get_level () != 0
-                         || omp_get_ancestor_thread_num (0) != 0
-                         || omp_get_ancestor_thread_num (1) != -1)
-                       abort ();
+                     #pragma omp distribute dist_schedule(static,1)
+                     for (int i = 0; i < 1; ++i)
+                       if (omp_in_parallel ()
+                           || omp_get_level () != 0
+                           || omp_get_ancestor_thread_num (0) != 0
+                           || omp_get_ancestor_thread_num (1) != -1)
+                         abort ();
                      #pragma omp parallel num_threads (2)
                      {
                        if (!omp_in_parallel ()
index 8f591e02c48afbb54912c646510d0d7408eeee01..adbabef82b397705be429b8bb284d553c882cc94 100644 (file)
@@ -35,76 +35,115 @@ foo (int a, int b, long c, long d)
     abort ();
   #pragma omp target map(from: err)
   #pragma omp teams
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1;
+  {
+    err = omp_get_num_teams () < 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1;
+  }
   if (err)
     abort ();
   #pragma omp target teams map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1;
+  {
+    err = omp_get_num_teams () < 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1;
+  }
   if (err)
     abort ();
   #pragma omp target map(from: err)
   #pragma omp teams num_teams (4)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > 4;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > 4;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1;
+  }
   if (err)
     abort ();
   #pragma omp target teams num_teams (4) map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > 4;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > 4;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1;
+  }
   if (err)
     abort ();
   #pragma omp target map(from: err)
   #pragma omp teams thread_limit (7)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_thread_limit () > 7;
+  {
+    err = omp_get_num_teams () < 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > 7;
+  }
   if (err)
     abort ();
   #pragma omp target teams thread_limit (7) map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_thread_limit () > 7;
+  {
+    err = omp_get_num_teams () < 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > 7;
+  }
   if (err)
     abort ();
   #pragma omp target map(from: err)
   #pragma omp teams num_teams (4) thread_limit (8)
   {
     {
-      err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-           || omp_get_num_teams () > 4 || omp_get_thread_limit () > 8;
+      err = omp_get_num_teams () < 1 || omp_get_num_teams () > 4;
     }
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > 8;
   }
   if (err)
     abort ();
   #pragma omp target teams num_teams (4) thread_limit (8) map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > 4 || omp_get_thread_limit () > 8;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > 4;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > 8;
+  }
   if (err)
     abort ();
   #pragma omp target map(from: err)
   #pragma omp teams num_teams (a) thread_limit (b)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > a || omp_get_thread_limit () > b;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > a;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > b;
+  }
   if (err)
     abort ();
   #pragma omp target teams num_teams (a) thread_limit (b) map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > a || omp_get_thread_limit () > b;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > a;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > b;
+  }
   if (err)
     abort ();
   #pragma omp target map(from: err)
   #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > c + 1 || omp_get_thread_limit () > d - 1;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > c + 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > d - 1;
+  }
   if (err)
     abort ();
   #pragma omp target teams num_teams (c + 1) thread_limit (d - 1) map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > c + 1 || omp_get_thread_limit () > d - 1;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > c + 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > d - 1;
+  }
   if (err)
     abort ();
   #pragma omp target map (always, to: c, d) map(from: err)
   #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > c + 1 || omp_get_thread_limit () > d - 1;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > c + 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > d - 1;
+  }
   if (err)
     abort ();
   #pragma omp target data map (to: c, d)
@@ -116,8 +155,11 @@ foo (int a, int b, long c, long d)
        their device and original values match is unclear.  */
     #pragma omp target map (to: c, d) map(from: err)
     #pragma omp teams num_teams (c + 1) thread_limit (d - 1)
-    err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-         || omp_get_num_teams () > c + 1 || omp_get_thread_limit () > d - 1;
+    {
+      err = omp_get_num_teams () < 1 || omp_get_num_teams () > c + 1;
+      #pragma omp parallel if(0)
+      err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > d - 1;
+    }
     if (err)
       abort ();
   }
@@ -125,21 +167,30 @@ foo (int a, int b, long c, long d)
      target involved.  */
   #pragma omp target map(from: err)
   #pragma omp teams num_teams (baz () + 1) thread_limit (baz () - 1)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > baz () + 1 || omp_get_thread_limit () > baz () - 1;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > baz () + 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > baz () - 1;
+  }
   if (err)
     abort ();
   #pragma omp target teams num_teams (baz () + 1) thread_limit (baz () - 1) map(from: err)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > baz () + 1 || omp_get_thread_limit () > baz () - 1;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > baz () + 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > baz () - 1;
+  }
   if (err)
     abort ();
   /* This one can't be optimized, as v might have different value between
      host and target.  */
   #pragma omp target map(from: err)
   #pragma omp teams num_teams (v + 1) thread_limit (v - 1)
-  err = omp_get_num_teams () < 1 || omp_get_thread_limit () < 1
-       || omp_get_num_teams () > v + 1 || omp_get_thread_limit () > v - 1;
+  {
+    err = omp_get_num_teams () < 1 || omp_get_num_teams () > v + 1;
+    #pragma omp parallel if(0)
+    err |= omp_get_thread_limit () < 1 || omp_get_thread_limit () > v - 1;
+  }
   if (err)
     abort ();
 }
index 977e5fc53234a6f573468591c63df2691f38e855..09b357062f8a8f98e9227f16f805ad823409af4d 100644 (file)
@@ -6,15 +6,17 @@
 int
 main ()
 {
+  omp_set_dynamic (0);
+  omp_set_nested (1);
   #pragma omp teams thread_limit (2)
   {
+    #pragma omp distribute dist_schedule(static,1)
+    for (int i = 0; i < 1; ++i)
     if (omp_in_parallel ()
        || omp_get_level () != 0
        || omp_get_ancestor_thread_num (0) != 0
        || omp_get_ancestor_thread_num (1) != -1)
       abort ();
-    omp_set_dynamic (0);
-    omp_set_nested (1);
     #pragma omp parallel num_threads (2)
     {
       if (!omp_in_parallel ()
index 2cff1fd48c33c27f0a6079ea5d6274599fdaa153..7997a70adc356ae0a50381ca92885f899f71147d 100644 (file)
@@ -20,25 +20,26 @@ main ()
   if (omp_get_num_threads () > 9)
     abort ();
   #pragma omp target if (0)
-  #pragma omp teams thread_limit (6)
   {
-    if (omp_get_thread_limit () > 6)
-      abort ();
-    if (omp_get_thread_limit () == 6)
+    omp_set_dynamic (0);
+    omp_set_nested (1);
+    #pragma omp teams thread_limit (6)
       {
-       omp_set_dynamic (0);
-       omp_set_nested (1);
        #pragma omp parallel num_threads (3)
-       if (omp_get_num_threads () != 3)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () != 3))
          abort ();
        #pragma omp parallel num_threads (3)
-       if (omp_get_num_threads () != 3)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () != 3))
          abort ();
        #pragma omp parallel num_threads (8)
-       if (omp_get_num_threads () > 6)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () > 6))
          abort ();
        #pragma omp parallel num_threads (6)
-       if (omp_get_num_threads () != 6)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () != 6))
          abort ();
        int cnt = 0;
        #pragma omp parallel num_threads (5)
index af9bd7887abdc0915d8fb775b8db68d79a42db7f..01b33968c1b562083987c72988b03806b3811734 100644 (file)
@@ -6,6 +6,7 @@ main ()
 {
   #pragma omp target if (0)
   #pragma omp teams thread_limit (1)
+  #pragma omp parallel if (0)
   if (omp_get_thread_limit () != 1)
     abort ();
   return 0;
index 351423cab9456857eec10c34ae0cfdb1cd26bc13..c6ccc7d63307b4cd66da82352c2823378e02aee8 100644 (file)
@@ -18,25 +18,25 @@ main ()
   #pragma omp parallel num_threads (16)
   if (omp_get_num_threads () > 9)
     abort ();
+  omp_set_dynamic (0);
+  omp_set_nested (1);
   #pragma omp teams thread_limit (6)
-  {
-    if (omp_get_thread_limit () > 6)
-      abort ();
-    if (omp_get_thread_limit () == 6)
-      {
-       omp_set_dynamic (0);
-       omp_set_nested (1);
+    {
        #pragma omp parallel num_threads (3)
-       if (omp_get_num_threads () != 3)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () != 3))
          abort ();
        #pragma omp parallel num_threads (3)
-       if (omp_get_num_threads () != 3)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () != 3))
          abort ();
        #pragma omp parallel num_threads (8)
-       if (omp_get_num_threads () > 6)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () > 6))
          abort ();
        #pragma omp parallel num_threads (6)
-       if (omp_get_num_threads () != 6)
+       if (omp_get_thread_limit () > 6
+           || (omp_get_thread_limit () == 6 && omp_get_num_threads () != 6))
          abort ();
        int cnt = 0;
        #pragma omp parallel num_threads (5)
@@ -52,7 +52,6 @@ main ()
          #pragma omp atomic
          --cnt;
        }
-      }
-  }
+    }
   return 0;
 }
index d3d22b1e1a622e75c7dad39f79a254382d719622..d72988dcc54b720eecb5d305f1af3b76b70bf372 100644 (file)
@@ -5,6 +5,7 @@ int
 main ()
 {
   #pragma omp teams thread_limit (1)
+  #pragma omp parallel if(0)
   if (omp_get_thread_limit () != 1)
     abort ();
   return 0;
index b2ccd776223f1cbbf80c1b9807f8cb2f621cdf0e..4f81a63a3b6b5ae660d65a3711dcc6eef0507f10 100644 (file)
@@ -13,6 +13,7 @@ implicit none (type, external)
   if (omp_get_teams_thread_limit () /= 15) &
     error stop 4
   !$omp teams
+   !$omp parallel if(.false.)
     if (omp_get_max_teams () /= 7 &
         .or. omp_get_teams_thread_limit () /= 15 &
         .or. omp_get_num_teams () < 1 &
@@ -22,8 +23,10 @@ implicit none (type, external)
         .or. omp_get_thread_limit () < 1 &
         .or. omp_get_thread_limit () > 15) &
       error stop 5
+   !$omp end parallel
   !$omp end teams
   !$omp teams num_teams(5) thread_limit (13)
+   !$omp parallel if(.false.)
     if (omp_get_max_teams () /= 7 &
         .or. omp_get_teams_thread_limit () /= 15 &
         .or. omp_get_num_teams () /= 5 &
@@ -32,8 +35,10 @@ implicit none (type, external)
         .or. omp_get_thread_limit () < 1 &
         .or. omp_get_thread_limit () > 13) &
       error stop 6
+   !$omp end parallel
   !$omp end teams
   !$omp teams num_teams(8) thread_limit (16)
+   !$omp parallel if(.false.)
     if (omp_get_max_teams () /= 7 &
         .or. omp_get_teams_thread_limit () /= 15 &
         .or. omp_get_num_teams () /= 8 &
@@ -42,6 +47,7 @@ implicit none (type, external)
         .or. omp_get_thread_limit () < 1 &
         .or. omp_get_thread_limit () > 16) &
       error stop 7
+   !$omp end parallel
   !$omp end teams
 contains
   logical function env_exists (name)
index f76c96d7d0d814d1ff56f1681d7c8d44aa6b99ed..2ae5d765b1bbcee330ad66e47d22952245024943 100644 (file)
@@ -16,6 +16,7 @@ implicit none (type, external)
     call omp_set_teams_thread_limit (12)
   end if
   !$omp teams
+   !$omp parallel if(.false.)
     if (omp_get_max_teams () /= 6 &
         .or. omp_get_teams_thread_limit () /= 12 &
         .or. omp_get_num_teams () < 1 &
@@ -25,6 +26,7 @@ implicit none (type, external)
         .or. omp_get_thread_limit () < 1 &
         .or. omp_get_thread_limit () > 12) &
       error stop 3
+   !$omp end parallel
   !$omp end teams
 contains
   logical function env_is_set (name, val)
index 0077a703f7489084daa1a4a13f0d32f68d4ffe3d..886765ab0afae45bec668cee6221304dd6d46c11 100644 (file)
@@ -2,13 +2,17 @@
 
 program teams1
   use omp_lib
+  integer :: i
 !$omp teams thread_limit (2)
-  if (omp_in_parallel ()) stop 1
-  if (omp_get_level () .ne. 0) stop 2
-  if (omp_get_ancestor_thread_num (0) .ne. 0) stop 3
-  if (omp_get_ancestor_thread_num (1) .ne. -1) stop 4
-  call omp_set_dynamic (.false.)
-  call omp_set_nested (.true.)
+  !$omp distribute dist_schedule(static,1)
+  do i = 1, 1
+    if (omp_in_parallel ()) stop 1
+    if (omp_get_level () .ne. 0) stop 2
+    if (omp_get_ancestor_thread_num (0) .ne. 0) stop 3
+    if (omp_get_ancestor_thread_num (1) .ne. -1) stop 4
+    call omp_set_dynamic (.false.)
+    call omp_set_nested (.true.)
+  end do
 !$omp parallel num_threads (2)
   if (.not. omp_in_parallel ()) stop 5
   if (omp_get_level () .ne. 1) stop 6