]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libgomp/loop_ull.c
Daily bump.
[thirdparty/gcc.git] / libgomp / loop_ull.c
index ac658023e13baba57575479673f1a8d67e156818..efee976d105b8ab6ac0fbbd01b7e5c38fd3d2ac8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005-2018 Free Software Foundation, Inc.
+/* Copyright (C) 2005-2024 Free Software Foundation, Inc.
    Contributed by Richard Henderson <rth@redhat.com>.
 
    This file is part of the GNU Offloading and Multi Processing Library
@@ -266,14 +266,20 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end,
       if (mem)
        {
          uintptr_t size = (uintptr_t) *mem;
-         if (size > (sizeof (struct gomp_work_share)
-                     - offsetof (struct gomp_work_share,
-                                 inline_ordered_team_ids)))
-           thr->ts.work_share->ordered_team_ids
-             = gomp_malloc_cleared (size);
+#define INLINE_ORDERED_TEAM_IDS_OFF \
+  ((offsetof (struct gomp_work_share, inline_ordered_team_ids)         \
+    + __alignof__ (long long) - 1) & ~(__alignof__ (long long) - 1))
+         if (sizeof (struct gomp_work_share)
+             <= INLINE_ORDERED_TEAM_IDS_OFF
+             || __alignof__ (struct gomp_work_share) < __alignof__ (long long)
+             || size > (sizeof (struct gomp_work_share)
+                       - INLINE_ORDERED_TEAM_IDS_OFF))
+           *mem
+             = (void *) (thr->ts.work_share->ordered_team_ids
+                         = gomp_malloc_cleared (size));
          else
-           memset (thr->ts.work_share->ordered_team_ids, '\0', size);
-         *mem = (void *) thr->ts.work_share->ordered_team_ids;
+           *mem = memset (((char *) thr->ts.work_share)
+                          + INLINE_ORDERED_TEAM_IDS_OFF, '\0', size);
        }
       gomp_work_share_init_done ();
     }
@@ -286,7 +292,18 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end,
                                                  first_reductions);
        }
       if (mem)
-       *mem = (void *) thr->ts.work_share->ordered_team_ids;
+       {
+         if ((offsetof (struct gomp_work_share, inline_ordered_team_ids)
+              & (__alignof__ (long long) - 1)) == 0)
+           *mem = (void *) thr->ts.work_share->ordered_team_ids;
+         else
+           {
+             uintptr_t p = (uintptr_t) thr->ts.work_share->ordered_team_ids;
+             p += __alignof__ (long long) - 1;
+             p &= ~(__alignof__ (long long) - 1);
+             *mem = (void *) p;
+           }
+       }
     }
 
   return ialias_call (GOMP_loop_ull_runtime_next) (istart, iend);