aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-04-03 10:08:08 +0200
committerJakub Jelinek <jakub@redhat.com>2021-04-03 10:08:08 +0200
commita40015780f8cc49476741b6914bd5ee97bd10f1d (patch)
treebe2627e45e56112e7e3e35eab8ae3424cc7558f7 /gcc
parent9c7473688e78dc41fd4312a983453df195dd7786 (diff)
downloadgcc-a40015780f8cc49476741b6914bd5ee97bd10f1d.zip
gcc-a40015780f8cc49476741b6914bd5ee97bd10f1d.tar.gz
gcc-a40015780f8cc49476741b6914bd5ee97bd10f1d.tar.bz2
bswap: Fix up bswap_view_convert after the recent change [PR99882]
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-ssa-store-merging.c11
-rw-r--r--gcc/testsuite/gcc.dg/pr99882.c37
2 files changed, 47 insertions, 1 deletions
diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c
index 30bd663..7eb50d6 100644
--- a/gcc/gimple-ssa-store-merging.c
+++ b/gcc/gimple-ssa-store-merging.c
@@ -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
index 0000000..ebc074f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr99882.c
@@ -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;
+}