Commit fcfb8032 by Jakub Jelinek Committed by Jakub Jelinek

re PR libgomp/90641 (libgomp.c-c++-common/lastprivate-conditional-1.c etc FAIL)

	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.

From-SVN: r271671
parent 9467fbc0
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> 2019-05-24 Jakub Jelinek <jakub@redhat.com>
* testsuite/libgomp.c-c++-common/lastprivate-conditional-1.c: New test. * testsuite/libgomp.c-c++-common/lastprivate-conditional-1.c: New test.
......
...@@ -267,14 +267,17 @@ GOMP_loop_start (long start, long end, long incr, long sched, ...@@ -267,14 +267,17 @@ GOMP_loop_start (long start, long end, long incr, long sched,
if (mem) if (mem)
{ {
uintptr_t size = (uintptr_t) *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) if (size > (sizeof (struct gomp_work_share)
- offsetof (struct gomp_work_share, - INLINE_ORDERED_TEAM_IDS_OFF))
inline_ordered_team_ids))) *mem
thr->ts.work_share->ordered_team_ids = (void *) (thr->ts.work_share->ordered_team_ids
= gomp_malloc_cleared (size); = gomp_malloc_cleared (size));
else else
memset (thr->ts.work_share->ordered_team_ids, '\0', size); *mem = memset (((char *) thr->ts.work_share)
*mem = (void *) thr->ts.work_share->ordered_team_ids; + INLINE_ORDERED_TEAM_IDS_OFF, '\0', size);
} }
gomp_work_share_init_done (); gomp_work_share_init_done ();
} }
...@@ -287,7 +290,18 @@ GOMP_loop_start (long start, long end, long incr, long sched, ...@@ -287,7 +290,18 @@ GOMP_loop_start (long start, long end, long incr, long sched,
first_reductions); first_reductions);
} }
if (mem) 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) if (!istart)
......
...@@ -266,14 +266,17 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end, ...@@ -266,14 +266,17 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end,
if (mem) if (mem)
{ {
uintptr_t size = (uintptr_t) *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) if (size > (sizeof (struct gomp_work_share)
- offsetof (struct gomp_work_share, - INLINE_ORDERED_TEAM_IDS_OFF))
inline_ordered_team_ids))) *mem
thr->ts.work_share->ordered_team_ids = (void *) (thr->ts.work_share->ordered_team_ids
= gomp_malloc_cleared (size); = gomp_malloc_cleared (size));
else else
memset (thr->ts.work_share->ordered_team_ids, '\0', size); *mem = memset (((char *) thr->ts.work_share)
*mem = (void *) thr->ts.work_share->ordered_team_ids; + INLINE_ORDERED_TEAM_IDS_OFF, '\0', size);
} }
gomp_work_share_init_done (); gomp_work_share_init_done ();
} }
...@@ -286,7 +289,18 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end, ...@@ -286,7 +289,18 @@ GOMP_loop_ull_start (bool up, gomp_ull start, gomp_ull end,
first_reductions); first_reductions);
} }
if (mem) 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); return ialias_call (GOMP_loop_ull_runtime_next) (istart, iend);
......
...@@ -118,14 +118,17 @@ GOMP_sections2_start (unsigned count, uintptr_t *reductions, void **mem) ...@@ -118,14 +118,17 @@ GOMP_sections2_start (unsigned count, uintptr_t *reductions, void **mem)
if (mem) if (mem)
{ {
uintptr_t size = (uintptr_t) *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) if (size > (sizeof (struct gomp_work_share)
- offsetof (struct gomp_work_share, - INLINE_ORDERED_TEAM_IDS_OFF))
inline_ordered_team_ids))) *mem
thr->ts.work_share->ordered_team_ids = (void *) (thr->ts.work_share->ordered_team_ids
= gomp_malloc_cleared (size); = gomp_malloc_cleared (size));
else else
memset (thr->ts.work_share->ordered_team_ids, '\0', size); *mem = memset (((char *) thr->ts.work_share)
*mem = (void *) thr->ts.work_share->ordered_team_ids; + INLINE_ORDERED_TEAM_IDS_OFF, '\0', size);
} }
gomp_work_share_init_done (); gomp_work_share_init_done ();
} }
...@@ -138,7 +141,18 @@ GOMP_sections2_start (unsigned count, uintptr_t *reductions, void **mem) ...@@ -138,7 +141,18 @@ GOMP_sections2_start (unsigned count, uintptr_t *reductions, void **mem)
first_reductions); first_reductions);
} }
if (mem) 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 #ifdef HAVE_SYNC_BUILTINS
......
...@@ -110,9 +110,12 @@ gomp_init_work_share (struct gomp_work_share *ws, size_t ordered, ...@@ -110,9 +110,12 @@ gomp_init_work_share (struct gomp_work_share *ws, size_t ordered,
if (__builtin_expect (ordered != 1, 0)) if (__builtin_expect (ordered != 1, 0))
{ {
ordered += nthreads * sizeof (*ws->ordered_team_ids) - 1; size_t o = nthreads * sizeof (*ws->ordered_team_ids);
ordered = ordered + __alignof__ (long long) - 1; o += __alignof__ (long long) - 1;
ordered &= ~(__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 else
ordered = nthreads * sizeof (*ws->ordered_team_ids); ordered = nthreads * sizeof (*ws->ordered_team_ids);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment