diff mbox

Fix PR67253

Message ID alpine.LSU.2.11.1509161626580.24931@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Sept. 16, 2015, 2:28 p.m. UTC
Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-09-16  Richard Biener  <rguenther@suse.de>

	PR middle-end/67253
	* cfgexpand.c (expand_gimple_stmt_1): Do not clobber
	location of possibly shared trees.

	* gcc.dg/torture/pr67253.c: New testcase.
diff mbox

Patch

Index: gcc/cfgexpand.c
===================================================================
--- gcc/cfgexpand.c	(revision 227779)
+++ gcc/cfgexpand.c	(working copy)
@@ -3587,7 +3587,9 @@  expand_gimple_stmt_1 (gimple stmt)
 	    tree rhs = gimple_assign_rhs1 (assign_stmt);
 	    gcc_assert (get_gimple_rhs_class (gimple_expr_code (stmt))
 			== GIMPLE_SINGLE_RHS);
-	    if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs))
+	    if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs)
+		/* Do not put locations on possibly shared trees.  */
+		&& !is_gimple_min_invariant (rhs))
 	      SET_EXPR_LOCATION (rhs, gimple_location (stmt));
 	    if (TREE_CLOBBER_P (rhs))
 	      /* This is a clobber to mark the going out of scope for
Index: gcc/testsuite/gcc.dg/torture/pr67253.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr67253.c	(revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr67253.c	(working copy)
@@ -0,0 +1,62 @@ 
+/* { dg-do run } */
+
+int *a, b, c, **d = &a, e, f, **h, i, j, k, l, m, *n, o, **q, r, s;
+
+void fn1 (int p) { }
+
+void
+fn3 ()
+{
+  for (; j; j++)
+    for (; k; k++)
+      l++;
+  f++;
+}
+
+static int
+fn4 (char p1, int *p2)
+{
+  for (; m < 1;)
+    {
+      fn1 (q == &p2);
+      for (; o; o++)
+	;
+      n = p2;
+      return 0;
+    }
+  for (;;)
+    {
+      for (; s; s++)
+	b = r;
+      *d = 0;
+    }
+}
+
+static int *fn2 (char, int, int *);
+
+static int
+fn5 ()
+{
+  int *g = &c;
+  fn3 ();
+  fn2 (0, 0, g);
+  return e;
+}
+
+static int *
+fn2 (char p1, int p2, int *p3)
+{
+  fn4 (0, p3);
+  fn1 (&p3 == h);
+  for (; i;)
+    fn5 ();
+  fn4 (0, p3);
+  return *d;
+}
+
+int
+main ()
+{
+  fn5 ();
+  return 0;
+}