summaryrefslogtreecommitdiff
path: root/gcc/convert.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-02-09 09:35:22 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-02-09 09:35:22 +0000
commitf060a26123884c98f69ced61aea93dea895ea9eb (patch)
treeaa6c40c6717271081bdecfd2d7b64a4176ecbf76 /gcc/convert.c
parent4a50cd932f916c04bbe508acaf0344962266ebf6 (diff)
downloadgcc-f060a26123884c98f69ced61aea93dea895ea9eb.tar.gz
re PR tree-optimization/35202 (exp->expf transformation incorrect with -fmath-errno)
2009-02-09 Richard Guenther <rguenther@suse.de> PR middle-end/35202 * convert.c (convert_to_real): Disable (float)fn((double)x) to fnf(x) conversion if errno differences may occur and -fmath-errno is set. From-SVN: r144030
Diffstat (limited to 'gcc/convert.c')
-rw-r--r--gcc/convert.c47
1 files changed, 26 insertions, 21 deletions
diff --git a/gcc/convert.c b/gcc/convert.c
index 77907bafcb5..278305d8fdb 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -139,40 +139,45 @@ convert_to_real (tree type, tree expr)
switch (fcode)
{
#define CASE_MATHFN(FN) case BUILT_IN_##FN: case BUILT_IN_##FN##L:
- CASE_MATHFN (ACOS)
- CASE_MATHFN (ACOSH)
- CASE_MATHFN (ASIN)
- CASE_MATHFN (ASINH)
- CASE_MATHFN (ATAN)
- CASE_MATHFN (ATANH)
- CASE_MATHFN (CBRT)
- CASE_MATHFN (COS)
CASE_MATHFN (COSH)
- CASE_MATHFN (ERF)
- CASE_MATHFN (ERFC)
CASE_MATHFN (EXP)
CASE_MATHFN (EXP10)
CASE_MATHFN (EXP2)
- CASE_MATHFN (EXPM1)
- CASE_MATHFN (FABS)
+ CASE_MATHFN (EXPM1)
CASE_MATHFN (GAMMA)
CASE_MATHFN (J0)
CASE_MATHFN (J1)
CASE_MATHFN (LGAMMA)
- CASE_MATHFN (LOG)
- CASE_MATHFN (LOG10)
- CASE_MATHFN (LOG1P)
- CASE_MATHFN (LOG2)
- CASE_MATHFN (LOGB)
CASE_MATHFN (POW10)
- CASE_MATHFN (SIN)
CASE_MATHFN (SINH)
- CASE_MATHFN (SQRT)
- CASE_MATHFN (TAN)
- CASE_MATHFN (TANH)
CASE_MATHFN (TGAMMA)
CASE_MATHFN (Y0)
CASE_MATHFN (Y1)
+ /* The above functions may set errno differently with float
+ input or output so this transformation is not safe with
+ -fmath-errno. */
+ if (flag_errno_math)
+ break;
+ CASE_MATHFN (ACOS)
+ CASE_MATHFN (ACOSH)
+ CASE_MATHFN (ASIN)
+ CASE_MATHFN (ASINH)
+ CASE_MATHFN (ATAN)
+ CASE_MATHFN (ATANH)
+ CASE_MATHFN (CBRT)
+ CASE_MATHFN (COS)
+ CASE_MATHFN (ERF)
+ CASE_MATHFN (ERFC)
+ CASE_MATHFN (FABS)
+ CASE_MATHFN (LOG)
+ CASE_MATHFN (LOG10)
+ CASE_MATHFN (LOG2)
+ CASE_MATHFN (LOG1P)
+ CASE_MATHFN (LOGB)
+ CASE_MATHFN (SIN)
+ CASE_MATHFN (SQRT)
+ CASE_MATHFN (TAN)
+ CASE_MATHFN (TANH)
#undef CASE_MATHFN
{
tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));