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
This commit is contained in:
parent
f7e95bdbca
commit
7af1c0ad98
5 changed files with 55 additions and 25 deletions
|
@ -1,3 +1,9 @@
|
|||
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
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue