> Am 05.02.2022 um 00:08 schrieb Jakub Jelinek via Gcc-patches > <gcc-patches@gcc.gnu.org>: > > Hi! > > The recent PR95115 change to punt in const_binop on folding operation > with non-NaN operands into NaN if flag_trapping_math broke the following > testcase, because the x * 0.0 simplification punts just if > x maybe a NaN (because NaN * 0.0 is NaN not 0.0) or if one of the operands > could be negative zero. But Inf * 0.0 or -Inf * 0.0 is also NaN, not > 0.0, so when NaNs are honored we need to punt for possible infinities too. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk > and 11/10 where the PR95115 change has been unfortunately backported to > as well? Ok > 2022-02-04 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/104389 > (x * 0 -> 0): Punt if x maybe infinite and NaNs are honored. > > * gcc.dg/pr104389.c: New test. > > --- gcc/match.pd.jj 2022-02-04 14:36:55.393599880 +0100 > +++ gcc/match.pd 2022-02-04 20:30:48.548213594 +0100 > @@ -256,10 +256,12 @@ (define_operator_list SYNC_FETCH_AND_AND > /* Maybe fold x * 0 to 0. The expressions aren't the same > when x is NaN, since x * 0 is also NaN. Nor are they the > same in modes with signed zeros, since multiplying a > - negative value by 0 gives -0, not +0. */ > + negative value by 0 gives -0, not +0. Nor when x is +-Inf, > + since x * 0 is NaN. */ > (simplify > (mult @0 real_zerop@1) > (if (!tree_expr_maybe_nan_p (@0) > + && (!HONOR_NANS (type) || !tree_expr_maybe_infinite_p (@0)) > && !tree_expr_maybe_real_minus_zero_p (@0) > && !tree_expr_maybe_real_minus_zero_p (@1)) > @1)) > --- gcc/testsuite/gcc.dg/pr104389.c.jj 2022-02-04 20:37:40.579537142 +0100 > +++ gcc/testsuite/gcc.dg/pr104389.c 2022-02-04 20:37:20.787809803 +0100 > @@ -0,0 +1,26 @@ > +/* PR tree-optimization/104389 */ > +/* { dg-do run } */ > +/* { dg-options "-O2" } */ > +/* { dg-add-options ieee } */ > +/* { dg-require-effective-target inf } */ > + > +__attribute__((noipa)) double > +foo (void) > +{ > + double a = __builtin_huge_val (); > + return a * 0.0; > +} > + > +__attribute__((noipa)) long double > +bar (void) > +{ > + return __builtin_huge_vall () * 0.0L; > +} > + > +int > +main () > +{ > + if (!__builtin_isnan (foo ()) || !__builtin_isnanl (bar ())) > + __builtin_abort (); > + return 0; > +} > > Jakub >
Re: [PATCH] match.pd: Fix x * 0.0 -> 0.0 folding [PR104389]
Richard Biener via Gcc-patches Fri, 04 Feb 2022 23:21:39 -0800
- [PATCH] match.pd: Fix x * 0.0 -> 0.0 fol... Jakub Jelinek via Gcc-patches
- Re: [PATCH] match.pd: Fix x * 0.0 ->... Richard Biener via Gcc-patches
- Re: [PATCH] match.pd: Fix x * 0.0 ... Xi Ruoyao via Gcc-patches
- Re: [PATCH] match.pd: Fix x * ... Richard Biener via Gcc-patches
- Re: [PATCH] match.pd: Fix x * 0.0 ... Jakub Jelinek via Gcc-patches