diff options
author | Richard Biener <rguenther@suse.de> | 2022-04-12 10:07:10 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-04-12 11:50:16 +0200 |
commit | 28ef9276654856b53ba45f0082e6579c365e2962 (patch) | |
tree | 007c4ead50efa37dd0f0de792df4a7b517ae7054 | |
parent | 008d568ac7eba4057172c52d306e09d174041c59 (diff) | |
download | gcc-28ef9276654856b53ba45f0082e6579c365e2962.zip gcc-28ef9276654856b53ba45f0082e6579c365e2962.tar.gz gcc-28ef9276654856b53ba45f0082e6579c365e2962.tar.bz2 |
tree-optimization/105235 - clean EH in execute_cse_conv_1
When a FP conversion is removed we have to eventually clean EH.
2022-04-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/105235
* tree-ssa-math-opts.c (execute_cse_conv_1): Clean EH and
return whether the CFG changed.
(execute_cse_sincos_1): Adjust.
* g++.dg/opt/pr105235-1.C: New testcase.
(cherry picked from commit 31cccadcf2d3cc8acb7a5f36ed57ca847f7ea0ea)
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr105235-1.C | 12 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 15 |
2 files changed, 21 insertions, 6 deletions
diff --git a/gcc/testsuite/g++.dg/opt/pr105235-1.C b/gcc/testsuite/g++.dg/opt/pr105235-1.C new file mode 100644 index 0000000..b74d203 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr105235-1.C @@ -0,0 +1,12 @@ +// PR tree-optimization/105235 +// { dg-do compile } +// { dg-options "-O -fno-tree-dominator-opts -fexceptions -fnon-call-exceptions -fno-tree-fre" } + +struct S { ~S (); }; + +double +foo (double d) +{ + S s; + return __builtin_ilogbl (d) + __builtin_sinl (d); +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index c4a6492..94f9cc4 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -1110,7 +1110,7 @@ make_pass_cse_reciprocals (gcc::context *ctxt) conversions. Return the prevailing name. */ static tree -execute_cse_conv_1 (tree name) +execute_cse_conv_1 (tree name, bool *cfg_changed) { if (SSA_NAME_IS_DEFAULT_DEF (name) || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name)) @@ -1186,15 +1186,18 @@ execute_cse_conv_1 (tree name) || !types_compatible_p (TREE_TYPE (name), TREE_TYPE (lhs))) continue; - if (gimple_bb (def_stmt) == gimple_bb (use_stmt) - || dominated_by_p (CDI_DOMINATORS, gimple_bb (use_stmt), - gimple_bb (def_stmt))) + basic_block use_bb = gimple_bb (use_stmt); + if (gimple_bb (def_stmt) == use_bb + || dominated_by_p (CDI_DOMINATORS, use_bb, gimple_bb (def_stmt))) { sincos_stats.conv_removed++; gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt); replace_uses_by (lhs, name); - gsi_remove (&gsi, true); + if (gsi_remove (&gsi, true) + && gimple_purge_dead_eh_edges (use_bb)) + *cfg_changed = true; + release_defs (use_stmt); } } @@ -1249,7 +1252,7 @@ execute_cse_sincos_1 (tree name) int i; bool cfg_changed = false; - name = execute_cse_conv_1 (name); + name = execute_cse_conv_1 (name, &cfg_changed); FOR_EACH_IMM_USE_STMT (use_stmt, use_iter, name) { |