From 41b5808d56c2f4c98cf783b13d97b775f59f123c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 16 Apr 2019 10:24:47 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr90090.C | 19 +++++++++++++++++++ gcc/tree-ssa-math-opts.c | 10 +++++----- 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr90090.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 393e1761752..7e1e60ca86e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-04-16 Jakub Jelinek + + 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 PR tree-optimization/56049 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f89fba152e..d2e07721f6e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-16 Jakub Jelinek + + PR tree-optimization/90090 + * g++.dg/opt/pr90090.C: New test. + 2019-04-16 Richard Biener 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 00000000000..f60a888733f --- /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 1496520c9dc..b7bbde4e402 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; }