aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-sccvn.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-09-07 07:44:43 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-09-07 07:44:43 +0000
commita7976089dba5e22778e4496e1b86e022241f9d69 (patch)
tree0a6114aa3b7e88085de18911eacd2d3276ca52ea /gcc/tree-ssa-sccvn.c
parente76b247239756b547eaa51d9fa0629416a293269 (diff)
downloadgcc-a7976089dba5e22778e4496e1b86e022241f9d69.zip
gcc-a7976089dba5e22778e4496e1b86e022241f9d69.tar.gz
gcc-a7976089dba5e22778e4496e1b86e022241f9d69.tar.bz2
passes.def (pass_split_crit_edges): Remove instance before PRE.
2017-09-07 Richard Biener <rguenther@suse.de> * passes.def (pass_split_crit_edges): Remove instance before PRE. * tree-ssa-pre.c (pass_pre::execute): Instead manually split critical edges here, after loop init. (pass_data_pre): Remove PROP_no_crit_edges flags. * tree-ssa-sccvn.c (vn_reference_lookup_3): Use vn_valueize for valueization of call args to avoid leaking VN_TOP. (visit_use): Assert we do not visit default defs. (init_scc_vn): Use build_decl for VN_TOP to make name nicer. Use error_mark_node to more easily detect leaking VN_TOP. All default-defs are varying, not VN_TOP. Mark them visited. (run_scc_vn): Make code match comment. * gcc.dg/tree-ssa/ssa-thread-12.c: XFAIL third FSM threading opportunity. From-SVN: r251833
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r--gcc/tree-ssa-sccvn.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 472ab0b..93342c0 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1874,10 +1874,10 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
for (unsigned i = 0; i < gimple_call_num_args (def_stmt); ++i)
{
oldargs[i] = gimple_call_arg (def_stmt, i);
- if (TREE_CODE (oldargs[i]) == SSA_NAME
- && VN_INFO (oldargs[i])->valnum != oldargs[i])
+ tree val = vn_valueize (oldargs[i]);
+ if (val != oldargs[i])
{
- gimple_call_set_arg (def_stmt, i, VN_INFO (oldargs[i])->valnum);
+ gimple_call_set_arg (def_stmt, i, val);
valueized_anything = true;
}
}
@@ -3956,9 +3956,10 @@ visit_use (tree use)
mark_use_processed (use);
- gcc_assert (!SSA_NAME_IN_FREE_LIST (use));
- if (dump_file && (dump_flags & TDF_DETAILS)
- && !SSA_NAME_IS_DEFAULT_DEF (use))
+ gcc_assert (!SSA_NAME_IN_FREE_LIST (use)
+ && !SSA_NAME_IS_DEFAULT_DEF (use));
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "Value numbering ");
print_generic_expr (dump_file, use);
@@ -3966,10 +3967,7 @@ visit_use (tree use)
print_gimple_stmt (dump_file, stmt, 0);
}
- /* Handle uninitialized uses. */
- if (SSA_NAME_IS_DEFAULT_DEF (use))
- changed = set_ssa_val_to (use, use);
- else if (gimple_code (stmt) == GIMPLE_PHI)
+ if (gimple_code (stmt) == GIMPLE_PHI)
changed = visit_phi (stmt);
else if (gimple_has_volatile_ops (stmt))
changed = defs_to_varying (stmt);
@@ -4554,7 +4552,8 @@ init_scc_vn (void)
XDELETE (rpo_numbers_temp);
- VN_TOP = create_tmp_var_raw (void_type_node, "vn_top");
+ VN_TOP = build_decl (UNKNOWN_LOCATION, VAR_DECL,
+ get_identifier ("VN_TOP"), error_mark_node);
renumber_gimple_stmt_uids ();
@@ -4583,7 +4582,9 @@ init_scc_vn (void)
switch (TREE_CODE (SSA_NAME_VAR (name)))
{
case VAR_DECL:
- /* Undefined vars keep TOP. */
+ /* All undefined vars are VARYING. */
+ VN_INFO (name)->valnum = name;
+ VN_INFO (name)->visited = true;
break;
case PARM_DECL:
@@ -4610,12 +4611,10 @@ init_scc_vn (void)
case RESULT_DECL:
/* If the result is passed by invisible reference the default
- def is initialized, otherwise it's uninitialized. */
- if (DECL_BY_REFERENCE (SSA_NAME_VAR (name)))
- {
- VN_INFO (name)->visited = true;
- VN_INFO (name)->valnum = name;
- }
+ def is initialized, otherwise it's uninitialized. Still
+ undefined is varying. */
+ VN_INFO (name)->visited = true;
+ VN_INFO (name)->valnum = name;
break;
default:
@@ -5008,14 +5007,13 @@ run_scc_vn (vn_lookup_kind default_vn_walk_kind_)
/* Initialize the value ids and prune out remaining VN_TOPs
from dead code. */
tree name;
-
FOR_EACH_SSA_NAME (i, name, cfun)
{
vn_ssa_aux_t info = VN_INFO (name);
- if (!info->visited)
- info->valnum = name;
- if (info->valnum == name
+ if (!info->visited
|| info->valnum == VN_TOP)
+ info->valnum = name;
+ if (info->valnum == name)
info->value_id = get_next_value_id ();
else if (is_gimple_min_invariant (info->valnum))
info->value_id = get_or_alloc_constant_value_id (info->valnum);