]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimple-iterator.c (gsi_remove): Return whether EH edges need to be cleanup.
authorRichard Guenther <rguenther@suse.de>
Thu, 5 Apr 2012 09:43:48 +0000 (09:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 5 Apr 2012 09:43:48 +0000 (09:43 +0000)
2012-04-05  Richard Guenther  <rguenther@suse.de>

* gimple-iterator.c (gsi_remove): Return whether EH edges need to be
cleanup.
* gimple.h (gsi_remove): Adjust.
* tree-ssa-operands.c (unlink_stmt_vdef): Optimize.
* tree-ssa-dom.c (optimize_stmt): Use gsi_remove result.
* tree-ssa-dse.c (dse_optimize_stmt): Likewise.
* tree-ssa-forwprop.c (remove_prop_source_from_use): Likewise.
* tree-ssa-math-opts.c (execute_optimize_widening_mul): Likewise.
* tree-ssa-pre.c (eliminate): Likewise.

From-SVN: r186159

gcc/ChangeLog
gcc/gimple-iterator.c
gcc/gimple.h
gcc/tree-ssa-dom.c
gcc/tree-ssa-dse.c
gcc/tree-ssa-forwprop.c
gcc/tree-ssa-math-opts.c
gcc/tree-ssa-operands.c
gcc/tree-ssa-pre.c

index 23c9435ba682240c124e82bc3b807af074e82b69..591c5af93ca416170fe37780cf0de3eb3db95a42 100644 (file)
@@ -1,3 +1,15 @@
+2012-04-05  Richard Guenther  <rguenther@suse.de>
+
+       * gimple-iterator.c (gsi_remove): Return whether EH edges need to be
+       cleanup.
+       * gimple.h (gsi_remove): Adjust.
+       * tree-ssa-operands.c (unlink_stmt_vdef): Optimize.
+       * tree-ssa-dom.c (optimize_stmt): Use gsi_remove result.
+       * tree-ssa-dse.c (dse_optimize_stmt): Likewise.
+       * tree-ssa-forwprop.c (remove_prop_source_from_use): Likewise.
+       * tree-ssa-math-opts.c (execute_optimize_widening_mul): Likewise.
+       * tree-ssa-pre.c (eliminate): Likewise.
+
 2012-04-04  Mike Stump  <mikestump@comcast.net>
 
        * doc/rtl.texi (const_double): Document as sign-extending.
index f5a1d26dc276964e413cc92ae3e1ca0cf6f4f643..e387c16e31a451e79fedb908a165ca43d62c0565 100644 (file)
@@ -499,13 +499,15 @@ gsi_insert_after (gimple_stmt_iterator *i, gimple stmt,
    REMOVE_PERMANENTLY is true when the statement is going to be removed
    from the IL and not reinserted elsewhere.  In that case we remove the
    statement pointed to by iterator I from the EH tables, and free its
-   operand caches.  Otherwise we do not modify this information.  */
+   operand caches.  Otherwise we do not modify this information.  Returns
+   true whether EH edge cleanup is required.  */
 
-void
+bool
 gsi_remove (gimple_stmt_iterator *i, bool remove_permanently)
 {
   gimple_seq_node cur, next, prev;
   gimple stmt = gsi_stmt (*i);
+  bool require_eh_edge_purge = false;
 
   if (gimple_code (stmt) != GIMPLE_PHI)
     insert_debug_temps_for_defs (i);
@@ -517,7 +519,7 @@ gsi_remove (gimple_stmt_iterator *i, bool remove_permanently)
 
   if (remove_permanently)
     {
-      remove_stmt_from_eh_lp (stmt);
+      require_eh_edge_purge = remove_stmt_from_eh_lp (stmt);
       gimple_remove_stmt_histograms (cfun, stmt);
     }
 
@@ -537,6 +539,8 @@ gsi_remove (gimple_stmt_iterator *i, bool remove_permanently)
     gimple_seq_set_last (i->seq, prev);
 
   i->ptr = next;
+
+  return require_eh_edge_purge;
 }
 
 
index 167bc738a40d04753327bc344a9250669b63a9ea..6af6dc48536eb9ab6a33a4cda6819d6e41ad6543 100644 (file)
@@ -5095,7 +5095,7 @@ void gsi_insert_seq_after (gimple_stmt_iterator *, gimple_seq,
                           enum gsi_iterator_update);
 void gsi_insert_seq_after_without_update (gimple_stmt_iterator *, gimple_seq,
                                           enum gsi_iterator_update);
-void gsi_remove (gimple_stmt_iterator *, bool);
+bool gsi_remove (gimple_stmt_iterator *, bool);
 gimple_stmt_iterator gsi_for_stmt (gimple);
 void gsi_move_after (gimple_stmt_iterator *, gimple_stmt_iterator *);
 void gsi_move_before (gimple_stmt_iterator *, gimple_stmt_iterator *);
index 4ea9644dd277e26d6db4e37af9fa1254f815922d..d2e4cc4b0b342e4ce1298ff760d0e41bb43eb465 100644 (file)
@@ -2294,10 +2294,8 @@ optimize_stmt (basic_block bb, gimple_stmt_iterator si)
              && rhs == cached_lhs)
            {
              basic_block bb = gimple_bb (stmt);
-             int lp_nr = lookup_stmt_eh_lp (stmt);
              unlink_stmt_vdef (stmt);
-             gsi_remove (&si, true);
-             if (lp_nr != 0)
+             if (gsi_remove (&si, true))
                {
                  bitmap_set_bit (need_eh_cleanup, bb->index);
                  if (dump_file && (dump_flags & TDF_DETAILS))
index 285d08c66c66c67c893497a0c5e2e52a08b0ded4..93ba42506d78268928b0012f25e35855f9ac0a6f 100644 (file)
@@ -257,10 +257,9 @@ dse_optimize_stmt (gimple_stmt_iterator gsi)
          /* Then we need to fix the operand of the consuming stmt.  */
          unlink_stmt_vdef (stmt);
 
-         bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
-
          /* Remove the dead store.  */
-         gsi_remove (&gsi, true);
+         if (gsi_remove (&gsi, true))
+           bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index);
 
          /* And release any SSA_NAMEs set in this statement back to the
             SSA_NAME manager.  */
index 2b16222bbd502a9382ad4b46153688936028c654..c99af1a8c43112493adc3491bc2342660372e6be 100644 (file)
@@ -325,9 +325,9 @@ remove_prop_source_from_use (tree name)
     bb = gimple_bb (stmt);
     gsi = gsi_for_stmt (stmt);
     unlink_stmt_vdef (stmt);
-    gsi_remove (&gsi, true);
+    if (gsi_remove (&gsi, true))
+      cfg_changed |= gimple_purge_dead_eh_edges (bb);
     release_defs (stmt);
-    cfg_changed |= gimple_purge_dead_eh_edges (bb);
 
     name = is_gimple_assign (stmt) ? gimple_assign_rhs1 (stmt) : NULL_TREE;
   } while (name && TREE_CODE (name) == SSA_NAME);
index ab982f504820e9c8f67fdc02afa92420235ec016..5c3543ecf3961acd417824533ad0727ebeade882 100644 (file)
@@ -2658,10 +2658,10 @@ execute_optimize_widening_mul (void)
                                                    gimple_call_arg (stmt, 0)))
                          {
                            unlink_stmt_vdef (stmt);
-                           gsi_remove (&gsi, true);
-                           release_defs (stmt);
-                           if (gimple_purge_dead_eh_edges (bb))
+                           if (gsi_remove (&gsi, true)
+                               && gimple_purge_dead_eh_edges (bb))
                              cfg_changed = true;
+                           release_defs (stmt);
                            continue;
                          }
                          break;
