From bb5e895245ebef488b63efc239f64488aef65cf1 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 25 Aug 2020 07:21:26 +0200 Subject: [PATCH] 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 PR tree-optimization/96715 * match.pd (copysign(x,-x) -> -x): New simplification. * gcc.dg/tree-ssa/copy-sign-3.c: New test. --- gcc/match.pd | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/copy-sign-3.c | 23 +++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/copy-sign-3.c diff --git a/gcc/match.pd b/gcc/match.pd index 2cffcae3d8b..6e45836e32b 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -5293,6 +5293,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (COPYSIGN_ALL @0 @0) @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) 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 00000000000..f52e04d2293 --- /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); +} -- 2.30.2