aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-05-10 13:13:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-05-10 13:13:59 +0000
commit4a3255dd4328cf6f3eaf4cb8c8f825d215a5ecdf (patch)
tree7a0578cfb6e314726995d9350cdc7840b57cbe1e /gcc
parent77a87b2a0e5fb069107479d1e2bd3efafd6bd3ab (diff)
downloadgcc-4a3255dd4328cf6f3eaf4cb8c8f825d215a5ecdf.zip
gcc-4a3255dd4328cf6f3eaf4cb8c8f825d215a5ecdf.tar.gz
gcc-4a3255dd4328cf6f3eaf4cb8c8f825d215a5ecdf.tar.bz2
re PR tree-optimization/71039 (ICE: verify_ssa failed (error: definition in block 4 does not dominate use in block 5) w/ -O1 and above)
2016-05-10 Richard Biener <rguenther@suse.de> PR tree-optimization/71039 * tree-ssa-phiprop.c: Include tree-ssa-loop.h. (chk_uses): New function. (propagate_with_phi): Verify we can safely replicate the lhs of an aggregate assignment on all incoming edges. * gcc.dg/torture/pr71039.c: New testcase. From-SVN: r236079
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr71039.c14
-rw-r--r--gcc/tree-ssa-phiprop.c21
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fa23868..fa3473d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-05-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/71039
+ * tree-ssa-phiprop.c: Include tree-ssa-loop.h.
+ (chk_uses): New function.
+ (propagate_with_phi): Verify we can safely replicate the lhs of an
+ aggregate assignment on all incoming edges.
+
2016-05-10 Oleg Endo <olegendo@gcc.gnu.org>
* config/rx/rx-protos.h (is_interrupt_func, is_fast_interrupt_func):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c4367b8..1ab0fce 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-10 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/71039
+ * gcc.dg/torture/pr71039.c: New testcase.
+
2016-05-10 Nathan Sidwell <nathan@acm.org>
* gcc.dg/nested-func-10.c: Requires alloca.
diff --git a/gcc/testsuite/gcc.dg/torture/pr71039.c b/gcc/testsuite/gcc.dg/torture/pr71039.c
new file mode 100644
index 0000000..e169bdc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr71039.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+struct wv
+{
+ int qi;
+} qp, *ft;
+void *pb;
+
+void
+wz (void)
+{
+ struct wv *vf = pb ? (struct wv *)&pb : &qp;
+ *ft = *vf;
+}
diff --git a/gcc/tree-ssa-phiprop.c b/gcc/tree-ssa-phiprop.c
index 80d2fc4..20fda6c 100644
--- a/gcc/tree-ssa-phiprop.c
+++ b/gcc/tree-ssa-phiprop.c
@@ -32,6 +32,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimplify.h"
#include "gimple-iterator.h"
#include "stor-layout.h"
+#include "tree-ssa-loop.h"
/* This pass propagates indirect loads through the PHI node for its
address to make the load source possibly non-addressable and to
@@ -230,6 +231,19 @@ phiprop_insert_phi (basic_block bb, gphi *phi, gimple *use_stmt,
return res;
}
+/* Verify if *idx is available at *DATA. */
+
+static bool
+chk_uses (tree, tree *idx, void *data)
+{
+ basic_block dom = (basic_block) data;
+ if (TREE_CODE (*idx) == SSA_NAME)
+ return (SSA_NAME_IS_DEFAULT_DEF (*idx)
+ || ! dominated_by_p (CDI_DOMINATORS,
+ gimple_bb (SSA_NAME_DEF_STMT (*idx)), dom));
+ return true;
+}
+
/* Propagate between the phi node arguments of PHI in BB and phi result
users. For now this matches
# p_2 = PHI <&x, &y>
@@ -342,6 +356,13 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn,
insert aggregate copies on the edges instead. */
if (!is_gimple_reg_type (TREE_TYPE (TREE_TYPE (ptr))))
{
+ /* As we replicate the lhs on each incoming edge all
+ used SSA names have to be available there. */
+ if (! for_each_index (gimple_assign_lhs_ptr (use_stmt),
+ chk_uses,
+ get_immediate_dominator (CDI_DOMINATORS,
+ gimple_bb (phi))))
+ goto next;
phiprop_insert_phi (bb, phi, use_stmt, phivn, n);
/* Remove old stmt. The phi is taken care of by DCE. */