re PR middle-end/55152 (MAX_EXPR(a,-a) is really ABS_EXPR(a))
authorRichard Biener <rguenther@suse.de>
Thu, 29 Sep 2016 12:27:19 +0000 (12:27 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 29 Sep 2016 12:27:19 +0000 (12:27 +0000)
2016-09-29  Richard Biener  <rguenther@suse.de>

PR middle-end/55152
* match.pd: Add max(a,-a) -> abs(a) pattern.
* tree-ssa-phiopt.c (minmax_replacement): Disable for
HONOR_SIGNED_ZEROS types.

* gcc.dg/pr55152.c: New testcase.
* gcc.dg/tree-ssa/phi-opt-5.c: Adjust.

From-SVN: r240615

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr55152.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/phi-opt-5.c
gcc/tree-ssa-phiopt.c

index a5c8e1bb9967de1ff6452cf8a9366660d1332ffd..5ebd880f444c7d47b3ab06ea4d86a2a1c43192b9 100644 (file)
@@ -1,3 +1,10 @@
+2016-09-29  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/55152
+       * match.pd: Add max(a,-a) -> abs(a) pattern.
+       * tree-ssa-phiopt.c (minmax_replacement): Disable for
+       HONOR_SIGNED_ZEROS types.
+
 2016-09-29  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * defaults.h (TARGET_FLT_EVAL_METHOD_NON_DEFAULT): Remove.
index 786cf4ce042cadb6f8d4344ca501d2c09dc6d9ec..553e50d2d03b4f05c599cd37383e25c4f613a6b1 100644 (file)
@@ -1271,6 +1271,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 (simplify
  (max:c (min:c @0 @1) @1)
  @1)
+/* max(a,-a) -> abs(a).  */
+(simplify
+ (max:c @0 (negate @0))
+ (if (TREE_CODE (type) != COMPLEX_TYPE
+      && (! ANY_INTEGRAL_TYPE_P (type)
+         || TYPE_OVERFLOW_UNDEFINED (type)))
+  (abs @0)))
 (simplify
  (min @0 @1)
  (switch
index 6acd1fc255fe32d71406260437ac5d8a6c16d235..a88a975d6a026890bcc1301965a5ffa938bbb6dd 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-29  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/55152
+       * gcc.dg/pr55152.c: New testcase.
+       * gcc.dg/tree-ssa/phi-opt-5.c: Adjust.
+
 2016-09-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * gcc.dg/profile-update-warning.c: Restrict to ia32.
diff --git a/gcc/testsuite/gcc.dg/pr55152.c b/gcc/testsuite/gcc.dg/pr55152.c
new file mode 100644 (file)
index 0000000..b1a72cb
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O -ffinite-math-only -fno-signed-zeros -fstrict-overflow -fdump-tree-optimized" } */
+
+double g (double a)
+{
+  return (a>=-a)?a:-a;
+}
+int f(int a)
+{
+  return (a>=-a)?a:-a;
+}
+
+/* { dg-final { scan-tree-dump-times "ABS_EXPR" 2 "optimized" } } */
index 37041d7dabb7ac1ac8f96ac1295af98d1cc4d4ee..31c0fc1f2fba9f6b938333b381f19f1ed07a0759 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O1 -ffinite-math-only -fdump-tree-phiopt1" } */
+/* { dg-options "-O1 -ffinite-math-only -fno-signed-zeros -fdump-tree-phiopt1" } */
 
 float repl1 (float varx)
 {
index dd3837d0da1e127aceca022ed1f9736299df8e15..3f3b88cfc61386b660349b4d3681337a349124cc 100644 (file)
@@ -1075,7 +1075,7 @@ minmax_replacement (basic_block cond_bb, basic_block middle_bb,
   type = TREE_TYPE (PHI_RESULT (phi));
 
   /* The optimization may be unsafe due to NaNs.  */
-  if (HONOR_NANS (type))
+  if (HONOR_NANS (type) || HONOR_SIGNED_ZEROS (type))
     return false;
 
   cond = as_a <gcond *> (last_stmt (cond_bb));