[D] Remove unchecked to_constant in VECTOR_TYPE handling
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 4 Nov 2019 21:14:22 +0000 (21:14 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 4 Nov 2019 21:14:22 +0000 (21:14 +0000)
The SVE port now tries to register variable-length VECTOR_TYPEs
at start-up, so it's no longer possible to use the asserting
to_constant on the number of vector elements.  This patch punts
on variable element counts instead, just like we do for other
things that the frontend doesn't recognise.

The brace indentation matches the surrounding style.

2019-11-04  Richard Sandiford  <richard.sandiford@arm.com>

gcc/d/
* d-builtins.cc (build_frontend_type): Cope with variable
TYPE_VECTOR_SUBPARTS.

From-SVN: r277793

gcc/d/ChangeLog
gcc/d/d-builtins.cc

index 1013c08d12b9cd5960d19819613caacdc14d90c2..2591b4c727f8833fa1b8b28b7800ae5717a96a16 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-04  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * d-builtins.cc (build_frontend_type): Cope with variable
+       TYPE_VECTOR_SUBPARTS.
+
 2019-08-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/91283
index 2f7319c1effb9d7c7351a576b4ed761382b0d458..2ad0f8b87400cd4ad4b5ee806d6117cad093dc9e 100644 (file)
@@ -197,20 +197,23 @@ build_frontend_type (tree type)
       break;
 
     case VECTOR_TYPE:
+    {
+      unsigned HOST_WIDE_INT nunits;
+      if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nunits))
+       break;
+
       dtype = build_frontend_type (TREE_TYPE (type));
-      if (dtype)
-       {
-         poly_uint64 nunits = TYPE_VECTOR_SUBPARTS (type);
-         dtype = dtype->sarrayOf (nunits.to_constant ())->addMod (mod);
+      if (!dtype)
+       break;
 
-         if (dtype->nextOf ()->isTypeBasic () == NULL)
-           break;
+      dtype = dtype->sarrayOf (nunits)->addMod (mod);
+      if (dtype->nextOf ()->isTypeBasic () == NULL)
+       break;
 
-         dtype = (TypeVector::create (Loc (), dtype))->addMod (mod);
-         builtin_converted_decls.safe_push (builtin_data (dtype, type));
-         return dtype;
-       }
-      break;
+      dtype = (TypeVector::create (Loc (), dtype))->addMod (mod);
+      builtin_converted_decls.safe_push (builtin_data (dtype, type));
+      return dtype;
+    }
 
     case RECORD_TYPE:
     {