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
This commit is contained in:
Richard Biener 2016-05-10 13:13:59 +00:00 committed by Richard Biener
parent 77a87b2a0e
commit 4a3255dd43
4 changed files with 48 additions and 0 deletions

View File

@ -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):

View File

@ -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.

View File

@ -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;
}

View File

@ -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. */