Mark constant-sized objects as addressable if they have poly-int accesses

If SVE code is written for a specific vector length, it might load from
or store to fixed-sized objects.  This needs to work even without
-msve-vector-bits=N (which should never be needed for correctness).

There's no way of handling a direct poly-int sized reference to a
fixed-size register; it would have to go via memory.  And in that
case it's more efficient to mark the fixed-size object as
addressable from the outset, like we do for array references
with non-constant indices.

2019-12-03  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* cfgexpand.c (discover_nonconstant_array_refs_r): If an access
	with POLY_INT_CST size is made to a fixed-size object, force the
	object to live in memory.

gcc/testsuite/
	* gcc.target/aarch64/sve/acle/general/deref_1.c: New test.

From-SVN: r278941
This commit is contained in:
Richard Sandiford 2019-12-03 18:06:24 +00:00 committed by Richard Sandiford
parent e93b5262fd
commit 2c98350fcb
4 changed files with 50 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2019-12-03 Richard Sandiford <richard.sandiford@arm.com>
* cfgexpand.c (discover_nonconstant_array_refs_r): If an access
with POLY_INT_CST size is made to a fixed-size object, force the
object to live in memory.
2019-12-03 Andrew Stubbs <ams@codesourcery.com>
* config/gcn/gcn-valu.md: Change "vcondu" patterns to use VEC_1REG_MODE

View File

@ -6133,6 +6133,21 @@ discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
*walk_subtrees = 0;
}
/* References of size POLY_INT_CST to a fixed-size object must go
through memory. It's more efficient to force that here than
to create temporary slots on the fly. */
else if ((TREE_CODE (t) == MEM_REF || TREE_CODE (t) == TARGET_MEM_REF)
&& TYPE_SIZE (TREE_TYPE (t))
&& POLY_INT_CST_P (TYPE_SIZE (TREE_TYPE (t))))
{
tree base = get_base_address (t);
if (base
&& DECL_P (base)
&& DECL_MODE (base) != BLKmode
&& GET_MODE_SIZE (DECL_MODE (base)).is_constant ())
TREE_ADDRESSABLE (base) = 1;
*walk_subtrees = 0;
}
return NULL_TREE;
}

View File

@ -1,3 +1,7 @@
2019-12-03 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/acle/general/deref_1.c: New test.
2019-12-03 Marek Polacek <polacek@redhat.com>
PR c++/91363 - P0960R3: Parenthesized initialization of aggregates.

View File

@ -0,0 +1,25 @@
/* { dg-options "-O2" } */
#include <arm_sve.h>
uint64_t
f1 (int32_t *x, int32_t *y)
{
union { uint64_t x; char c[8]; } u;
svbool_t pg = svptrue_b32 ();
*(svbool_t *)&u.c[0] = svcmpeq (pg, svld1 (pg, x), 0);
*(svbool_t *)&u.c[4] = svcmpeq (pg, svld1 (pg, y), 1);
return u.x;
}
typedef unsigned int v4si __attribute__((vector_size(16)));
/* The aliasing is somewhat dubious here, but it must compile. */
v4si
f2 (void)
{
v4si res;
*(svuint32_t *) &res = svindex_u32 (0, 1);
return res;
}