Message ID | ory2y4kfng.fsf@lxoliva.fsfla.org |
---|---|
State | New |
Headers | show |
Series | Store float for pow result test | expand |
On Tue, Oct 1, 2019 at 10:56 AM Alexandre Oliva <oliva@adacore.com> wrote: > > Optimizing gcc.dg/torture/pr41094.c, the compiler computes the > constant value and short-circuits the whole thing. At -O0, however, > on 32-bit x86, the call to pow() remains, and the program compares the > returned value in a stack register, with excess precision, with the > exact return value expected from pow(). If libm's pow() returns a > slightly off result, the compare fails. If the value in the register > is stored in a separate variable, so it gets rounded to double > precision, and then compared, the compare passes. > > It's not clear that the test was meant to detect libm's reliance on > rounding off the excess precision, but I guess it wasn't, so I propose > this slight change that enables it to pass regardless of the slight > inaccuracy of the C library in use. > > Regstrapped on x86_64-linux-gnu, and tested on the affected target. > Ok to install? OK. Richard. > > for gcc/testsuite/ChangeLog > > * gcc.dg/torture/pr41094.c: Introduce intermediate variable. > --- > gcc/testsuite/gcc.dg/torture/pr41094.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/gcc/testsuite/gcc.dg/torture/pr41094.c b/gcc/testsuite/gcc.dg/torture/pr41094.c > index 2a4e9616cbfad..9219a1741a37f 100644 > --- a/gcc/testsuite/gcc.dg/torture/pr41094.c > +++ b/gcc/testsuite/gcc.dg/torture/pr41094.c > @@ -13,7 +13,8 @@ double foo(void) > > int main() > { > - if (foo() != 2.0) > + double r = foo (); > + if (r != 2.0) > abort (); > return 0; > } > > -- > Alexandre Oliva, freedom fighter he/him https://FSFLA.org/blogs/lxo > Be the change, be Free! FSF VP & FSF Latin America board member > GNU Toolchain Engineer Free Software Evangelist > Hay que enGNUrecerse, pero sin perder la terGNUra jamás - Che GNUevara
diff --git a/gcc/testsuite/gcc.dg/torture/pr41094.c b/gcc/testsuite/gcc.dg/torture/pr41094.c index 2a4e9616cbfad..9219a1741a37f 100644 --- a/gcc/testsuite/gcc.dg/torture/pr41094.c +++ b/gcc/testsuite/gcc.dg/torture/pr41094.c @@ -13,7 +13,8 @@ double foo(void) int main() { - if (foo() != 2.0) + double r = foo (); + if (r != 2.0) abort (); return 0; }