On April 3, 2021 9:57:18 AM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>Martin reported that my recent change to allow pointer types in bswap
>broke valgrind.  The bswap_view_convert function used for the
>initialization
>of vector CONSTRUCTOR from the identity or byte-swapped pieces
>unfortunately
>didn't handle pointer types.  The following patch handles it there.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok. 

Thanks, 
Richard. 

>2021-04-03  Jakub Jelinek  <ja...@redhat.com>
>
>       PR tree-optimization/99882
>       * gimple-ssa-store-merging.c (bswap_view_convert): Handle val with
>       pointer type.
>
>       * gcc.dg/pr99882.c: New test.
>
>--- gcc/gimple-ssa-store-merging.c.jj  2021-04-01 10:50:56.238629197
>+0200
>+++ gcc/gimple-ssa-store-merging.c     2021-04-02 16:52:38.763803716 +0200
>@@ -985,10 +985,19 @@ public:
> static tree
> bswap_view_convert (gimple_stmt_iterator *gsi, tree type, tree val)
> {
>-  gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (val)));
>+  gcc_assert (INTEGRAL_TYPE_P (TREE_TYPE (val))
>+            || POINTER_TYPE_P (TREE_TYPE (val)));
>   if (TYPE_SIZE (type) != TYPE_SIZE (TREE_TYPE (val)))
>     {
>       HOST_WIDE_INT prec = TREE_INT_CST_LOW (TYPE_SIZE (type));
>+      if (POINTER_TYPE_P (TREE_TYPE (val)))
>+      {
>+        gimple *g
>+          = gimple_build_assign (make_ssa_name (pointer_sized_int_node),
>+                                 NOP_EXPR, val);
>+        gsi_insert_before (gsi, g, GSI_SAME_STMT);
>+        val = gimple_assign_lhs (g);
>+      }
>       tree itype = build_nonstandard_integer_type (prec, 1);
>gimple *g = gimple_build_assign (make_ssa_name (itype), NOP_EXPR, val);
>       gsi_insert_before (gsi, g, GSI_SAME_STMT);
>--- gcc/testsuite/gcc.dg/pr99882.c.jj  2021-04-02 20:52:09.895060892
>+0200
>+++ gcc/testsuite/gcc.dg/pr99882.c     2021-04-02 20:51:39.590396850 +0200
>@@ -0,0 +1,37 @@
>+/* PR tree-optimization/99882 */
>+/* { dg-do compile } */
>+/* { dg-options "-O3" } */
>+
>+void
>+foo (char *p, void *q)
>+{
>+  __INTPTR_TYPE__ i = (__INTPTR_TYPE__) q;
>+  p[2] = i;
>+  i >>= 8;
>+  p[3] = i;
>+  i >>= 8;
>+  p[4] = i;
>+  i >>= 8;
>+  p[5] = i;
>+  i >>= 8;
>+  p[6] = i;
>+  i >>= 8;
>+  p[7] = i;
>+  i >>= 8;
>+  p[8] = i;
>+  i >>= 8;
>+  p[9] = i;
>+}
>+
>+void
>+bar (char *p, void *q)
>+{
>+  __INTPTR_TYPE__ i = (__INTPTR_TYPE__) q;
>+  p[2] = i;
>+  i >>= 8;
>+  p[3] = i;
>+  i >>= 8;
>+  p[4] = i;
>+  i >>= 8;
>+  p[5] = i;
>+}
>
>       Jakub

Reply via email to