mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-27 12:51:20 +08:00
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:
parent
9c7473688e
commit
a40015780f
@ -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);
|
||||
|
37
gcc/testsuite/gcc.dg/pr99882.c
Normal file
37
gcc/testsuite/gcc.dg/pr99882.c
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user