re PR debug/84252 (ICE in get_tracked_reg_offset when building libvpx for aarch64)
authorJakub Jelinek <jakub@redhat.com>
Fri, 9 Feb 2018 05:48:33 +0000 (06:48 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 9 Feb 2018 05:48:33 +0000 (06:48 +0100)
PR debug/84252
* var-tracking.c (vt_add_function_parameter): Punt for non-onepart
PARALLEL incoming that failed vt_get_decl_and_offset check.

* gcc.target/aarch64/pr84252.c: New test.

From-SVN: r257514

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/pr84252.c [new file with mode: 0644]
gcc/var-tracking.c

index cacb10e9a8427c4c2cd632f99dd9de0caf6ef60f..e1945fe199784e40dd5a5e4ad17f3715c9fb3891 100644 (file)
@@ -1,5 +1,9 @@
 2018-02-09  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/84252
+       * var-tracking.c (vt_add_function_parameter): Punt for non-onepart
+       PARALLEL incoming that failed vt_get_decl_and_offset check.
+
        PR middle-end/84237
        * output.h (bss_initializer_p): Add NAMED argument, defaulted to false.
        * varasm.c (bss_initializer_p): Add NAMED argument, if true, ignore
index 0177e2b4270cd0603fd0ed39618318324d10a7cb..12ccc31349333c6f80213c717e2c08cedc9b403f 100644 (file)
@@ -1,5 +1,8 @@
 2018-02-09  Jakub Jelinek  <jakub@redhat.com>
 
+       PR debug/84252
+       * gcc.target/aarch64/pr84252.c: New test.
+
        PR middle-end/84237
        * gcc.dg/pr84237.c: New test.
 
diff --git a/gcc/testsuite/gcc.target/aarch64/pr84252.c b/gcc/testsuite/gcc.target/aarch64/pr84252.c
new file mode 100644 (file)
index 0000000..fc66a26
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR debug/84252 */
+/* { dg-do compile } */
+/* { dg-options "-g -O2" } */
+
+struct S { __Int32x4_t b[2]; };
+
+void
+foo (struct S x)
+{
+}
index c3d4dac59ef20016fc758ebe63aa88f87acd655a..fb30ec223efbe54af56028a8a9a3d58a3eabfecb 100644 (file)
@@ -9653,6 +9653,7 @@ vt_add_function_parameter (tree parm)
   poly_int64 offset;
   dataflow_set *out;
   decl_or_value dv;
+  bool incoming_ok = true;
 
   if (TREE_CODE (parm) != PARM_DECL)
     return;
@@ -9743,6 +9744,7 @@ vt_add_function_parameter (tree parm)
 
   if (!vt_get_decl_and_offset (incoming, &decl, &offset))
     {
+      incoming_ok = false;
       if (MEM_P (incoming))
        {
          /* This means argument is passed by invisible reference.  */
@@ -9861,6 +9863,10 @@ vt_add_function_parameter (tree parm)
     {
       int i;
 
+      /* The following code relies on vt_get_decl_and_offset returning true for
+        incoming, which might not be always the case.  */
+      if (!incoming_ok)
+       return;
       for (i = 0; i < XVECLEN (incoming, 0); i++)
        {
          rtx reg = XEXP (XVECEXP (incoming, 0, i), 0);