Make dwarf2out punt for MODE_VECTOR_BOOL
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 10 Dec 2019 12:20:20 +0000 (12:20 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 10 Dec 2019 12:20:20 +0000 (12:20 +0000)
The dwarf2 handling of vector constants currently divides the vector
into a length (number of elements) and byte element size.  This doesn't
work well for MODE_VECTOR_BOOL, where several elements are packed into
the same byte.

We should probably add a way of encoding this in future, but for now
the safest thing is to punt, like we already do for variable-length
vectors.

2019-12-10  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* dwarf2out.c (loc_descriptor): Punt for MODE_VECTOR_BOOL.
(add_const_value_attribute): Likewise.

gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/debug_4.c: New test.

From-SVN: r279165

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/sve/acle/general/debug_4.c [new file with mode: 0644]

index ffc2d26d6fbfd6e34b441360b59cf53592ab3c33..ed569e481b251565cfc870000b005b7478f915d7 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-10  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * dwarf2out.c (loc_descriptor): Punt for MODE_VECTOR_BOOL.
+       (add_const_value_attribute): Likewise.
+
 2019-12-10  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-loop.c (vect_create_epilog_for_reduction): When
index 6fb345b38b09aa56382e00e312f1b8c77cb766a8..ff55e3969b17bd99e6748c24e1ec8616bc83f5d7 100644 (file)
@@ -16763,7 +16763,12 @@ loc_descriptor (rtx rtl, machine_mode mode,
       if (mode == VOIDmode)
        mode = GET_MODE (rtl);
 
-      if (mode != VOIDmode && (dwarf_version >= 4 || !dwarf_strict))
+      if (mode != VOIDmode
+         /* The combination of a length and byte elt_size doesn't extend
+            naturally to boolean vectors, where several elements are packed
+            into the same byte.  */
+         && GET_MODE_CLASS (mode) != MODE_VECTOR_BOOL
+         && (dwarf_version >= 4 || !dwarf_strict))
        {
          unsigned int length;
          if (!CONST_VECTOR_NUNITS (rtl).is_constant (&length))
@@ -19622,6 +19627,12 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
          return false;
 
        machine_mode mode = GET_MODE (rtl);
+       /* The combination of a length and byte elt_size doesn't extend
+          naturally to boolean vectors, where several elements are packed
+          into the same byte.  */
+       if (GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL)
+         return false;
+
        unsigned int elt_size = GET_MODE_UNIT_SIZE (mode);
        unsigned char *array
          = ggc_vec_alloc<unsigned char> (length * elt_size);
index 5020620fc4dc6fd9189ff407061fa55a7f691368..389fb25fd407bb036aa11109e4c3e4cc48c4bb3a 100644 (file)
@@ -1,3 +1,7 @@
+2019-12-10  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * gcc.target/aarch64/sve/acle/general/debug_4.c: New test.
+
 2019-12-10  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/aarch64/sve/clastb_9.c: New test.
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general/debug_4.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general/debug_4.c
new file mode 100644 (file)
index 0000000..5707cc2
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-options "-O -g -msve-vector-bits=512" } */
+
+#include <arm_sve.h>
+
+void __attribute__((noipa))
+g (volatile int *x, svbool_t pg)
+{
+  *x = 1;
+}
+
+void
+f (volatile int *x)
+{
+  svbool_t pg = svorr_z (svpfalse (), svpfalse (), svpfalse ());
+  g (x, pg);
+}