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;
+}

Reply via email to