This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR66413


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  <rguenther@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;
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]