2005-02-13 James A. Morrison <phython@gcc.gnu.org>
authorphython <phython@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Feb 2005 02:27:18 +0000 (02:27 +0000)
committerphython <phython@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Feb 2005 02:27:18 +0000 (02:27 +0000)
       PR tree-optimization/19944
       * fold-const.c (fold): Re-add ABS_EXPR folding.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95002 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c

index 697588c..11dbcf7 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-13  James A. Morrison  <phython@gcc.gnu.org>
+
+       PR tree-optimization/19944
+       * fold-const.c (fold): Re-add ABS_EXPR folding.
+
 2005-02-13  David Edelsohn  <edelsohn@gnu.org>
 
        PR target/19019
index 5d6e5c5..ae4b7e5 100644 (file)
@@ -8973,6 +8973,26 @@ 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)
+              && (integer_zerop (arg1)
+                  || (! HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0)))
+                       && real_zerop (arg1))))
+       return omit_one_operand (type, integer_one_node, arg0);
+
+      /* Convert ABS_EXPR<x> < 0 to false.  */
+      else if (code == LT_EXPR
+              && tree_expr_nonnegative_p (arg0)
+              && (integer_zerop (arg1) || real_zerop (arg1)))
+       return omit_one_operand (type, integer_zero_node, arg0);
+
+      /* 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
+              && (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