We fail to unshare exprs put into debug stmts during inlinign which
creates bogus tree sharing.

Bootstrap and regtest pending on x86_64-unknown-linux-gnu.

Richard.

2015-06-08  Richard Biener  <rguent...@suse.de>

        PR middle-end/66413
        * tree-inline.c (insert_init_debug_bind): Unshare value.

        * gcc.dg/torture/pr66413.c: New testcase.

Index: gcc/tree-inline.c
===================================================================
*** gcc/tree-inline.c   (revision 224221)
--- gcc/tree-inline.c   (working copy)
*************** insert_init_debug_bind (copy_body_data *
*** 3027,3033 ****
        base_stmt = gsi_stmt (gsi);
      }
  
!   note = gimple_build_debug_bind (tracked_var, value, base_stmt);
  
    if (bb)
      {
--- 3027,3033 ----
        base_stmt = gsi_stmt (gsi);
      }
  
!   note = gimple_build_debug_bind (tracked_var, unshare_expr (value), 
base_stmt);
  
    if (bb)
      {
Index: gcc/testsuite/gcc.dg/torture/pr66413.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr66413.c      (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr66413.c      (working copy)
***************
*** 0 ****
--- 1,61 ----
+ /* { dg-do compile } */
+ /* { dg-additional-options "-g" } */
+ 
+ int a, b, c, d, i, j, q, *e, *h, *k, *r, **p = &e;
+ const int *f, **n = &f;
+ static int g;
+ 
+ void
+ fn1 (int p1)
+ {
+   c = p1;
+ }
+ 
+ static int *
+ fn2 (int *p1, const int *p2)
+ {
+   if (g)
+     n = &p2;
+   *n = p2;
+   int o[245];
+   fn1 (o != p2);
+   return p1;
+ }
+ 
+ static int *
+ fn3 ()
+ {
+   int s[54], *t = &s[0], u = 0, v = 1;
+   h = &v;
+   q = 1;
+   for (; q; q++)
+     {
+       int *w[] = { &u };
+       for (; v;)
+       return *p;
+     }
+   *r = *t + b >= 0;
+   return *p;
+ }
+ 
+ static int
+ fn4 (int *p1)
+ {
+   int *l[2], **m[7];
+   for (; i < 1; i++)
+     for (; j < 1; j++)
+       m[i * 70] = &l[0];
+   k = fn3 ();
+   fn2 (0, p1);
+   if ((m[0] == 0) & a)
+     for (;;)
+       ;
+   return 0;
+ }
+ 
+ int
+ main ()
+ {
+   fn4 (&d);
+   return 0;
+ }

Reply via email to