This avoids ICEing for VLA vector auto-init by not initializing. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
2021-10-04 Richard Biener <rguent...@suse.de> PR middle-end/102587 * internal-fn.c (expand_DEFERRED_INIT): Guard register initialization path an avoid initializing VLA registers with it. * gcc.target/aarch64/sve/pr102587-1.c: New testcase. * gcc.target/aarch64/sve/pr102587-2.c: Likewise. --- gcc/internal-fn.c | 3 ++- gcc/testsuite/gcc.target/aarch64/sve/pr102587-1.c | 4 ++++ gcc/testsuite/gcc.target/aarch64/sve/pr102587-2.c | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr102587-1.c create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr102587-2.c diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index 8312d08aab2..ef5dc90db56 100644 --- a/gcc/internal-fn.c +++ b/gcc/internal-fn.c @@ -3035,7 +3035,8 @@ expand_DEFERRED_INIT (internal_fn, gcall *stmt) /* Expand this memset call. */ expand_builtin_memset (m_call, NULL_RTX, TYPE_MODE (var_type)); } - else + /* ??? Deal with poly-int sized registers. */ + else if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (var_type))) { /* If this variable is in a register, use expand_assignment might generate better code. */ diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr102587-1.c b/gcc/testsuite/gcc.target/aarch64/sve/pr102587-1.c new file mode 100644 index 00000000000..2b9a68b0b59 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr102587-1.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-ftrivial-auto-var-init=zero" } */ + +void foo() { __SVFloat64_t f64; } diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr102587-2.c b/gcc/testsuite/gcc.target/aarch64/sve/pr102587-2.c new file mode 100644 index 00000000000..4cdb9056002 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr102587-2.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options "-ftrivial-auto-var-init=pattern" } */ + +void foo() { __SVFloat64_t f64; } -- 2.31.1