diff mbox

Remove undefined behaviour from builtins-20.c

Message ID 87lhb4i82z.fsf@e105548-lin.cambridge.arm.com
State New
Headers show

Commit Message

Richard Sandiford Oct. 15, 2015, 1:18 p.m. UTC
builtins-20.c had:

  if (cos((y*=2, -fabs(tan(x/-y)))) != cos((y*=2,tan(x/y))))
    link_error ();

which is undefined behaviour.  The test expected that y had the same
value in x/y and x/-y, but gimplification actually implements the
"obvious" interpretation, multiplying y by 2, using it for one cos call,
then multiplying it by 2 again and using it for the other cos call.

The file has other (valid) tests that side-effects don't block
optimisation, such as:

  if (cosf((y*=3, -x)) != cosf((y*=3,x)))
    link_error ();

so this patch simply removes this instance.

Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.
OK to install?

Thanks,
Richard


gcc/testsuite/
	* gcc.dg/builtins-20.c: Remove undefined behavior.

Comments

Richard Biener Oct. 16, 2015, 8:36 a.m. UTC | #1
On Thu, Oct 15, 2015 at 3:18 PM, Richard Sandiford
<richard.sandiford@arm.com> wrote:
> builtins-20.c had:
>
>   if (cos((y*=2, -fabs(tan(x/-y)))) != cos((y*=2,tan(x/y))))
>     link_error ();
>
> which is undefined behaviour.  The test expected that y had the same
> value in x/y and x/-y, but gimplification actually implements the
> "obvious" interpretation, multiplying y by 2, using it for one cos call,
> then multiplying it by 2 again and using it for the other cos call.
>
> The file has other (valid) tests that side-effects don't block
> optimisation, such as:
>
>   if (cosf((y*=3, -x)) != cosf((y*=3,x)))
>     link_error ();
>
> so this patch simply removes this instance.
>
> Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.
> OK to install?

Ok.

Thanks,
Richard.

> Thanks,
> Richard
>
>
> gcc/testsuite/
>         * gcc.dg/builtins-20.c: Remove undefined behavior.
>
> diff --git a/gcc/testsuite/gcc.dg/builtins-20.c b/gcc/testsuite/gcc.dg/builtins-20.c
> index 43aa71b..2b63428 100644
> --- a/gcc/testsuite/gcc.dg/builtins-20.c
> +++ b/gcc/testsuite/gcc.dg/builtins-20.c
> @@ -122,7 +122,7 @@ void test2(double x, double y)
>    if (cos((y*=3, -x)) != cos((y*=3,x)))
>      link_error ();
>
> -  if (cos((y*=2, -fabs(tan(x/-y)))) != cos((y*=2,tan(x/y))))
> +  if (cos(-fabs(tan(x/-y))) != cos(tan(x/y)))
>      link_error ();
>
>    if (cos(copysign(x,y)) != cos(x))
> @@ -350,7 +350,7 @@ void test2f(float x, float y)
>    if (cosf((y*=3, -x)) != cosf((y*=3,x)))
>      link_error ();
>
> -  if (cosf((y*=2, -fabsf(tanf(x/-y)))) != cosf((y*=2,tanf(x/y))))
> +  if (cosf(-fabsf(tanf(x/-y))) != cosf(tanf(x/y)))
>      link_error ();
>
>    if (cosf(copysignf(x,y)) != cosf(x))
> @@ -577,7 +577,7 @@ void test2l(long double x, long double y)
>    if (cosl((y*=3, -x)) != cosl((y*=3,x)))
>      link_error ();
>
> -  if (cosl((y*=2, -fabsl(tanl(x/-y)))) != cosl((y*=2,tanl(x/y))))
> +  if (cosl(-fabsl(tanl(x/-y))) != cosl(tanl(x/y)))
>      link_error ();
>
>    if (cosl(copysignl(x,y)) != cosl(x))
>
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/builtins-20.c b/gcc/testsuite/gcc.dg/builtins-20.c
index 43aa71b..2b63428 100644
--- a/gcc/testsuite/gcc.dg/builtins-20.c
+++ b/gcc/testsuite/gcc.dg/builtins-20.c
@@ -122,7 +122,7 @@  void test2(double x, double y)
   if (cos((y*=3, -x)) != cos((y*=3,x)))
     link_error ();
 
-  if (cos((y*=2, -fabs(tan(x/-y)))) != cos((y*=2,tan(x/y))))
+  if (cos(-fabs(tan(x/-y))) != cos(tan(x/y)))
     link_error ();
 
   if (cos(copysign(x,y)) != cos(x))
@@ -350,7 +350,7 @@  void test2f(float x, float y)
   if (cosf((y*=3, -x)) != cosf((y*=3,x)))
     link_error ();
 
-  if (cosf((y*=2, -fabsf(tanf(x/-y)))) != cosf((y*=2,tanf(x/y))))
+  if (cosf(-fabsf(tanf(x/-y))) != cosf(tanf(x/y)))
     link_error ();
 
   if (cosf(copysignf(x,y)) != cosf(x))
@@ -577,7 +577,7 @@  void test2l(long double x, long double y)
   if (cosl((y*=3, -x)) != cosl((y*=3,x)))
     link_error ();
 
-  if (cosl((y*=2, -fabsl(tanl(x/-y)))) != cosl((y*=2,tanl(x/y))))
+  if (cosl(-fabsl(tanl(x/-y))) != cosl(tanl(x/y)))
     link_error ();
 
   if (cosl(copysignl(x,y)) != cosl(x))