aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-math-opts.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-08-25 10:47:50 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-08-25 10:47:50 +0000
commit90bc1cb81b70ba0635cc18d84d65230e68c8c48c (patch)
tree1dd13ec1e29c90431e4280a13f800819f82897e2 /gcc/tree-ssa-math-opts.c
parent9407f6bcfba46e815e8b5b2ea9e1be9cb8c4df79 (diff)
downloadgcc-90bc1cb81b70ba0635cc18d84d65230e68c8c48c.zip
gcc-90bc1cb81b70ba0635cc18d84d65230e68c8c48c.tar.gz
gcc-90bc1cb81b70ba0635cc18d84d65230e68c8c48c.tar.bz2
re PR middle-end/45393 (ICE in redirect_eh_edge_1, at tree-eh.c:2135)
2010-08-25 Richard Guenther <rguenther@suse.de> PR tree-optimization/45393 * tree-ssa-math-opts.c (execute_cse_sincos_1): Properly transfer and clean EH info. Avoid SSA update. (execute_cse_sincos): Cleanup the CFG if it has changed. * g++.dg/torture/pr45393.C: New testcase. From-SVN: r163541
Diffstat (limited to 'gcc/tree-ssa-math-opts.c')
-rw-r--r--gcc/tree-ssa-math-opts.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index bf37b77..a814f6f 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -641,7 +641,7 @@ maybe_record_sincos (VEC(gimple, heap) **stmts,
result of the cexpi call we insert before the use statement that
dominates all other candidates. */
-static void
+static bool
execute_cse_sincos_1 (tree name)
{
gimple_stmt_iterator gsi;
@@ -652,6 +652,7 @@ execute_cse_sincos_1 (tree name)
VEC(gimple, heap) *stmts = NULL;
basic_block top_bb = NULL;
int i;
+ bool cfg_changed = false;
type = TREE_TYPE (name);
FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, name)
@@ -683,16 +684,17 @@ execute_cse_sincos_1 (tree name)
if (seen_cos + seen_sin + seen_cexpi <= 1)
{
VEC_free(gimple, heap, stmts);
- return;
+ return false;
}
/* Simply insert cexpi at the beginning of top_bb but not earlier than
the name def statement. */
fndecl = mathfn_built_in (type, BUILT_IN_CEXPI);
if (!fndecl)
- return;
- res = make_rename_temp (TREE_TYPE (TREE_TYPE (fndecl)), "sincostmp");
+ return false;
+ res = create_tmp_reg (TREE_TYPE (TREE_TYPE (fndecl)), "sincostmp");
stmt = gimple_build_call (fndecl, 1, name);
+ res = make_ssa_name (res, stmt);
gimple_call_set_lhs (stmt, res);
def_stmt = SSA_NAME_DEF_STMT (name);
@@ -738,11 +740,14 @@ execute_cse_sincos_1 (tree name)
stmt = gimple_build_assign (gimple_call_lhs (use_stmt), rhs);
gsi = gsi_for_stmt (use_stmt);
- gsi_insert_after (&gsi, stmt, GSI_SAME_STMT);
- gsi_remove (&gsi, true);
+ gsi_replace (&gsi, stmt, true);
+ if (gimple_purge_dead_eh_edges (gimple_bb (stmt)))
+ cfg_changed = true;
}
VEC_free(gimple, heap, stmts);
+
+ return cfg_changed;
}
/* Go through all calls to sin, cos and cexpi and call execute_cse_sincos_1
@@ -752,6 +757,7 @@ static unsigned int
execute_cse_sincos (void)
{
basic_block bb;
+ bool cfg_changed = false;
calculate_dominance_info (CDI_DOMINATORS);
@@ -778,7 +784,7 @@ execute_cse_sincos (void)
CASE_FLT_FN (BUILT_IN_CEXPI):
arg = gimple_call_arg (stmt, 0);
if (TREE_CODE (arg) == SSA_NAME)
- execute_cse_sincos_1 (arg);
+ cfg_changed |= execute_cse_sincos_1 (arg);
break;
default:;
@@ -788,7 +794,7 @@ execute_cse_sincos (void)
}
free_dominance_info (CDI_DOMINATORS);
- return 0;
+ return cfg_changed ? TODO_cleanup_cfg : 0;
}
static bool