From 01c58f2670a5f7858b8762e06cab0a68b98a684f Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Sat, 1 Jun 2002 16:51:00 +0000 Subject: [PATCH] fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0" and "!p && !q" into "(p|q) == 0" under... * fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0" and "!p && !q" into "(p|q) == 0" under suitable conditions. From-SVN: r54148 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 753ea40e102..0dd65f30b66 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-06-01 Roger Sayle + + * fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0" + and "!p && !q" into "(p|q) == 0" under suitable conditions. + 2002-06-01 Andreas Jaeger * cppexp.c (cpp_classify_number): Cast precission to int for diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 400285e5fec..0998a93aa2e 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3506,7 +3506,29 @@ fold_truthop (code, truth_type, lhs, rhs) && ! FLOAT_TYPE_P (TREE_TYPE (rl_arg)) && simple_operand_p (rl_arg) && simple_operand_p (rr_arg)) - return build (code, truth_type, lhs, rhs); + { + /* Convert (a != 0) || (b != 0) into (a | b) != 0. */ + if (code == TRUTH_OR_EXPR + && lcode == NE_EXPR && integer_zerop (lr_arg) + && rcode == NE_EXPR && integer_zerop (rr_arg) + && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)) + return build (NE_EXPR, truth_type, + build (BIT_IOR_EXPR, TREE_TYPE (ll_arg), + ll_arg, rl_arg), + integer_zero_node); + + /* Convert (a == 0) && (b == 0) into (a | b) == 0. */ + if (code == TRUTH_AND_EXPR + && lcode == EQ_EXPR && integer_zerop (lr_arg) + && rcode == EQ_EXPR && integer_zerop (rr_arg) + && TREE_TYPE (ll_arg) == TREE_TYPE (rl_arg)) + return build (EQ_EXPR, truth_type, + build (BIT_IOR_EXPR, TREE_TYPE (ll_arg), + ll_arg, rl_arg), + integer_zero_node); + + return build (code, truth_type, lhs, rhs); + } /* See if the comparisons can be merged. Then get all the parameters for each side. */ -- 2.30.2