Update virtual SSA form manually where easily possible in phiprop
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. * tree-ssa-phiprop.cc (phiprop_insert_phi): For simple loads keep the virtual SSA form up-to-date.
This commit is contained in:
parent
63aaff9b3a
commit
85107abeb7
1 changed files with 17 additions and 1 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue