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.
This commit is contained in:
Jakub Jelinek 2021-04-03 10:08:08 +02:00
parent 9c7473688e
commit a40015780f
2 changed files with 47 additions and 1 deletions

View 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);

View File

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