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

Reply via email to