match.pd (copysign(x, CST) -> [-]abs (x)): New pattern.
authorRichard Biener <rguenther@suse.de>
Wed, 5 Oct 2016 11:34:58 +0000 (11:34 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 5 Oct 2016 11:34:58 +0000 (11:34 +0000)
2016-10-05  Richard Biener  <rguenther@suse.de>

* match.pd (copysign(x, CST) -> [-]abs (x)): New pattern.

* gcc.dg/fold-copysign-1.c: New testcase.

From-SVN: r240775

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fold-copysign-1.c [new file with mode: 0644]

index b8976e3bfa6a411aef05bd9b509a778d80bd61af..0fd86c50900489d6db9a2e05ad8f5d2448b2b720 100644 (file)
@@ -1,3 +1,7 @@
+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
index 067e66788cfc419f80e5a4c3d114372788e5d018..e4b5d4d7556676130d7e1f76e7a65bb839c19076 100644 (file)
@@ -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
index d19a7cde3a2a51fe2f0d54e33643dad82c7236d4..818e5a4be23c6d521e8dc8031b6f53044f58261d 100644 (file)
@@ -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 (file)
index 0000000..f17d65c
--- /dev/null
@@ -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" } } */