From: Richard Biener Date: Thu, 7 Sep 2017 07:44:43 +0000 (+0000) Subject: passes.def (pass_split_crit_edges): Remove instance before PRE. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a7976089dba5e22778e4496e1b86e022241f9d69;p=gcc.git passes.def (pass_split_crit_edges): Remove instance before PRE. 2017-09-07 Richard Biener * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6213a2aad57..8e614f675a8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2017-09-07 Richard Biener + + * 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. + 2017-09-07 Michael Meissner * config/rs6000/rs6000-cpus.def (OTHER_VSX_VECTOR_MASKS): Delete diff --git a/gcc/passes.def b/gcc/passes.def index 81b6e62f602..00e75d2b55a 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -255,7 +255,6 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_optimize_bswap); NEXT_PASS (pass_laddress); NEXT_PASS (pass_lim); - NEXT_PASS (pass_split_crit_edges); NEXT_PASS (pass_walloca, false); NEXT_PASS (pass_pre); NEXT_PASS (pass_sink_code); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7edf509b554..59af0f7b726 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-09-07 Richard Biener + + * gcc.dg/tree-ssa/ssa-thread-12.c: XFAIL third FSM threading + opportunity. + 2017-09-07 Michael Meissner * gcc.target/powerpc/float128-1.c: Update options to know that diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-12.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-12.c index fa6da7bfd99..d829b04d177 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-12.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-thread-12.c @@ -2,7 +2,7 @@ /* { dg-options "-O2 -fdump-tree-thread2-details -fdump-tree-thread3-details -fdump-tree-thread4-details" } */ /* { dg-final { scan-tree-dump "FSM" "thread2" } } */ /* { dg-final { scan-tree-dump "FSM" "thread3" } } */ -/* { dg-final { scan-tree-dump "FSM" "thread4" } } */ +/* { dg-final { scan-tree-dump "FSM" "thread4" { xfail *-*-* } } } */ typedef struct bitmap_head_def *bitmap; typedef const struct bitmap_head_def *const_bitmap; diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 1ca68d44d22..6f9fac5b9a0 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -5006,11 +5006,9 @@ const pass_data pass_data_pre = "pre", /* name */ OPTGROUP_NONE, /* optinfo_flags */ TV_TREE_PRE, /* tv_id */ - /* PROP_no_crit_edges is ensured by placing pass_split_crit_edges before - pass_pre. */ - ( PROP_no_crit_edges | PROP_cfg | PROP_ssa ), /* properties_required */ + ( PROP_cfg | PROP_ssa ), /* properties_required */ 0, /* properties_provided */ - PROP_no_crit_edges, /* properties_destroyed */ + 0, /* properties_destroyed */ TODO_rebuild_alias, /* todo_flags_start */ 0, /* todo_flags_finish */ }; @@ -5040,6 +5038,7 @@ pass_pre::execute (function *fun) /* This has to happen before SCCVN runs because loop_optimizer_init may create new phis, etc. */ loop_optimizer_init (LOOPS_NORMAL); + split_critical_edges (); run_scc_vn (VN_WALK); diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 472ab0b7958..93342c0248f 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);