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 <ja...@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 <rguent...@suse.de> SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)