re PR tree-optimization/19944 (cris-elf testsuite failures: gcc.dg/pr15784-1.c, gcc...
authorJames A. Morrison <phython@gcc.gnu.org>
Mon, 14 Feb 2005 02:27:18 +0000 (02:27 +0000)
committerJames A. Morrison <phython@gcc.gnu.org>
Mon, 14 Feb 2005 02:27:18 +0000 (02:27 +0000)
2005-02-13  James A. Morrison  <phython@gcc.gnu.org>

       PR tree-optimization/19944
       * fold-const.c (fold): Re-add ABS_EXPR folding.

From-SVN: r95002

gcc/ChangeLog
gcc/fold-const.c

index 697588ca1e0368cc0e4b970ae7d727d3759c0a7d..11dbcf766e7eed890a9c6b8365e9dab02e05c2d6 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 5d6e5c5085467247c1f9f34607c811fce47de56a..ae4b7e5396d33da465f8891bf5b4f348a96d6400 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