From 4a3255dd4328cf6f3eaf4cb8c8f825d215a5ecdf Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 10 May 2016 13:13:59 +0000 Subject: [PATCH] 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 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 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr71039.c | 14 ++++++++++++++ gcc/tree-ssa-phiprop.c | 21 +++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr71039.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa23868f340..fa3473d88cb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2016-05-10 Richard Biener + + 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 * config/rx/rx-protos.h (is_interrupt_func, is_fast_interrupt_func): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4367b8b609..1ab0fce238a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-10 Richard Biener + + PR tree-optimization/71039 + * gcc.dg/torture/pr71039.c: New testcase. + 2016-05-10 Nathan Sidwell * 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 00000000000..e169bdca12c --- /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 80d2fc4cf45..20fda6cb714 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. */ -- 2.30.2