This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH v2] Simplify pow with constant
This patch simplifies pow (C, x) into exp (x * C1) if C > 0, C1 = log (C).
Do this only for fast-math as accuracy is reduced. This is much faster
since pow is more complex than exp - with current GLIBC the speedup is
more than 7 times for this transformation.
The worst-case ULP error of the transformation for powf (10.0, x) in SPEC
was 2.5. If we allow use of exp10 in match.pd, the ULP error would be lower.
OK for commit?
ChangeLog:
2017-08-17 Wilco Dijkstra <wdijkstr@arm.com>
* match.pd: Add pow (C, x) simplification.
--
diff --git a/gcc/match.pd b/gcc/match.pd
index 0e36f46b914bc63c257cef47152ab1aa507963e5..a614917c8c9f24bba20c521e9b5f558be4886813 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -3622,6 +3622,15 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(logs (pows @0 @1))
(mult @1 (logs @0))))
+ /* pow(C,x) -> exp(log(C)*x) if C > 0. */
+ (for pows (POW)
+ exps (EXP)
+ logs (LOG)
+ (simplify
+ (pows REAL_CST@0 @1)
+ (if (real_compare (GT_EXPR, TREE_REAL_CST_PTR (@0), &dconst0))
+ (exps (mult (logs @0) @1)))))
+
(for sqrts (SQRT)
cbrts (CBRT)
pows (POW)