I took the required steps. The patch is attached to this email, I hope I got it right this time. I did not forward the patch to gcc-patches the first time, sorry for the inconvenience.
Thank you for your attention, Vitor. in gcc/ChangeLog: 2020-01-28 Vitor Guidi <vitor.gu...@usp.br> * match.pd: New substitution rule for tanh(x)/sinh(x) -> 1.0/cosh(x). in gcc/testsuite/ChangeLog: 2020-01-28 Vitor Guidi <vitor.gu...@usp.br> *gcc.dg/tanhbysinh.c (new): New testcase. On Fri, Jan 31, 2020 at 8:18 AM Richard Biener <richard.guent...@gmail.com> wrote: > > On Fri, Jan 31, 2020 at 12:06 PM Marc Glisse <marc.gli...@inria.fr> wrote: > > > > On Thu, 30 Jan 2020, Vitor Guidi wrote: > > > > >> + /* Simplify tanh (x) / sinh (x) -> 1.0 / cosh (x). */ > > >> + (simplify > > >> + (rdiv (TANH @0) (SINH @0)) > > >> + (rdiv {build_one_cst (type);} (COSH @0))) > > > > The existing > > > > (simplify > > (rdiv (SINH:s @0) (COSH:s @0)) > > (TANH @0)) > > > > has :s (which AFAIK are ignored because the output is a single insn) but > > not this new one, where it would not be ignored. That's not very > > consistent. > > True. > > Richard. > > > > > -- > > Marc Glisse
diff --git a/gcc/match.pd b/gcc/match.pd index 5fee394e7af..7de106d5ae7 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5069,6 +5069,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (rdiv (SINH:s @0) (COSH:s @0)) (TANH @0)) + /* Simplify tanh (x) / sinh (x) -> 1.0 / cosh (x). */ + (simplify + (rdiv (TANH:s @0) (SINH:s @0)) + (rdiv {build_one_cst (type);} (COSH @0))) + /* Simplify cos(x) / sin(x) -> 1 / tan(x). */ (simplify (rdiv (COS:s @0) (SIN:s @0)) diff --git a/gcc/testsuite/gcc.dg/tanhbysinh.c b/gcc/testsuite/gcc.dg/tanhbysinh.c new file mode 100644 index 00000000000..fde72c2f93b --- /dev/null +++ b/gcc/testsuite/gcc.dg/tanhbysinh.c @@ -0,0 +1,40 @@ +/* { dg-do compile } */ +/* { dg-options "-Ofast -fdump-tree-optimized" } */ + +extern float sinhf (float); +extern float tanhf (float); +extern double sinh (double); +extern double tanh (double); +extern long double sinhl (long double); +extern long double tanhl (long double); + +double __attribute__ ((noinline)) +tanhbysinh_ (double x) +{ + return tanh (x) / sinh (x); +} + +float __attribute__ ((noinline)) +tanhbysinhf_ (float x) +{ + return tanhf (x) / sinhf (x); +} + +long double __attribute__ ((noinline)) +tanhbysinhl_ (long double x) +{ + return tanhl (x) / sinhl (x); +} + + +/* There must be no calls to sinh or atanh */ +/* There must be calls to cosh */ +/* {dg-final { scan-tree-dump-not "sinh " "optimized" } } */ +/* {dg-final { scan-tree-dump-not "tanh " "optimized" }} */ +/* {dg-final { scan-tree-dump-not "sinhf " "optimized" } } */ +/* {dg-final { scan-tree-dump-not "tanhf " "optimized" }} */ +/* {dg-final { scan-tree-dump-not "sinhl " "optimized" } } */ +/* {dg-final { scan-tree-dump-not "tanhl " "optimized" }} */ +/* { dg-final { scan-tree-dump "cosh " "optimized" } } */ +/* { dg-final { scan-tree-dump "coshf " "optimized" } } */ +/* { dg-final { scan-tree-dump "coshl " "optimized" } } */ \ No newline at end of file