diff options
author | Jakub Jelinek <jakub@redhat.com> | 2021-04-03 10:08:08 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2021-04-03 10:08:08 +0200 |
commit | a40015780f8cc49476741b6914bd5ee97bd10f1d (patch) | |
tree | be2627e45e56112e7e3e35eab8ae3424cc7558f7 /gcc | |
parent | 9c7473688e78dc41fd4312a983453df195dd7786 (diff) | |
download | gcc-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.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr99882.c | 37 |
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; +} |