aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-06-15 07:25:13 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-06-15 07:25:13 +0000
commit5b32ec103973c3b8f537c6e50fc8d954f27286de (patch)
tree8339b2aff1e9d29ab7aa60b7b6dd06cf3265a7d5
parenta8ef8061e1ccbacff39065df65b5c17fbd01805a (diff)
downloadgcc-5b32ec103973c3b8f537c6e50fc8d954f27286de.zip
gcc-5b32ec103973c3b8f537c6e50fc8d954f27286de.tar.gz
gcc-5b32ec103973c3b8f537c6e50fc8d954f27286de.tar.bz2
re PR tree-optimization/86076 (ICE: verify_gimple failed (error: location references block not in block tree))
2018-06-15 Richard Biener <rguenther@suse.de> PR middle-end/86076 * tree-cfg.c (move_stmt_op): unshare invariant addresses before adjusting their block. * gcc.dg/pr86076.c: New testcase. From-SVN: r261620
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr86076.c26
-rw-r--r--gcc/tree-cfg.c11
4 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e9499b2..8f95eb5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-06-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/86076
+ * tree-cfg.c (move_stmt_op): unshare invariant addresses
+ before adjusting their block.
+
2018-06-15 Sebastian Huber <sebastian.huber@embedded-brains.de>
* config.gcc (riscv*-*-elf* | riscv*-*-rtems*): Use custom
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 94c4fca..04278c6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-06-15 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/86076
+ * gcc.dg/pr86076.c: New testcase.
+
2018-06-14 Marek Polacek <polacek@redhat.com>
PR c++/86063
diff --git a/gcc/testsuite/gcc.dg/pr86076.c b/gcc/testsuite/gcc.dg/pr86076.c
new file mode 100644
index 0000000..019ced3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr86076.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-parallelize-loops=2 -fno-tree-dce -fno-tree-pre -fno-tree-vrp --param max-loop-header-insns=1" } */
+
+int __attribute__ ((noinline))
+lv (int tm)
+{
+ (void) tm;
+
+ return 0;
+}
+
+void
+o7 (int uu)
+{
+ while (uu < 1)
+ while (uu != 0)
+ {
+ short int ca;
+
+ ca = lv (0);
+ (void) ca;
+ ++uu;
+ }
+
+ lv (lv (0));
+}
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 21b3fdf..78d80b0 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -6745,7 +6745,16 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *data)
;
else if (block == p->orig_block
|| p->orig_block == NULL_TREE)
- TREE_SET_BLOCK (t, p->new_block);
+ {
+ /* tree_node_can_be_shared says we can share invariant
+ addresses but unshare_expr copies them anyways. Make sure
+ to unshare before adjusting the block in place - we do not
+ always see a copy here. */
+ if (TREE_CODE (t) == ADDR_EXPR
+ && is_gimple_min_invariant (t))
+ *tp = t = unshare_expr (t);
+ TREE_SET_BLOCK (t, p->new_block);
+ }
else if (flag_checking)
{
while (block && TREE_CODE (block) == BLOCK && block != p->orig_block)