diff options
author | Jennifer Schmitz <jschmitz@nvidia.com> | 2024-09-25 03:21:22 -0700 |
---|---|---|
committer | Jennifer Schmitz <jschmitz@nvidia.com> | 2024-10-11 16:56:37 +0200 |
commit | 4be7d2d340a013d01a47c43d2feb6826d1b67af0 (patch) | |
tree | cc320817624aa13bd9024e695fb915f5392bc54b /gcc/match.pd | |
parent | 00a87ee76f47d0fa5a10ef982101cb3c3b8e9c99 (diff) | |
download | gcc-4be7d2d340a013d01a47c43d2feb6826d1b67af0.zip gcc-4be7d2d340a013d01a47c43d2feb6826d1b67af0.tar.gz gcc-4be7d2d340a013d01a47c43d2feb6826d1b67af0.tar.bz2 |
match.pd: Fold logarithmic identities.
This patch implements 4 rules for logarithmic identities in match.pd
under -funsafe-math-optimizations:
1) logN(1.0/a) -> -logN(a). This avoids the division instruction.
2) logN(C/a) -> logN(C) - logN(a), where C is a real constant. Same as 1).
3) logN(a) + logN(b) -> logN(a*b). This reduces the number of calls to
log function.
4) logN(a) - logN(b) -> logN(a/b). Same as 4).
Tests were added for float, double, and long double.
The patch was bootstrapped and regtested on aarch64-linux-gnu and
x86_64-linux-gnu, no regression.
Additionally, SPEC 2017 fprate was run. While the transform does not seem
to be triggered, we also see no non-noise impact on performance.
OK for mainline?
Signed-off-by: Jennifer Schmitz <jschmitz@nvidia.com>
gcc/
PR tree-optimization/116826
PR tree-optimization/86710
* match.pd: Fold logN(1.0/a) -> -logN(a),
logN(C/a) -> logN(C) - logN(a), logN(a) + logN(b) -> logN(a*b),
and logN(a) - logN(b) -> logN(a/b).
gcc/testsuite/
PR tree-optimization/116826
PR tree-optimization/86710
* gcc.dg/tree-ssa/log_ident.c: New test.
Diffstat (limited to 'gcc/match.pd')
-rw-r--r-- | gcc/match.pd | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index 5ed1ea0..78084bb 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -8182,6 +8182,31 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (rdiv @0 (exps:s @1)) (mult @0 (exps (negate @1))))) + (if (! HONOR_SIGN_DEPENDENT_ROUNDING (type) + && ! HONOR_NANS (type) && ! HONOR_INFINITIES (type) + && ! flag_trapping_math + && ! flag_errno_math) + (for logs (LOG LOG2 LOG10) + /* Simplify logN(1.0/a) into -logN(a). */ + (simplify + (logs (rdiv:s real_onep@0 @1)) + (negate (logs @1))) + + /* Simplify logN(C/a) into logN(C)-logN(a). */ + (simplify + (logs (rdiv:s REAL_CST@0 @1)) + (minus (logs! @0) (logs @1))) + + /* Simplify logN(a)+logN(b) into logN(a*b). */ + (simplify + (plus (logs:s @0) (logs:s @1)) + (logs (mult @0 @1))) + + /* Simplify logN(a)-logN(b) into logN(a/b). */ + (simplify + (minus (logs:s @0) (logs:s @1)) + (logs (rdiv @0 @1))))) + (for logs (LOG LOG2 LOG10 LOG10) exps (EXP EXP2 EXP10 POW10) /* logN(expN(x)) -> x. */ |