aboutsummaryrefslogtreecommitdiff
path: root/libgomp
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2019-06-05 12:19:00 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2019-06-05 12:19:00 +0000
commitafd0f6085788f1e2783c3d09e16cbab94e59435a (patch)
tree66d96899fe3922b03f73a7d35232af419e72573d /libgomp
parent396c8a309eeabe0ef8c7e09943ee09e170de7055 (diff)
Backported from mainline
2019-05-27 Jakub Jelinek <jakub@redhat.com> PR libgomp/90641 * work.c (gomp_init_work_share): Instead of aligning final ordered value to multiples of long long alignment, align to that the first part (ordered team ids) and if inline_ordered_team_ids is not on a long long alignment boundary within the structure, use __alignof__ (long long) - 1 pad size always. * loop.c (GOMP_loop_start): Fix *mem computation if inline_ordered_team_ids is not aligned on long long alignment boundary within the structure. * loop-ull.c (GOMP_loop_ull_start): Likewise. * sections.c (GOMP_sections2_start): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-9-branch@271958 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/ChangeLog14
-rw-r--r--libgomp/loop.c28
-rw-r--r--libgomp/loop_ull.c28
-rw-r--r--libgomp/sections.c28
-rw-r--r--libgomp/work.c9
5 files changed, 83 insertions, 24 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 2bc3592198a..8f54fa47eb2 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,6 +1,20 @@
2019-06-05 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2019-05-27 Jakub Jelinek <jakub@redhat.com>
+
+ PR libgomp/90641
+ * work.c (gomp_init_work_share): Instead of aligning final ordered
+ value to multiples of long long alignment, align to that the
+ first part (ordered team ids) and if inline_ordered_team_ids
+ is not on a long long alignment boundary within the structure,
+ use __alignof__ (long long) - 1 pad size always.
+ * loop.c (GOMP_loop_start): Fix *mem computation if
+ inline_ordered_team_ids is not aligned on long long alignment boundary
+ within the structure.
+ * loop-ull.c (GOMP_loop_ull_start): Likewise.
+ * sections.c (GOMP_sections2_start): Likewise.
+
2019-05-24 Jakub Jelinek <jakub@redhat.com>
PR libgomp/90585
diff --git a/libgomp/loop.c b/libgomp/loop.c
index 7248cb56144..37861d1d4f3 100644
--- a/libgomp/loop.c
+++ b/libgomp/loop.c
@@ -267,14 +267,17 @@ GOMP_loop_start (long start, long end, long incr, long sched,
if (mem)
{
uintptr_t size = (uintptr_t) *mem;
+#define INLINE_ORDERED_TEAM_IDS_OFF \
+ ((offsetof (struct gomp_work_share, inline_ordered_team_ids) \
+ + __alignof__ (long long) - 1) & ~(__alignof__ (long long) - 1))
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);
+ - 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 ();
}
@@ -287,7 +290,18 @@ GOMP_loop_start (long start, long end, long incr, long sched,
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;
+ }
+ }
}
if (!istart)
diff --git a/libgomp/loop_ull.c b/libgomp/loop_ull.c
index 502bb5e0e13..edf1c323f29 100644
--- a/libgomp/loop_ull.c
+++ b/libgomp/loop_ull.c
@@ -266,14 +266,17 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end,
if (mem)
{
uintptr_t size = (uintptr_t) *mem;
+#define INLINE_ORDERED_TEAM_IDS_OFF \
+ ((offsetof (struct gomp_work_share, inline_ordered_team_ids) \
+ + __alignof__ (long long) - 1) & ~(__alignof__ (long long) - 1))
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);
+ - 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 +289,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);
diff --git a/libgomp/sections.c b/libgomp/sections.c
index bf7baae54c5..887943670cc 100644
--- a/libgomp/sections.c
+++ b/libgomp/sections.c
@@ -118,14 +118,17 @@ GOMP_sections2_start (unsigned count, uintptr_t *reductions, void **mem)
if (mem)
{
uintptr_t size = (uintptr_t) *mem;
+#define INLINE_ORDERED_TEAM_IDS_OFF \
+ ((offsetof (struct gomp_work_share, inline_ordered_team_ids) \
+ + __alignof__ (long long) - 1) & ~(__alignof__ (long long) - 1))
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);
+ - 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 ();
}
@@ -138,7 +141,18 @@ GOMP_sections2_start (unsigned count, uintptr_t *reductions, void **mem)
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;
+ }
+ }
}
#ifdef HAVE_SYNC_BUILTINS
diff --git a/libgomp/work.c b/libgomp/work.c
index 22adb8b9fcd..a589b8b5231 100644
--- a/libgomp/work.c
+++ b/libgomp/work.c
@@ -110,9 +110,12 @@ gomp_init_work_share (struct gomp_work_share *ws, size_t ordered,
if (__builtin_expect (ordered != 1, 0))
{
- ordered += nthreads * sizeof (*ws->ordered_team_ids) - 1;
- ordered = ordered + __alignof__ (long long) - 1;
- ordered &= ~(__alignof__ (long long) - 1);
+ size_t o = nthreads * sizeof (*ws->ordered_team_ids);
+ o += __alignof__ (long long) - 1;
+ if ((offsetof (struct gomp_work_share, inline_ordered_team_ids)
+ & (__alignof__ (long long) - 1)) == 0)
+ o &= ~(__alignof__ (long long) - 1);
+ ordered += o - 1;
}
else
ordered = nthreads * sizeof (*ws->ordered_team_ids);