Commit 7c46e71d by Richard Sandiford

cfgexpand: Update partition size when merging variables

cfgexpand sorts variables by decreasing size, so when merging a later
variable into an earlier one, there's usually no need to update the
merged size.

But for poly_int sizes, the sort function just uses a lexicographical
comparison of the coefficients, so e.g. 2X+2 comes before 0X+32.
Which is bigger depends on the runtime value of X.

This patch therefore takes the upper bound of the two sizes, which
is conservatively correct for variable-length vectors and a no-op
on other targets.

It's probably a bad idea to merge fixed-length and variable-length
variables in practice, but that's really an optimisation decision.
I think we should have this patch as a correctness fix either way.

This is easiest to test using the ACLE, but in principle it could happen
for autovectorised code too, e.g. when using OpenMP vector variables.
It's therefore a regression from GCC 8.

2020-01-22  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* cfgexpand.c (union_stack_vars): Update the size.

gcc/testsuite/
	* gcc.target/aarch64/sve/acle/general/stack_vars_1.c: New test.
parent 7491c17f
2020-01-22 Richard Sandiford <richard.sandiford@arm.com>
* cfgexpand.c (union_stack_vars): Update the size.
2020-01-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/93381
......
......@@ -862,6 +862,9 @@ union_stack_vars (size_t a, size_t b)
stack_vars[b].representative = a;
stack_vars[a].next = b;
/* Make sure A is big enough to hold B. */
stack_vars[a].size = upper_bound (stack_vars[a].size, stack_vars[b].size);
/* Update the required alignment of partition A to account for B. */
if (stack_vars[a].alignb < stack_vars[b].alignb)
stack_vars[a].alignb = stack_vars[b].alignb;
......
2020-01-22 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/acle/general/stack_vars_1.c: New test.
2020-01-22 Richard Sandiford <richard.sandiford@arm.com>
* gcc.target/aarch64/sve/tls_preserve_1.c: Require tls_native.
* gcc.target/aarch64/sve/tls_preserve_2.c: Likewise.
* gcc.target/aarch64/sve/tls_preserve_3.c: Likewise.
......
/* { dg-do run { target aarch64_sve_hw } } */
/* { dg-additional-options "-O2" } */
#include <arm_sve.h>
struct s { int x[32]; };
void __attribute__((noipa)) consume (void *ptr) {}
void __attribute__((noipa))
check_var (svint32_t *ptr)
{
svbool_t pg = svptrue_b8 ();
if (svptest_any (pg, svcmpne (pg, *ptr, svindex_s32 (0, 1))))
__builtin_abort ();
}
int
main (void)
{
svint32_t res = svindex_s32 (0, 1);
{
__SVBool_t pg = svptrue_b8 ();
consume (&pg);
}
{
struct s zeros = { 0 };
consume (&zeros);
}
check_var (&res);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment