]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
bswap: Fix up bswap_view_convert after the recent change [PR99882]
authorJakub Jelinek <jakub@redhat.com>
Sat, 3 Apr 2021 08:08:08 +0000 (10:08 +0200)
committerJakub Jelinek <jakub@redhat.com>
Sat, 3 Apr 2021 08:08:08 +0000 (10:08 +0200)
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.

2021-04-03  Jakub Jelinek  <jakub@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
gcc/testsuite/gcc.dg/pr99882.c [new file with mode: 0644]

index 30bd66335ba44f8722c2cf5763c08f7da65ae93e..7eb50d65a20df5dce8a7a8f005acc3a8050b0257 100644 (file)
@@ -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);
diff --git a/gcc/testsuite/gcc.dg/pr99882.c b/gcc/testsuite/gcc.dg/pr99882.c
new file mode 100644 (file)
index 0000000..ebc074f
--- /dev/null
@@ -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;
+}