optimize tanh(x) / sinh (x) to 1/ cosh (x)

gcc/
	* match.pd (tanh/sinh -> 1/cosh): New simplification.

gcc/testsuite

	* gcc.dg/tanhbysinh.c: New testcase.
This commit is contained in:
Vitor Guidi 2020-06-03 17:01:21 -06:00 committed by Jeff Law
parent 817738fdf1
commit 29e304fd5f
2 changed files with 45 additions and 0 deletions

View File

@ -5229,6 +5229,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))

View File

@ -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" } } */