re PR tree-optimization/14303 ([tree-ssa] gcc.c-torture/execute/20020720-1.c is not...
authorJames A. Morrison <phython@gcc.gnu.org>
Sun, 13 Feb 2005 06:21:35 +0000 (06:21 +0000)
committerJames A. Morrison <phython@gcc.gnu.org>
Sun, 13 Feb 2005 06:21:35 +0000 (06:21 +0000)
2005-02-13  James A. Morrison  <phython@gcc.gnu.org>

       PR tree-optimization/14303
       PR tree-optimization/15784
       * fold-const.c (fold): Fold ABS_EXPR<x> >= 0 to true, when possible.
       Fold ABS_EXPR<x> < 0 to false.  Fold ABS_EXPR<x> == 0 to x == 0 and
       ABS_EXPR<x> != 0 to x != 0.

From-SVN: r94977

gcc/ChangeLog
gcc/fold-const.c

index 1d74ab64157a321d8ee5a3c851bc5d7f0a4cc1c2..35f46de3d7cd9fc3094db26382f98e7614852fc9 100644 (file)
@@ -1,3 +1,11 @@
+2005-02-13  James A. Morrison  <phython@gcc.gnu.org>
+
+       PR tree-optimization/14303
+       PR tree-optimization/15784
+       * fold-const.c (fold): Fold ABS_EXPR<x> >= 0 to true, when possible.
+       Fold ABS_EXPR<x> < 0 to false.  Fold ABS_EXPR<x> == 0 to x == 0 and
+       ABS_EXPR<x> != 0 to x != 0.
+
 2005-02-12  Kazu Hirata  <kazu@cs.umass.edu>
 
        * c-tree.h, combine.c, expmed.c, flow.c, libgcc2.c,
index 5d6e5c5085467247c1f9f34607c811fce47de56a..601f023ce9ad301ebf7be08b581ba907bc6cc64e 100644 (file)
@@ -8973,6 +8973,29 @@ fold (tree expr)
                             build2 (LE_EXPR, type,
                                     TREE_OPERAND (arg0, 0), arg1)));
 
+      /* Convert ABS_EXPR<x> >= 0 to true.  */
+      else if (code == GE_EXPR
+              && tree_expr_nonnegative_p (arg0)
+              && ! TREE_SIDE_EFFECTS (arg0)
+              && (integer_zerop (arg1)
+                  || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
+                       && real_zerop (arg1))))
+       return constant_boolean_node (true, type);
+
+      /* Convert ABS_EXPR<x> < 0 to false.  */
+      else if (code == LT_EXPR
+              && tree_expr_nonnegative_p (arg0)
+              && ! TREE_SIDE_EFFECTS (arg0)
+              && (integer_zerop (arg1) || real_zerop (arg1)))
+       return constant_boolean_node (false, type);
+
+      /* Convert ABS_EXPR<x> == 0 or ABS_EXPR<x> != 0 to x == 0 or x != 0.  */
+      else if ((code == EQ_EXPR || code == NE_EXPR)
+              && TREE_CODE (arg0) == ABS_EXPR
+              && ! TREE_SIDE_EFFECTS (arg0)
+              && (integer_zerop (arg1) || real_zerop (arg1)))
+       return fold (build2 (code, type, TREE_OPERAND (arg0, 0), arg1));
+
       /* If this is an EQ or NE comparison with zero and ARG0 is
         (1 << foo) & bar, convert it to (bar >> foo) & 1.  Both require
         two operations, but the latter can be done in one less insn