diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-08-25 07:21:26 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-08-25 07:21:26 +0200 |
commit | bb5e895245ebef488b63efc239f64488aef65cf1 (patch) | |
tree | 86b971ab006647bbc6f505b7b5cbbd517f2d30d3 | |
parent | 61680cfaf1eef26a5953f36ab82a1cc13f9b2f2c (diff) | |
download | gcc-bb5e895245ebef488b63efc239f64488aef65cf1.zip gcc-bb5e895245ebef488b63efc239f64488aef65cf1.tar.gz gcc-bb5e895245ebef488b63efc239f64488aef65cf1.tar.bz2 |
match.pd: Simplify copysign (x, -x) to -x [PR96715]
The following patch implements an optimization suggested in the PR,
copysign(x,-x) can be optimized into -x (even without -ffast-math,
should work fine even for signed zeros and infinities or nans).
2020-08-25 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/96715
* match.pd (copysign(x,-x) -> -x): New simplification.
* gcc.dg/tree-ssa/copy-sign-3.c: New test.
-rw-r--r-- | gcc/match.pd | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/copy-sign-3.c | 23 |
2 files changed, 28 insertions, 0 deletions
diff --git a/gcc/match.pd b/gcc/match.pd index 2cffcae..6e45836 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5294,6 +5294,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) @0) (simplify + /* copysign(x,-x) -> -x. */ + (COPYSIGN_ALL @0 (negate@1 @0)) + @1) + +(simplify /* copysign(x,y) -> fabs(x) if y is nonnegative. */ (COPYSIGN_ALL @0 tree_expr_nonnegative_p@1) (abs @0)) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/copy-sign-3.c b/gcc/testsuite/gcc.dg/tree-ssa/copy-sign-3.c new file mode 100644 index 0000000..f52e04d2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/copy-sign-3.c @@ -0,0 +1,23 @@ +/* PR tree-optimization/96715 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-final { scan-tree-dump-not "= __builtin_copysign" "optimized" } } */ +/* { dg-final { scan-tree-dump-times " = -x_\[0-9]*\\(D\\)" 3 "optimized" } } */ + +float +foo (float x) +{ + return __builtin_copysignf (x, -x); +} + +double +bar (double x) +{ + return __builtin_copysign (x, -x); +} + +long double +baz (long double x) +{ + return __builtin_copysignl (x, -x); +} |