Hi!

Another spot where we need to punt on BLKmode, otherwise we try to create
a subreg with BLKmode, or ZERO/SIGN_EXTEND with BLKmode.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Eventually, we should try to handle both hw and generic vectors in the debug
info better, but we'd need to discuss that with the GDB folks.  E.g.
we could lower debuginfo for the generic vectors during the vector lowering
pass into DEBUG_EXPRs representing individual elements kind like how SRA
splits arrays.

2018-01-04  Jakub Jelinek  <ja...@redhat.com>

        PR debug/83666
        * cfgexpand.c (expand_dbeug_expr) <case BIT_FIELD_REF>: Punt if mode
        is BLKmode and bitpos not zero or mode change is needed.

        * gcc.dg/pr83666.c: New test.

--- gcc/cfgexpand.c.jj  2018-01-03 16:56:28.375179714 +0100
+++ gcc/cfgexpand.c     2018-01-03 19:45:43.807687499 +0100
@@ -4560,7 +4560,7 @@ expand_debug_expr (tree exp)
        if (maybe_lt (bitpos, 0))
           return NULL;
 
-       if (GET_MODE (op0) == BLKmode)
+       if (GET_MODE (op0) == BLKmode || mode == BLKmode)
          return NULL;
 
        poly_int64 bytepos;
--- gcc/testsuite/gcc.dg/pr83666.c.jj   2018-01-03 19:47:46.370733409 +0100
+++ gcc/testsuite/gcc.dg/pr83666.c      2018-01-03 19:47:26.106725818 +0100
@@ -0,0 +1,28 @@
+/* PR debug/83666 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g --param=sccvn-max-scc-size=10 -Wno-psabi" } */
+
+typedef int __attribute__ ((vector_size (64))) V;
+
+int c, d;
+short e;
+V g;
+
+V
+bar (void)
+{
+  g[1] = d;
+  do
+    {
+      e += c;
+      g = g > 0;
+    }
+  while (g[1]);
+  return g;
+}
+
+void
+foo (void)
+{
+  int x = bar ()[3];
+}

        Jakub

Reply via email to