From: Roger Sayle Date: Sat, 1 Jun 2002 16:51:00 +0000 (+0000) Subject: fold-const.c (fold_truthop): Transform "a || b" into "(a|b) != 0" and "!p && !q"... X-Git-Tag: releases/gcc-3.3.0~4636 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=01c58f2670a5f7858b8762e06cab0a68b98a684f;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 753ea40e102f..0dd65f30b66a 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 400285e5fec2..0998a93aa2e4 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. */