diff options
author | Richard Biener <rguenther@suse.de> | 2017-05-12 12:04:31 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-05-12 12:04:31 +0000 |
commit | 7af1c0ad98613e1a8684b075ac2a6e4739b07b07 (patch) | |
tree | 34ee03d7358901d784081705859f9cc7124ad624 /gcc | |
parent | f7e95bdbca9d3c949a809fda0947e047d1c618b0 (diff) | |
download | gcc-7af1c0ad98613e1a8684b075ac2a6e4739b07b07.zip gcc-7af1c0ad98613e1a8684b075ac2a6e4739b07b07.tar.gz gcc-7af1c0ad98613e1a8684b075ac2a6e4739b07b07.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C | 4 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 65 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.h | 1 |
5 files changed, 55 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 988e8c7..5f5bd2a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c32d766..ff4327a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C index bee8651..913df22 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C +++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C @@ -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" } } */ diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index c7062b7..e97fdb4 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -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)) diff --git a/gcc/tree-ssa-sccvn.h b/gcc/tree-ssa-sccvn.h index 53a21af..77d0183 100644 --- a/gcc/tree-ssa-sccvn.h +++ b/gcc/tree-ssa-sccvn.h @@ -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); |