aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-09-16 14:27:52 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-09-16 14:27:52 +0000
commitae2ffe2a03f4de06e16addce7a62669d7c6eda5e (patch)
tree5db6a17c851f347374645b43a83fa7130ae8108a /gcc
parent486bc8471fd5de49262f2b36a17b1be5915436e1 (diff)
downloadgcc-ae2ffe2a03f4de06e16addce7a62669d7c6eda5e.zip
gcc-ae2ffe2a03f4de06e16addce7a62669d7c6eda5e.tar.gz
gcc-ae2ffe2a03f4de06e16addce7a62669d7c6eda5e.tar.bz2
re PR tree-optimization/67253 (ICE at -O3 on x86_64-linux-gnu (verify_gimple failed))
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. From-SVN: r227826
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgexpand.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr67253.c62
4 files changed, 76 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2ec6aef..e09c84c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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.
+
+2015-09-16 Richard Biener <rguenther@suse.de>
+
PR middle-end/67271
* fold-const.c (native_encode_expr): Bail out on bogus offsets.
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index d567a87..3036e67 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 87bcebf..b54f0d1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2015-09-16 Richard Biener <rguenther@suse.de>
+ PR middle-end/67253
+ * gcc.dg/torture/pr67253.c: New testcase.
+
+2015-09-16 Richard Biener <rguenther@suse.de>
+
PR middle-end/67271
* gcc.dg/pr67271.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr67253.c b/gcc/testsuite/gcc.dg/torture/pr67253.c
new file mode 100644
index 0000000..711106e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr67253.c
@@ -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;
+}