diff options
Diffstat (limited to 'libgomp/loop_ull.c')
-rw-r--r-- | libgomp/loop_ull.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/libgomp/loop_ull.c b/libgomp/loop_ull.c index 502bb5e..edf1c32 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); |