Commit 7af1c0ad by Richard Biener Committed by Richard Biener

tree-ssa-sccvn.h (has_VN_INFO): Declare.

2017-05-12  Richard Biener  <rguenther@suse.de>

	* tree-ssa-sccvn.h (has_VN_INFO): Declare.
	* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
	Fold all stmts not inplace.

	* g++.dg/tree-ssa/ssa-dse-2.C: Adjust.

From-SVN: r247966
parent f7e95bdb
2017-05-12 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.h (has_VN_INFO): Declare.
* tree-ssa-pre.c (eliminate_dom_walker::before_dom_children):
Fold all stmts not inplace.
2017-05-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/80713
* tree-ssa-pre.c (remove_dead_inserted_code): Clear
inserted_exprs bit for not removed stmts.
......
2017-05-12 Richard Biener <rguenther@suse.de>
* g++.dg/tree-ssa/ssa-dse-2.C: Adjust.
2017-05-12 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67687
......
......@@ -54,6 +54,4 @@ fill_vec_av_set (av_set_t av)
}
/* { dg-final { scan-tree-dump-not "Trimming statement .head = -" "dse2" } } */
/* { dg-final { scan-tree-dump "Deleted dead call: " "dse2" } } */
/* { dg-final { scan-tree-dump-not "mem\[^\r\n\]*, 0\\);" "dse2" } } */
......@@ -4645,30 +4645,51 @@ eliminate_dom_walker::before_dom_children (basic_block b)
&& TREE_CODE (gimple_assign_rhs1 (stmt)) == ADDR_EXPR)
recompute_tree_invariant_for_addr_expr (gimple_assign_rhs1 (stmt));
gimple *old_stmt = stmt;
if (is_gimple_call (stmt))
gimple_stmt_iterator prev = gsi;
gsi_prev (&prev);
if (fold_stmt (&gsi))
{
/* ??? Only fold calls inplace for now, this may create new
SSA names which in turn will confuse free_scc_vn SSA name
release code. */
fold_stmt_inplace (&gsi);
/* When changing a call into a noreturn call, cfg cleanup
is needed to fix up the noreturn call. */
if (!was_noreturn && gimple_call_noreturn_p (stmt))
el_to_fixup.safe_push (stmt);
}
else
{
fold_stmt (&gsi);
stmt = gsi_stmt (gsi);
if ((gimple_code (stmt) == GIMPLE_COND
&& (gimple_cond_true_p (as_a <gcond *> (stmt))
|| gimple_cond_false_p (as_a <gcond *> (stmt))))
|| (gimple_code (stmt) == GIMPLE_SWITCH
&& TREE_CODE (gimple_switch_index (
as_a <gswitch *> (stmt)))
== INTEGER_CST))
el_todo |= TODO_cleanup_cfg;
/* fold_stmt may have created new stmts inbetween
the previous stmt and the folded stmt. Mark
all defs created there as varying to not confuse
the SCCVN machinery as we're using that even during
elimination. */
if (gsi_end_p (prev))
prev = gsi_start_bb (b);
else
gsi_next (&prev);
if (gsi_stmt (prev) != gsi_stmt (gsi))
do
{
tree def;
ssa_op_iter dit;
FOR_EACH_SSA_TREE_OPERAND (def, gsi_stmt (prev),
dit, SSA_OP_ALL_DEFS)
/* As existing DEFs may move between stmts
we have to guard VN_INFO_GET. */
if (! has_VN_INFO (def))
VN_INFO_GET (def)->valnum = def;
if (gsi_stmt (prev) == gsi_stmt (gsi))
break;
gsi_next (&prev);
}
while (1);
}
stmt = gsi_stmt (gsi);
/* When changing a call into a noreturn call, cfg cleanup
is needed to fix up the noreturn call. */
if (!was_noreturn
&& is_gimple_call (stmt) && gimple_call_noreturn_p (stmt))
el_to_fixup.safe_push (stmt);
/* When changing a condition or switch into one we know what
edge will be executed, schedule a cfg cleanup. */
if ((gimple_code (stmt) == GIMPLE_COND
&& (gimple_cond_true_p (as_a <gcond *> (stmt))
|| gimple_cond_false_p (as_a <gcond *> (stmt))))
|| (gimple_code (stmt) == GIMPLE_SWITCH
&& TREE_CODE (gimple_switch_index
(as_a <gswitch *> (stmt))) == INTEGER_CST))
el_todo |= TODO_cleanup_cfg;
/* If we removed EH side-effects from the statement, clean
its EH information. */
if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
......
......@@ -209,6 +209,7 @@ typedef struct vn_ssa_aux
enum vn_lookup_kind { VN_NOWALK, VN_WALK, VN_WALKREWRITE };
/* Return the value numbering info for an SSA_NAME. */
bool has_VN_INFO (tree);
extern vn_ssa_aux_t VN_INFO (tree);
extern vn_ssa_aux_t VN_INFO_GET (tree);
tree vn_get_expr_for (tree);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment