aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-05-12 12:04:31 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-05-12 12:04:31 +0000
commit7af1c0ad98613e1a8684b075ac2a6e4739b07b07 (patch)
tree34ee03d7358901d784081705859f9cc7124ad624 /gcc
parentf7e95bdbca9d3c949a809fda0947e047d1c618b0 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C4
-rw-r--r--gcc/tree-ssa-pre.c65
-rw-r--r--gcc/tree-ssa-sccvn.h1
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);