tree-ssa-sccvn.h (has_VN_INFO): Declare.
authorRichard Biener <rguenther@suse.de>
Fri, 12 May 2017 12:04:31 +0000 (12:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 12 May 2017 12:04:31 +0000 (12:04 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/ssa-dse-2.C
gcc/tree-ssa-pre.c
gcc/tree-ssa-sccvn.h

index 988e8c7..5f5bd2a 100644 (file)
@@ -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.
index c32d766..ff4327a 100644 (file)
@@ -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
index bee8651..913df22 100644 (file)
@@ -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" } } */
index c7062b7..e97fdb4 100644 (file)
@@ -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))
index 53a21af..77d0183 100644 (file)
@@ -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);