aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-04-16 10:24:47 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-04-16 10:24:47 +0200
commit41b5808d56c2f4c98cf783b13d97b775f59f123c (patch)
tree212872291e47b07d629097936e07b6e9f7822816 /gcc
parent8c996ec644d4dfa8d067f822ba63b3e4a3a17ef8 (diff)
downloadgcc-41b5808d56c2f4c98cf783b13d97b775f59f123c.zip
gcc-41b5808d56c2f4c98cf783b13d97b775f59f123c.tar.gz
gcc-41b5808d56c2f4c98cf783b13d97b775f59f123c.tar.bz2
re PR tree-optimization/90090 (ICE in mark_reachable_handlers, at tree-eh.c:3938 since r219202)
PR tree-optimization/90090 * tree-ssa-math-opts.c (is_division_by): Ignore divisions that can throw internally. (is_division_by_square): Likewise. Formatting fix. * g++.dg/opt/pr90090.C: New test. From-SVN: r270379
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr90090.C19
-rw-r--r--gcc/tree-ssa-math-opts.c10
4 files changed, 36 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 393e176..7e1e60c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2019-04-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/90090
+ * tree-ssa-math-opts.c (is_division_by): Ignore divisions that can
+ throw internally.
+ (is_division_by_square): Likewise. Formatting fix.
+
2019-04-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/56049
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9f89fba..d2e0772 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-04-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/90090
+ * g++.dg/opt/pr90090.C: New test.
+
2019-04-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/56049
diff --git a/gcc/testsuite/g++.dg/opt/pr90090.C b/gcc/testsuite/g++.dg/opt/pr90090.C
new file mode 100644
index 0000000..f60a888
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr90090.C
@@ -0,0 +1,19 @@
+// PR tree-optimization/90090
+// { dg-do compile }
+// { dg-options "-Ofast -fno-associative-math -fsignaling-nans -fno-tree-dce -fnon-call-exceptions" }
+
+double bar (double, double, double, double, double);
+double baz ();
+
+double
+foo (double a)
+{
+ try
+ {
+ return bar (1.0/a, 2.0/a, 4.0/a, 8.0/a, 16.0/a);
+ }
+ catch (...)
+ {
+ return baz ();
+ }
+}
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index 1496520..b7bbde4 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -334,7 +334,8 @@ is_division_by (gimple *use_stmt, tree def)
/* Do not recognize x / x as valid division, as we are getting
confused later by replacing all immediate uses x in such
a stmt. */
- && gimple_assign_rhs1 (use_stmt) != def;
+ && gimple_assign_rhs1 (use_stmt) != def
+ && !stmt_can_throw_internal (cfun, use_stmt);
}
/* Return TRUE if USE_STMT is a multiplication of DEF by A. */
@@ -367,13 +368,12 @@ is_division_by_square (gimple *use_stmt, tree def)
{
if (gimple_code (use_stmt) == GIMPLE_ASSIGN
&& gimple_assign_rhs_code (use_stmt) == RDIV_EXPR
- && gimple_assign_rhs1 (use_stmt) != gimple_assign_rhs2 (use_stmt))
+ && gimple_assign_rhs1 (use_stmt) != gimple_assign_rhs2 (use_stmt)
+ && !stmt_can_throw_internal (cfun, use_stmt))
{
tree denominator = gimple_assign_rhs2 (use_stmt);
if (TREE_CODE (denominator) == SSA_NAME)
- {
- return is_square_of (SSA_NAME_DEF_STMT (denominator), def);
- }
+ return is_square_of (SSA_NAME_DEF_STMT (denominator), def);
}
return 0;
}