index ed0d34de2df14a8c2fd050836b96f40a1d8cb5be..2994a1211bcf18888e522ffd3fd92ab496a6e8d7 100644 (file)
@@ -1475,18 +1475,19 @@ unlink_stmt_vdef (gimple stmt)
   imm_use_iterator iter;
   gimple use_stmt;
   tree vdef = gimple_vdef (stmt);
+  tree vuse = gimple_vuse (stmt);
 
   if (!vdef
       || TREE_CODE (vdef) != SSA_NAME)
     return;
 
-  FOR_EACH_IMM_USE_STMT (use_stmt, iter, gimple_vdef (stmt))
+  FOR_EACH_IMM_USE_STMT (use_stmt, iter, vdef)
     {
       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
-       SET_USE (use_p, gimple_vuse (stmt));
+       SET_USE (use_p, vuse);
     }
 
-  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_vdef (stmt)))
-    SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_vuse (stmt)) = 1;
+  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vdef))
+    SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vuse) = 1;
 }
 
index 6a2ce643d7407c46f3d6dc1578777e80f5b8a02c..5e6f5708ad1c3063e4e186cb1985a809feff67e7 100644 (file)
@@ -4629,11 +4629,8 @@ eliminate (void)
          basic_block bb = gimple_bb (stmt);
          gsi = gsi_for_stmt (stmt);
          unlink_stmt_vdef (stmt);
-         gsi_remove (&gsi, true);
-         /* ???  gsi_remove doesn't tell us whether the stmt was
-            in EH tables and thus whether we need to purge EH edges.
-            Simply schedule the block for a cleanup.  */
-         bitmap_set_bit (need_eh_cleanup, bb->index);
+         if (gsi_remove (&gsi, true))
+           bitmap_set_bit (need_eh_cleanup, bb->index);
          if (TREE_CODE (lhs) == SSA_NAME)
            bitmap_clear_bit (inserted_exprs, SSA_NAME_VERSION (lhs));
          release_defs (stmt);