[PATCH] Fix recip opt ICEs with -fnon-call-exceptions (PR tree-optimization/90090)
Richard Biener
rguenther@suse.de
Tue Apr 16 07:52:00 GMT 2019
On Tue, 16 Apr 2019, Jakub Jelinek wrote:
> Hi!
>
> While we in theory could move over the EH stuff from the division
> instructions to the multiplication ones (right now we do not do even that),
> we would need to add EH even to the divisions added by insert_reciprocals.
>
> The following patch just punts on divisions that can throw internally,
> bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
Richard.
> If it affects some important -fnon-call-exceptions codebase and anyone is
> interested in handling it differently, it can be always reverted and handled
> properly.
>
> 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.
>
> * g++.dg/opt/pr90090.C: New test.
>
> --- gcc/tree-ssa-math-opts.c.jj 2019-04-08 10:11:28.620219138 +0200
> +++ gcc/tree-ssa-math-opts.c 2019-04-15 09:42:22.173868303 +0200
> @@ -334,7 +334,8 @@ is_division_by (gimple *use_stmt, tree d
> /* 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,
> {
> 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;
> }
> --- gcc/testsuite/g++.dg/opt/pr90090.C.jj 2019-04-15 10:34:58.151821097 +0200
> +++ gcc/testsuite/g++.dg/opt/pr90090.C 2019-04-15 10:36:12.856620867 +0200
> @@ -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 ();
> + }
> +}
>
> Jakub
>
--
Richard Biener <rguenther@suse.de>
SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany;
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG NÌrnberg)
More information about the Gcc-patches
mailing list