Commit a6edd18c by Barnaby Wilks Committed by Richard Biener

match.pd: Add flag_unsafe_math_optimizations check before deciding on the widest type in...

2019-09-09  Barnaby Wilks  <barnaby.wilks@arm.com>

	* match.pd: Add flag_unsafe_math_optimizations check
	before deciding on the widest type in a binary math operation.

	* gcc.dg/fold-binary-math-casts.c: New test.

From-SVN: r275518
parent f48ef52e
2019-09-09 Barnaby Wilks <barnaby.wilks@arm.com>
* match.pd: Add flag_unsafe_math_optimizations check
before deciding on the widest type in a binary math operation.
2019-09-09 Martin Liska <mliska@suse.cz> 2019-09-09 Martin Liska <mliska@suse.cz>
* config/i386/i386.opt: Update comment of removed * config/i386/i386.opt: Update comment of removed
......
...@@ -5040,10 +5040,18 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) ...@@ -5040,10 +5040,18 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
&& newtype == type && newtype == type
&& types_match (newtype, type)) && types_match (newtype, type))
(op (convert:newtype @1) (convert:newtype @2)) (op (convert:newtype @1) (convert:newtype @2))
(with { if (TYPE_PRECISION (ty1) > TYPE_PRECISION (newtype)) (with
{
if (!flag_unsafe_math_optimizations)
{
if (TYPE_PRECISION (ty1) > TYPE_PRECISION (newtype))
newtype = ty1; newtype = ty1;
if (TYPE_PRECISION (ty2) > TYPE_PRECISION (newtype)) if (TYPE_PRECISION (ty2) > TYPE_PRECISION (newtype))
newtype = ty2; } newtype = ty2;
}
}
/* Sometimes this transformation is safe (cannot /* Sometimes this transformation is safe (cannot
change results through affecting double rounding change results through affecting double rounding
cases) and sometimes it is not. If NEWTYPE is cases) and sometimes it is not. If NEWTYPE is
......
2019-09-09 Barnaby Wilks <barnaby.wilks@arm.com>
* gcc.dg/fold-binary-math-casts.c: New test.
2019-09-09 Jakub Jelinek <jakub@redhat.com> 2019-09-09 Jakub Jelinek <jakub@redhat.com>
PR target/87853 PR target/87853
......
/* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-optimized" } */
#include <math.h>
float
f (float x, float y)
{
double z = 1.0 / x;
return z * y;
}
float
g (float x, float y)
{
double a = 1.0 / x;
double b = 1.0 / y;
long double k = x*x*x*x*x*x;
return a + b - k;
}
float
h (float x)
{
double a = x * 2.0;
double b = a / 3.5f;
return a + b;
}
float
i (float y, float z)
{
return pow (y, 2.0) / (double) (y + z);
}
float
j (float x, float y)
{
double t = 4.0 * x;
double z = t + y;
return z;
}
float
k (float a)
{
return 1.0 / sqrtf (a);
}
float
l (float a)
{
return (double) a * (a / 2.0);
}
/* { dg-final { scan-tree-dump-not "\\(double\\)" "optimized" } } */
/* { dg-final { scan-tree-dump-not "\\(float\\)" "optimized" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment