The following fixes PR71039 - we were failing to verify we can insert the lhs on the predecessor edges.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2016-05-10 Richard Biener <rguent...@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. Index: gcc/tree-ssa-phiprop.c =================================================================== *** gcc/tree-ssa-phiprop.c (revision 236066) --- gcc/tree-ssa-phiprop.c (working copy) *************** along with GCC; see the file COPYING3. *** 32,37 **** --- 32,38 ---- #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 *************** phiprop_insert_phi (basic_block bb, gphi *** 230,235 **** --- 231,249 ---- return res; } + /* Verify if *idx is available at *DATA. */ + + static bool + chk_uses (tree t, 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> *************** propagate_with_phi (basic_block bb, gphi *** 342,347 **** --- 356,368 ---- 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. */ Index: gcc/testsuite/gcc.dg/torture/pr71039.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr71039.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr71039.c (working copy) *************** *** 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; + }