From 3b9ee1cc734a78aaf343eea4e8a748cbf4a95510 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Mon, 17 Sep 2012 11:18:35 +0200
Subject: [PATCH] re PR middle-end/54563 (ICE in redirect_eh_edge_1, at
 tree-eh.c:2215)

	PR tree-optimization/54563
	* tree-ssa-math-opts.c (execute_cse_sincos): Call
	gimple_purge_dead_eh_edges if last call has been changed.

	* g++.dg/torture/pr54563.C: New test.

From-SVN: r191378
---
 gcc/ChangeLog                          |  6 ++++++
 gcc/testsuite/ChangeLog                |  5 +++++
 gcc/testsuite/g++.dg/torture/pr54563.C | 14 ++++++++++++++
 gcc/tree-ssa-math-opts.c               | 13 ++++++++++++-
 4 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/torture/pr54563.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dcb9d934b417..f406688442ed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-17  Jakub Jelinek  <jakub@redhat.com>
+
+	PR tree-optimization/54563
+	* tree-ssa-math-opts.c (execute_cse_sincos): Call
+	gimple_purge_dead_eh_edges if last call has been changed.
+
 2012-09-17  Georg-Johann Lay  <avr@gjlay.de>
 
 	PR target/54222
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0a63f46d2993..ead2a9744a90 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-09-17  Jakub Jelinek  <jakub@redhat.com>
+
+	PR tree-optimization/54563
+	* g++.dg/torture/pr54563.C: New test.
+
 2012-09-16  Janus Weil  <janus@gcc.gnu.org>
 
 	PR fortran/54594
diff --git a/gcc/testsuite/g++.dg/torture/pr54563.C b/gcc/testsuite/g++.dg/torture/pr54563.C
new file mode 100644
index 000000000000..2980320f6636
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr54563.C
@@ -0,0 +1,14 @@
+// PR tree-optimization/54563
+// { dg-do compile }
+
+extern "C" float powf (float, float);
+struct S { ~S (); };
+double bar ();
+double x;
+
+void
+foo ()
+{
+  S s;
+  x = powf (bar (), 2.);
+}
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 94d19afc2c07..2020bb138cc8 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -1,5 +1,5 @@
 /* Global, SSA-based optimizations using mathematical identities.
-   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -1378,12 +1378,18 @@ execute_cse_sincos (void)
   FOR_EACH_BB (bb)
     {
       gimple_stmt_iterator gsi;
+      bool cleanup_eh = false;
 
       for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
         {
 	  gimple stmt = gsi_stmt (gsi);
 	  tree fndecl;
 
+	  /* Only the last stmt in a bb could throw, no need to call
+	     gimple_purge_dead_eh_edges if we change something in the middle
+	     of a basic block.  */
+	  cleanup_eh = false;
+
 	  if (is_gimple_call (stmt)
 	      && gimple_call_lhs (stmt)
 	      && (fndecl = gimple_call_fndecl (stmt))
@@ -1421,6 +1427,7 @@ execute_cse_sincos (void)
 		      gimple_set_location (new_stmt, loc);
 		      unlink_stmt_vdef (stmt);
 		      gsi_replace (&gsi, new_stmt, true);
+		      cleanup_eh = true;
 		      if (gimple_vdef (stmt))
 			release_ssa_name (gimple_vdef (stmt));
 		    }
@@ -1443,6 +1450,7 @@ execute_cse_sincos (void)
 		      gimple_set_location (new_stmt, loc);
 		      unlink_stmt_vdef (stmt);
 		      gsi_replace (&gsi, new_stmt, true);
+		      cleanup_eh = true;
 		      if (gimple_vdef (stmt))
 			release_ssa_name (gimple_vdef (stmt));
 		    }
@@ -1460,6 +1468,7 @@ execute_cse_sincos (void)
 		      gimple_set_location (new_stmt, loc);
 		      unlink_stmt_vdef (stmt);
 		      gsi_replace (&gsi, new_stmt, true);
+		      cleanup_eh = true;
 		      if (gimple_vdef (stmt))
 			release_ssa_name (gimple_vdef (stmt));
 		    }
@@ -1469,6 +1478,8 @@ execute_cse_sincos (void)
 		}
 	    }
 	}
+      if (cleanup_eh)
+	cfg_changed |= gimple_purge_dead_eh_edges (bb);
     }
 
   statistics_counter_event (cfun, "sincos statements inserted",
-- 
GitLab