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 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); +} -- 2.7.4