Commit 41b5808d by Jakub Jelinek Committed by Jakub Jelinek

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
parent 8c996ec6
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> 2019-04-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/56049 PR tree-optimization/56049
......
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> 2019-04-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/56049 PR tree-optimization/56049
......
// 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 ();
}
}
...@@ -334,7 +334,8 @@ is_division_by (gimple *use_stmt, tree def) ...@@ -334,7 +334,8 @@ is_division_by (gimple *use_stmt, tree def)
/* Do not recognize x / x as valid division, as we are getting /* Do not recognize x / x as valid division, as we are getting
confused later by replacing all immediate uses x in such confused later by replacing all immediate uses x in such
a stmt. */ 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. */ /* Return TRUE if USE_STMT is a multiplication of DEF by A. */
...@@ -367,14 +368,13 @@ is_division_by_square (gimple *use_stmt, tree def) ...@@ -367,14 +368,13 @@ is_division_by_square (gimple *use_stmt, tree def)
{ {
if (gimple_code (use_stmt) == GIMPLE_ASSIGN if (gimple_code (use_stmt) == GIMPLE_ASSIGN
&& gimple_assign_rhs_code (use_stmt) == RDIV_EXPR && 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); tree denominator = gimple_assign_rhs2 (use_stmt);
if (TREE_CODE (denominator) == SSA_NAME) 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; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment