Hi!

single_nonlooparound_use ignores debug uses (otherwise we end up with
-fcompare-debug failures), but when removing stmts we need to reset
the debug uses, otherwise e.g. the testcase below ICEs.  Alex, if you have
better ideas how to reconstruct the debug stmts instead, feel free to
follow-up, but it won't be easy IMHO.

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

2012-05-02  Jakub Jelinek  <ja...@redhat.com>

        PR debug/53174
        * tree-predcom.c (remove_stmt): Call reset_debug_uses on stmts being
        removed.

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

--- gcc/tree-predcom.c.jj       2012-03-28 19:39:21.000000000 +0200
+++ gcc/tree-predcom.c  2012-05-02 13:14:14.765575987 +0200
@@ -1707,6 +1707,7 @@ remove_stmt (gimple stmt)
     {
       name = PHI_RESULT (stmt);
       next = single_nonlooparound_use (name);
+      reset_debug_uses (stmt);
       psi = gsi_for_stmt (stmt);
       remove_phi_node (&psi, true);
 
@@ -1728,6 +1729,7 @@ remove_stmt (gimple stmt)
       gcc_assert (TREE_CODE (name) == SSA_NAME);
 
       next = single_nonlooparound_use (name);
+      reset_debug_uses (stmt);
 
       mark_virtual_ops_for_renaming (stmt);
       gsi_remove (&bsi, true);
--- gcc/testsuite/gcc.dg/pr53174.c.jj   2012-05-02 13:36:29.466948569 +0200
+++ gcc/testsuite/gcc.dg/pr53174.c      2012-05-02 13:35:59.000000000 +0200
@@ -0,0 +1,67 @@
+/* PR debug/53174 */
+/* { dg-do compile } */
+/* { dg-options "-Ofast -g" } */
+
+int w, h;
+
+void
+bar (float (*x)[4], int y, int z)
+{
+  int a, b, c, d, e, f, g;
+
+  a = 2;
+  b = 2;
+  c = 274;
+  d = 274;
+  if (!z)
+    a = 12;
+  if (!y)
+    b = 12;
+  if (z + 266 >= h - 2)
+    c = 8 + h - z;
+  if (y + 266 >= w - 2)
+    d = 8 + w - y;
+  for (e = a; e < c; e++)
+    for (f = b, g = e * 276 + f; f < d; f++, g++)
+      {
+       float (*h)[4] = x + (g - 277);
+       float k = (*h)[0];
+       float l = (*h)[1];
+       float m = (*h)[2];
+       h++;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       h++;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       h += 274;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       h += 2;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       h += 274;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       h++;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       h++;
+       k += (*h)[0];
+       l += (*h)[1];
+       m += (*h)[2];
+       k *= 0.125f;
+       l *= 0.125f;
+       m *= 0.125f;
+       k = k + (x[g][1] - l);
+       m = m + (x[g][1] - l);
+       x[g][0] = k;
+       x[g][2] = m;
+      }
+}

        Jakub

Reply via email to