2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-29 17:31:10 +08:00

match.pd (sinh (atanh (x))): New simplification rules.

* match.pd (sinh (atanh (x))): New simplification rules.
	(cosh (atanh (x))): Likewise.

	* gcc.dg/sinhatanh-1.c: New test.
	* gcc.dg/sinhatanh-2.c: New test.
	* gcc.dg/sinhatanh-3.c: New test.

From-SVN: r266625
This commit is contained in:
Giuliano Belinassi 2018-11-29 15:32:30 +00:00 committed by Jeff Law
parent 355c62ce02
commit 4aff6d1744
6 changed files with 222 additions and 0 deletions

@ -1,3 +1,8 @@
2018-11-29 Giuliano Belinassi <giuliano.belinassi@usp.br>
* match.pd (sinh (atanh (x))): New simplification rules.
(cosh (atanh (x))): Likewise.
2018-11-29 Jakub Jelinek <jakub@redhat.com>
PR target/54700

@ -4370,6 +4370,25 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(rdiv { t_one; } (sqrts (plus (mult @0 @0) { t_one; })))
(copysigns { t_zero; } @0))))))
(if (!flag_errno_math)
/* Simplify sinh(atanh(x)) -> x / sqrt((1 - x)*(1 + x)). */
(for sinhs (SINH)
atanhs (ATANH)
sqrts (SQRT)
(simplify
(sinhs (atanhs:s @0))
(with { tree t_one = build_one_cst (type); }
(rdiv @0 (sqrts (mult (minus { t_one; } @0) (plus { t_one; } @0)))))))
/* Simplify cosh(atanh(x)) -> 1 / sqrt((1 - x)*(1 + x)) */
(for coshs (COSH)
atanhs (ATANH)
sqrts (SQRT)
(simplify
(coshs (atanhs:s @0))
(with { tree t_one = build_one_cst (type); }
(rdiv { t_one; } (sqrts (mult (minus { t_one; } @0) (plus { t_one; } @0))))))))
/* cabs(x+0i) or cabs(0+xi) -> abs(x). */
(simplify
(CABS (complex:C @0 real_zerop@1))

@ -1,3 +1,9 @@
2018-11-29 Giuliano Belinassi <giuliano.belinassi@usp.br>
* gcc.dg/sinhatanh-1.c: New test.
* gcc.dg/sinhatanh-2.c: New test.
* gcc.dg/sinhatanh-3.c: New test.
2018-11-29 Jakub Jelinek <jakub@redhat.com>
PR target/54700

@ -0,0 +1,62 @@
/* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-optimized" } */
extern float sinhf (float);
extern float coshf (float);
extern float atanhf (float);
extern float sqrtf (float);
extern double sinh (double);
extern double cosh (double);
extern double atanh (double);
extern double sqrt (double);
extern long double sinhl (long double);
extern long double coshl (long double);
extern long double atanhl (long double);
extern long double sqrtl (long double);
double __attribute__ ((noinline))
sinhatanh_ (double x)
{
return sinh (atanh (x));
}
double __attribute__ ((noinline))
coshatanh_ (double x)
{
return cosh (atanh (x));
}
float __attribute__ ((noinline))
sinhatanhf_(float x)
{
return sinhf (atanhf (x));
}
float __attribute__ ((noinline))
coshatanhf_(float x)
{
return coshf (atanhf (x));
}
long double __attribute__ ((noinline))
sinhatanhl_ (long double x)
{
return sinhl (atanhl (x));
}
long double __attribute__ ((noinline))
coshatanhl_ (long double x)
{
return coshl (atanhl (x));
}
/* There must be no calls to sinh, cosh, or atanh */
/* {dg-final { scan-tree-dump-not "sinh " "optimized" } } */
/* {dg-final { scan-tree-dump-not "cosh " "optimized" } } */
/* {dg-final { scan-tree-dump-not "atanh " "optimized" }} */
/* {dg-final { scan-tree-dump-not "sinfh " "optimized" } } */
/* {dg-final { scan-tree-dump-not "cosfh " "optimized" } } */
/* {dg-final { scan-tree-dump-not "atanfh " "optimized" }} */
/* {dg-final { scan-tree-dump-not "sinlh " "optimized" } } */
/* {dg-final { scan-tree-dump-not "coslh " "optimized" } } */
/* {dg-final { scan-tree-dump-not "atanlh " "optimized" }} */

@ -0,0 +1,68 @@
/* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-optimized" } */
extern float sinhf (float);
extern float coshf (float);
extern float atanhf (float);
extern float sqrtf (float);
extern double sinh (double);
extern double cosh (double);
extern double atanh (double);
extern double sqrt (double);
extern long double sinhl (long double);
extern long double coshl (long double);
extern long double atanhl (long double);
extern long double sqrtl (long double);
float __attribute__ ((noinline))
coshatanhf_(float x)
{
float atg = atanhf(x);
return coshf(atg) + atg;
}
double __attribute__ ((noinline))
cosatan_(double x)
{
double atg = atanh(x);
return cosh(atg) + atg;
}
long double __attribute__ ((noinline))
cosatanl_(long double x)
{
long double atg = atanhl(x);
return coshl(atg) + atg;
}
float __attribute__ ((noinline))
sinatanf_(float x)
{
float atg = atanhf(x);
return sinhf(atg) + atg;
}
double __attribute__ ((noinline))
sinatan_(double x)
{
double atg = atanh(x);
return sinh(atg) + atg;
}
long double __attribute__ ((noinline))
sinatanl_(long double x)
{
long double atg = atanhl(x);
return sinhl(atg) + atg;
}
/* There should be calls to sinh, cosh and atanh */
/* { dg-final { scan-tree-dump "cosh " "optimized" } } */
/* { dg-final { scan-tree-dump "sinh " "optimized" } } */
/* { dg-final { scan-tree-dump "atanh " "optimized" } } */
/* { dg-final { scan-tree-dump "coshf " "optimized" } } */
/* { dg-final { scan-tree-dump "sinhf " "optimized" } } */
/* { dg-final { scan-tree-dump "atanhf " "optimized" } } */
/* { dg-final { scan-tree-dump "coshl " "optimized" } } */
/* { dg-final { scan-tree-dump "sinhl " "optimized" } } */
/* { dg-final { scan-tree-dump "atanhl " "optimized" } } */

@ -0,0 +1,62 @@
/* { dg-do compile } */
/* { dg-options "-Ofast -fmath-errno -fdump-tree-optimized" } */
extern float sinhf (float);
extern float coshf (float);
extern float atanhf (float);
extern float sqrtf (float);
extern double sinh (double);
extern double cosh (double);
extern double atanh (double);
extern double sqrt (double);
extern long double sinhl (long double);
extern long double coshl (long double);
extern long double atanhl (long double);
extern long double sqrtl (long double);
double __attribute__ ((noinline))
sinhatanh_ (double x)
{
return sinh (atanh (x));
}
double __attribute__ ((noinline))
coshatanh_ (double x)
{
return cosh (atanh (x));
}
float __attribute__ ((noinline))
sinhatanhf_(float x)
{
return sinhf (atanhf (x));
}
float __attribute__ ((noinline))
coshatanhf_(float x)
{
return coshf (atanhf (x));
}
long double __attribute__ ((noinline))
sinhatanhl_ (long double x)
{
return sinhl (atanhl (x));
}
long double __attribute__ ((noinline))
coshatanhl_ (long double x)
{
return coshl (atanhl (x));
}
/* There should be calls to sinh, cosh and atanh */
/* { dg-final { scan-tree-dump "cosh " "optimized" } } */
/* { dg-final { scan-tree-dump "sinh " "optimized" } } */
/* { dg-final { scan-tree-dump "atanh " "optimized" } } */
/* { dg-final { scan-tree-dump "coshf " "optimized" } } */
/* { dg-final { scan-tree-dump "sinhf " "optimized" } } */
/* { dg-final { scan-tree-dump "atanhf " "optimized" } } */
/* { dg-final { scan-tree-dump "coshl " "optimized" } } */
/* { dg-final { scan-tree-dump "sinhl " "optimized" } } */
/* { dg-final { scan-tree-dump "atanhl " "optimized" } } */