Hi! I've backported following 4 patches from trunk to 9 branch, bootstrapped/regtested on x86_64-linux and i686-linux, committed.
Jakub
2019-06-05 Jakub Jelinek <ja...@redhat.com> Backported from mainline 2019-05-24 Jakub Jelinek <ja...@redhat.com> PR libgomp/90585 * plugin/plugin-hsa.c (print_kernel_dispatch, run_kernel): Use PRIu64 macro instead of "lu". (release_kernel_dispatch): Likewise. Cast shadow->debug to uintptr_t before casting to void *. --- libgomp/plugin/plugin-hsa.c (revision 271596) +++ libgomp/plugin/plugin-hsa.c (revision 271597) @@ -1154,8 +1164,9 @@ create_single_kernel_dispatch (struct ke static void release_kernel_dispatch (struct GOMP_hsa_kernel_dispatch *shadow) { - HSA_DEBUG ("Released kernel dispatch: %p has value: %lu (%p)\n", shadow, - shadow->debug, (void *) shadow->debug); + HSA_DEBUG ("Released kernel dispatch: %p has value: %" PRIu64 " (%p)\n", + shadow, shadow->debug, + (void *) (uintptr_t) shadow->debug); hsa_fns.hsa_memory_free_fn (shadow->kernarg_address); @@ -1276,9 +1287,9 @@ print_kernel_dispatch (struct GOMP_hsa_k indent_stream (stderr, indent); fprintf (stderr, "kernarg_address: %p\n", dispatch->kernarg_address); indent_stream (stderr, indent); - fprintf (stderr, "object: %lu\n", dispatch->object); + fprintf (stderr, "object: %" PRIu64 "\n", dispatch->object); indent_stream (stderr, indent); - fprintf (stderr, "signal: %lu\n", dispatch->signal); + fprintf (stderr, "signal: %" PRIu64 "\n", dispatch->signal); indent_stream (stderr, indent); fprintf (stderr, "private_segment_size: %u\n", dispatch->private_segment_size); @@ -1286,8 +1297,8 @@ print_kernel_dispatch (struct GOMP_hsa_k fprintf (stderr, "group_segment_size: %u\n", dispatch->group_segment_size); indent_stream (stderr, indent); - fprintf (stderr, "children dispatches: %lu\n", - dispatch->kernel_dispatch_count); + fprintf (stderr, "children dispatches: %" PRIu64 "\n", + dispatch->kernel_dispatch_count); indent_stream (stderr, indent); fprintf (stderr, "omp_num_threads: %u\n", dispatch->omp_num_threads); @@ -1594,8 +1605,8 @@ run_kernel (struct kernel_info *kernel, hsa_signal_t child_s; child_s.handle = shadow->children_dispatches[i]->signal; - HSA_DEBUG ("Waiting for children completion signal: %lu\n", - shadow->children_dispatches[i]->signal); + HSA_DEBUG ("Waiting for children completion signal: %" PRIu64 "\n", + shadow->children_dispatches[i]->signal); hsa_fns.hsa_signal_load_acquire_fn (child_s); }
2019-06-05 Jakub Jelinek <ja...@redhat.com> Backported from mainline 2019-05-27 Jakub Jelinek <ja...@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. --- libgomp/loop.c (revision 271670) +++ libgomp/loop.c (revision 271671) @@ -267,14 +267,17 @@ GOMP_loop_start (long start, long end, l 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, l 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) --- libgomp/loop_ull.c (revision 271670) +++ libgomp/loop_ull.c (revision 271671) @@ -266,14 +266,17 @@ GOMP_loop_ull_start (bool up, gomp_ull s 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 s 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); --- libgomp/sections.c (revision 271670) +++ libgomp/sections.c (revision 271671) @@ -118,14 +118,17 @@ GOMP_sections2_start (unsigned count, ui 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, ui 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 --- libgomp/work.c (revision 271670) +++ libgomp/work.c (revision 271671) @@ -110,9 +110,12 @@ gomp_init_work_share (struct gomp_work_s 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);
2019-06-05 Jakub Jelinek <ja...@redhat.com> Backported from mainline 2019-05-29 Jakub Jelinek <ja...@redhat.com> PR c++/90598 * tree.c (lvalue_kind): Return clk_none for expressions with with VOID_TYPE_P. * g++.dg/cpp0x/pr90598.C: New test. 2019-05-02 Jonathan Wakely <jwak...@redhat.com> * testsuite/experimental/propagate_const/requirements2.cc: Adjust dg-error. --- gcc/cp/tree.c (revision 271751) +++ gcc/cp/tree.c (revision 271752) @@ -83,6 +83,10 @@ lvalue_kind (const_tree ref) if (ref == current_class_ptr) return clk_none; + /* Expressions with cv void type are prvalues. */ + if (TREE_TYPE (ref) && VOID_TYPE_P (TREE_TYPE (ref))) + return clk_none; + switch (TREE_CODE (ref)) { case SAVE_EXPR: --- gcc/testsuite/g++.dg/cpp0x/pr90598.C (nonexistent) +++ gcc/testsuite/g++.dg/cpp0x/pr90598.C (revision 271752) @@ -0,0 +1,8 @@ +// PR c++/90598 +// { dg-do compile { target c++11 } } + +struct A {}; +using B = decltype(A ().~A ()); +template <typename T> struct C; +template <> struct C<void> {}; +C<B> t; --- libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc (revision 270808) +++ libstdc++-v3/testsuite/experimental/propagate_const/requirements2.cc (revision 270809) @@ -21,9 +21,8 @@ using std::experimental::propagate_const; -// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 107 } -// { dg-error "not a pointer-to-object type" "" { target *-*-* } 66 } -// { dg-error "forming pointer to reference type" "" { target *-*-* } 187 } -// { dg-error "forming pointer to reference type" "" { target *-*-* } 213 } - propagate_const<void*> test1; + +// { dg-error "requires a class or a pointer to an object type" "" { target *-*-* } 0 } +// { dg-prune-output "forming pointer to reference type" } +// { dg-prune-output "not a pointer-to-object type" }
2019-06-05 Jakub Jelinek <ja...@redhat.com> PR debug/90733 * var-tracking.c (vt_expand_loc_callback): Don't create raw subregs with VOIDmode inner operands. * gcc.dg/pr90733.c: New test. --- gcc/var-tracking.c (revision 271951) +++ gcc/var-tracking.c (revision 271952) @@ -8491,7 +8491,7 @@ vt_expand_loc_callback (rtx x, bitmap re /* Invalid SUBREGs are ok in debug info. ??? We could try alternate expansions for the VALUE as well. */ - if (!result) + if (!result && GET_MODE (subreg) != VOIDmode) result = gen_rtx_raw_SUBREG (GET_MODE (x), subreg, SUBREG_BYTE (x)); return result; --- gcc/testsuite/gcc.dg/pr90733.c (nonexistent) +++ gcc/testsuite/gcc.dg/pr90733.c (revision 271952) @@ -0,0 +1,22 @@ +/* PR debug/90733 */ +/* { dg-do compile } */ +/* { dg-options "-g -O2 -w" } */ + +struct S { unsigned a : 1; }; +union U { struct S b; _Complex unsigned c; }; + +union U +foo (union U d) +{ + union U e = d; + return e; +} + +int +bar (void) +{ + union U x, y; + x.c = x.b.a; + y = foo (x); + return x.c != y.c; +}