diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-06-05 12:19:00 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-06-05 12:19:00 +0000 |
commit | afd0f6085788f1e2783c3d09e16cbab94e59435a (patch) | |
tree | 66d96899fe3922b03f73a7d35232af419e72573d /libgomp | |
parent | 396c8a309eeabe0ef8c7e09943ee09e170de7055 (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/ChangeLog | 14 | ||||
-rw-r--r-- | libgomp/loop.c | 28 | ||||
-rw-r--r-- | libgomp/loop_ull.c | 28 | ||||
-rw-r--r-- | libgomp/sections.c | 28 | ||||
-rw-r--r-- | libgomp/work.c | 9 |
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); |