The switch conversion code asks initializer_constant_valid_p
if the expression is a valid initializer constant and for
vector types which have a non-constant elements initializer_constant_valid_p
would return it is valid.  But it should be rejected as not being
valid for an initializer.

Build and tested for aarch64-linux-gnu.

        PR tree-optimization/121091

gcc/ChangeLog:

        * varasm.cc (initializer_constant_valid_p_1): Reject vector types which
        have a non-constant number of elements.

gcc/testsuite/ChangeLog:

        * gcc.target/aarch64/sve/pr121091-1.c: New test.

Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
 .../gcc.target/aarch64/sve/pr121091-1.c       | 25 +++++++++++++++++++
 gcc/varasm.cc                                 |  5 ++++
 2 files changed, 30 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c

diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c 
b/gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c
new file mode 100644
index 00000000000..ea2e5ce6b6a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pr121091-1.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* PR tree-optimization/121091 */
+/* Switch conversion would convert this
+   into static constant array but since
+   svbool_t is a VLA type, it can't be
+   stored in a constant pool. */
+
+#include "arm_sve.h"
+
+svbool_t e(int mode, svbool_t pg) {
+    switch (mode) {
+        case 0:
+            pg = svptrue_pat_b16(SV_VL6);
+            break;
+        case 1:
+            pg = svpfalse_b();
+            break;
+        case 2:
+            pg = svptrue_pat_b16(SV_VL2);
+            break;
+    }
+  return pg;
+}
diff --git a/gcc/varasm.cc b/gcc/varasm.cc
index 10c1d2e3137..36b7cd8812d 100644
--- a/gcc/varasm.cc
+++ b/gcc/varasm.cc
@@ -5001,6 +5001,11 @@ initializer_constant_valid_p_1 (tree value, tree 
endtype, tree *cache)
 {
   tree ret;
 
+  /* Variable sized vectors are never valid for initializers.  */
+  if (VECTOR_TYPE_P (endtype)
+      && !TYPE_VECTOR_SUBPARTS (endtype).is_constant ())
+    return NULL_TREE;
+
   switch (TREE_CODE (value))
     {
     case CONSTRUCTOR:
-- 
2.43.0

Reply via email to