This keeps virtual SSA form up-to-date in phiprop when easily possible. Only when we deal with aggregate copies the work would be too heavy-handed in general.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. * tree-ssa-phiprop.cc (phiprop_insert_phi): For simple loads keep the virtual SSA form up-to-date. --- gcc/tree-ssa-phiprop.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc index 5dc505df420..21a349a25e2 100644 --- a/gcc/tree-ssa-phiprop.cc +++ b/gcc/tree-ssa-phiprop.cc @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple-iterator.h" #include "stor-layout.h" #include "tree-ssa-loop.h" +#include "tree-cfg.h" /* This pass propagates indirect loads through the PHI node for its address to make the load source possibly non-addressable and to @@ -153,6 +154,8 @@ phiprop_insert_phi (basic_block bb, gphi *phi, gimple *use_stmt, print_gimple_stmt (dump_file, use_stmt, 0); } + gphi *vphi = get_virtual_phi (bb); + /* Add PHI arguments for each edge inserting loads of the addressable operands. */ FOR_EACH_EDGE (e, ei, bb->preds) @@ -190,9 +193,20 @@ phiprop_insert_phi (basic_block bb, gphi *phi, gimple *use_stmt, { tree rhs = gimple_assign_rhs1 (use_stmt); gcc_assert (TREE_CODE (old_arg) == ADDR_EXPR); + tree vuse = NULL_TREE; if (TREE_CODE (res) == SSA_NAME) - new_var = make_ssa_name (TREE_TYPE (rhs)); + { + new_var = make_ssa_name (TREE_TYPE (rhs)); + if (vphi) + vuse = PHI_ARG_DEF_FROM_EDGE (vphi, e); + else + vuse = gimple_vuse (use_stmt); + } else + /* For the aggregate copy case updating virtual operands + we'd have to possibly insert a virtual PHI and we have + to split the existing VUSE lifetime. Leave that to + the generic SSA updating. */ new_var = unshare_expr (res); if (!is_gimple_min_invariant (old_arg)) old_arg = PHI_ARG_DEF_FROM_EDGE (phi, e); @@ -203,6 +217,8 @@ phiprop_insert_phi (basic_block bb, gphi *phi, gimple *use_stmt, old_arg, TREE_OPERAND (rhs, 1))); gimple_set_location (tmp, locus); + if (vuse) + gimple_set_vuse (tmp, vuse); gsi_insert_on_edge (e, tmp); update_stmt (tmp); -- 2.35.3