From 623049aa3c72118db18bed0c09a2bd88c3ef4664 Mon Sep 17 00:00:00 2001 From: "James A. Morrison" Date: Mon, 14 Feb 2005 02:27:18 +0000 Subject: [PATCH] re PR tree-optimization/19944 (cris-elf testsuite failures: gcc.dg/pr15784-1.c, gcc.dg/pr15784-2.c) 2005-02-13 James A. Morrison PR tree-optimization/19944 * fold-const.c (fold): Re-add ABS_EXPR folding. From-SVN: r95002 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 697588ca1e0..11dbcf766e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-02-13 James A. Morrison + + PR tree-optimization/19944 + * fold-const.c (fold): Re-add ABS_EXPR folding. + 2005-02-13 David Edelsohn PR target/19019 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 5d6e5c50854..ae4b7e5396d 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8973,6 +8973,26 @@ fold (tree expr) build2 (LE_EXPR, type, TREE_OPERAND (arg0, 0), arg1))); + /* Convert ABS_EXPR >= 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 < 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 == 0 or ABS_EXPR != 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 -- 2.30.2