aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c24
2 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 753ea40..0dd65f3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2002-06-01 Roger Sayle <roger@eyesopen.com>
+
+ * 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 <aj@suse.de>
* cppexp.c (cpp_classify_number): Cast precission to int for
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 400285e..0998a93 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. */