]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/51117 (rev.181172 causes glibc build failure)
authorJakub Jelinek <jakub@redhat.com>
Fri, 9 Dec 2011 11:48:30 +0000 (12:48 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 9 Dec 2011 11:48:30 +0000 (12:48 +0100)
PR tree-optimization/51117
* tree-eh.c (optimize_clobbers): New function.
(execute_lower_eh_dispatch): Call it.

Co-Authored-By: Andrew Pinski <apinski@cavium.com>
From-SVN: r182158

gcc/ChangeLog
gcc/tree-eh.c

index d56c240d5ca33153348a3710fdcc1278ce1ad7bd..7dfa77fc54da4042c3726e26e2c80597223ae762 100644 (file)
@@ -1,3 +1,10 @@
+2011-12-09  Jakub Jelinek  <jakub@redhat.com>
+           Andrew Pinski  <apinski@cavium.com>
+
+       PR tree-optimization/51117
+       * tree-eh.c (optimize_clobbers): New function.
+       (execute_lower_eh_dispatch): Call it.
+
 2011-12-09  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/51482
index 57abca80e4ec4f514b7bd26d48dcf39df8b325eb..7fc850a2ae9839db6376fc13b429ae78d99e0e67 100644 (file)
@@ -3173,6 +3173,30 @@ struct gimple_opt_pass pass_lower_resx =
  }
 };
 
+/* Try to optimize var = {v} {CLOBBER} stmts followed just by
+   external throw.  */
+
+static void
+optimize_clobbers (basic_block bb)
+{
+  gimple_stmt_iterator gsi = gsi_last_bb (bb);
+  for (gsi_prev (&gsi); !gsi_end_p (gsi);)
+    {
+      gimple stmt = gsi_stmt (gsi);
+      if (is_gimple_debug (stmt))
+       {
+         gsi_prev (&gsi);
+         continue;
+       }
+      if (!gimple_assign_single_p (stmt)
+         || TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME
+         || !TREE_CLOBBER_P (gimple_assign_rhs1 (stmt)))
+       return;
+      unlink_stmt_vdef (stmt);
+      gsi_remove (&gsi, true);
+      release_defs (stmt);
+    }
+}
 
 /* At the end of inlining, we can lower EH_DISPATCH.  Return true when 
    we have found some duplicate labels and removed some edges.  */
@@ -3337,11 +3361,16 @@ execute_lower_eh_dispatch (void)
   FOR_EACH_BB (bb)
     {
       gimple last = last_stmt (bb);
-      if (last && gimple_code (last) == GIMPLE_EH_DISPATCH)
+      if (last == NULL)
+       continue;
+      if (gimple_code (last) == GIMPLE_EH_DISPATCH)
        {
          redirected |= lower_eh_dispatch (bb, last);
          any_rewritten = true;
        }
+      else if (gimple_code (last) == GIMPLE_RESX
+              && stmt_can_throw_external (last))
+       optimize_clobbers (bb);
     }
 
   if (redirected)