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

Reply via email to