This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR66413
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 8 Jun 2015 16:07:44 +0200 (CEST)
- Subject: [PATCH] Fix PR66413
- Authentication-results: sourceware.org; auth=none
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;
+ }