mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
9467fbc0ff
commit
fcfb80325f
|
@ -1,3 +1,17 @@
|
||||||
|
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,
|
||||||
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,
|
||||||
first_reductions);
|
first_reductions);
|
||||||
}
|
}
|
||||||
if (mem)
|
if (mem)
|
||||||
|
{
|
||||||
|
if ((offsetof (struct gomp_work_share, inline_ordered_team_ids)
|
||||||
|
& (__alignof__ (long long) - 1)) == 0)
|
||||||
*mem = (void *) thr->ts.work_share->ordered_team_ids;
|
*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,
|
||||||
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,
|
||||||
first_reductions);
|
first_reductions);
|
||||||
}
|
}
|
||||||
if (mem)
|
if (mem)
|
||||||
|
{
|
||||||
|
if ((offsetof (struct gomp_work_share, inline_ordered_team_ids)
|
||||||
|
& (__alignof__ (long long) - 1)) == 0)
|
||||||
*mem = (void *) thr->ts.work_share->ordered_team_ids;
|
*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)
|
||||||
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)
|
||||||
first_reductions);
|
first_reductions);
|
||||||
}
|
}
|
||||||
if (mem)
|
if (mem)
|
||||||
|
{
|
||||||
|
if ((offsetof (struct gomp_work_share, inline_ordered_team_ids)
|
||||||
|
& (__alignof__ (long long) - 1)) == 0)
|
||||||
*mem = (void *) thr->ts.work_share->ordered_team_ids;
|
*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,
|
||||||
|
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue