diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/match.pd | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-copysign-1.c | 16 |
4 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b8976e3..0fd86c5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2016-10-05 Richard Biener <rguenther@suse.de> + * match.pd (copysign(x, CST) -> [-]abs (x)): New pattern. + +2016-10-05 Richard Biener <rguenther@suse.de> + PR middle-end/77842 * genmatch.c (parser::parse_c_expr): Handle premature EOF. diff --git a/gcc/match.pd b/gcc/match.pd index 067e667..e4b5d4d 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -452,6 +452,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (hypots @0 (copysigns @1 @2)) (hypots @0 @1))) +/* copysign(x, CST) -> [-]abs (x). */ +(for copysigns (COPYSIGN) + (simplify + (copysigns @0 REAL_CST@1) + (if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (@1))) + (negate (abs @0)) + (abs @0)))) + /* copysign(copysign(x, y), z) -> copysign(x, z). */ (for copysigns (COPYSIGN) (simplify diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d19a7cd..818e5a4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-10-05 Richard Biener <rguenther@suse.de> + + * gcc.dg/fold-copysign-1.c: New testcase. + 2016-10-05 Andreas Schwab <schwab@suse.de> * g++.dg/pr49847-2.C: Remove. diff --git a/gcc/testsuite/gcc.dg/fold-copysign-1.c b/gcc/testsuite/gcc.dg/fold-copysign-1.c new file mode 100644 index 0000000..f17d65c --- /dev/null +++ b/gcc/testsuite/gcc.dg/fold-copysign-1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-cddce1" } */ + +double foo (double x) +{ + double one = 1.; + return __builtin_copysign (x, one); +} +double bar (double x) +{ + double minuszero = -0.; + return __builtin_copysign (x, minuszero); +} + +/* { dg-final { scan-tree-dump-times "= -" 1 "cddce1" } } */ +/* { dg-final { scan-tree-dump-times "= ABS_EXPR" 2 "cddce1" } } */ |