Store float for pow result test
authorAlexandre Oliva <oliva@adacore.com>
Tue, 1 Oct 2019 11:36:47 +0000 (11:36 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 1 Oct 2019 11:36:47 +0000 (11:36 +0000)
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.

for  gcc/testsuite/ChangeLog

* gcc.dg/torture/pr41094.c: Introduce intermediate variable.

From-SVN: r276404

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr41094.c

index 99230295d7cc36f602657e4b044eabd053a175a4..4f876e543eae7eb438bb126e5b228cf5284e6d7c 100644 (file)
@@ -1,5 +1,7 @@
 2019-10-01  Alexandre Oliva <oliva@adacore.com>
 
+       * gcc.dg/torture/pr41094.c: Introduce intermediate variable.
+
        PR debug/91507
        * gcc.dg/debug/dwarf2/array-0.c: New.
        * gcc.dg/debug/dwarf2/array-1.c: New.
index 2a4e9616cbfad648715c6b6ed902940d8299f979..9219a1741a37f6ed0422388ceb73d6160563607f 100644 (file)
@@ -13,7 +13,8 @@ double foo(void)
 
 int main()
 {
-  if (foo() != 2.0)
+  double r = foo ();
+  if (r != 2.0)
     abort ();
   return 0;
 }