diff options
| author | Uros Bizjak <uros@kss-loka.si> | 2006-10-21 22:05:35 +0200 |
|---|---|---|
| committer | Uros Bizjak <uros@gcc.gnu.org> | 2006-10-21 22:05:35 +0200 |
| commit | 495ed96c2a50e2ff9ce7b056ca6aea822090ed28 (patch) | |
| tree | 0b1857927bfdd0fd605f71bf64a94a534bc8cac2 /gcc/builtins.c | |
| parent | 0bfa1541fa2bc1b422babce2a6c272de36ecdad5 (diff) | |
| download | gcc-495ed96c2a50e2ff9ce7b056ca6aea822090ed28.zip gcc-495ed96c2a50e2ff9ce7b056ca6aea822090ed28.tar.gz gcc-495ed96c2a50e2ff9ce7b056ca6aea822090ed28.tar.bz2 | |
re PR middle-end/28252 (pow(x,1/3.0) should be converted to cbrt(x))
2006-10-21 Uros Bizjak <uros@kss-loka.si>
PR middle-end/28252
* builtins.c (fold_builtin): Fold pow(x,1.0/3.0) as cbrt(x) if
flag_unsafe_math_optimizations is set.
testsuite/ChangeLog:
PR middle-end/28252
* gcc.dg/builtins-8.c: Also check pow(x,1.0/3.0) to cbrt(x)
transformation.
From-SVN: r117937
Diffstat (limited to 'gcc/builtins.c')
| -rw-r--r-- | gcc/builtins.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index c1996dc..ecee42b 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7775,6 +7775,23 @@ fold_builtin_pow (tree fndecl, tree arglist, tree type) } } + /* Optimize pow(x,1.0/3.0) = cbrt(x). */ + if (flag_unsafe_math_optimizations) + { + const REAL_VALUE_TYPE dconstroot + = real_value_truncate (TYPE_MODE (type), dconstthird); + + if (REAL_VALUES_EQUAL (c, dconstroot)) + { + tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT); + if (cbrtfn != NULL_TREE) + { + tree arglist = build_tree_list (NULL_TREE, arg0); + return build_function_call_expr (cbrtfn, arglist); + } + } + } + /* Check for an integer exponent. */ n = real_to_integer (&c); real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0); |
