From 2df46b06a27b26a2b142fc28db58c57985bf0b6e Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Thu, 19 Aug 1993 08:28:38 -0400 Subject: [PATCH] (fold): Handle EQ_EXPR and NE_EXPR where both args are comparisons or BIT_AND_EXPR with constant 1. From-SVN: r5186 --- gcc/fold-const.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9d5aecc57b0..a859f6d2a9a 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3167,9 +3167,11 @@ fold (expr) one of the operands is a comparison and the other is either a comparison or a BIT_AND_EXPR with the constant 1. In that case, the code below would make the expression more complex. Change it to a - TRUTH_{AND,OR}_EXPR. */ + TRUTH_{AND,OR}_EXPR. Likewise, convert a similar NE_EXPR to + TRUTH_XOR_EXPR and an EQ_EXPR to the inversion of a TRUTH_XOR_EXPR. */ - if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR) + if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR + || code == EQ_EXPR || code == NE_EXPR) && ((TREE_CODE_CLASS (TREE_CODE (arg0)) == '<' && (TREE_CODE_CLASS (TREE_CODE (arg1)) == '<' || (TREE_CODE (arg1) == BIT_AND_EXPR @@ -3178,8 +3180,17 @@ fold (expr) && (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<' || (TREE_CODE (arg0) == BIT_AND_EXPR && integer_onep (TREE_OPERAND (arg0, 1))))))) - return fold (build (code == BIT_AND_EXPR ? TRUTH_AND_EXPR : TRUTH_OR_EXPR, - type, arg0, arg1)); + { + t = fold (build (code == BIT_AND_EXPR ? TRUTH_AND_EXPR + : code == BIT_IOR_EXPR ? TRUTH_OR_EXPR + : TRUTH_XOR_EXPR, + type, arg0, arg1)); + + if (code == EQ_EXPR) + t = invert_truthvalue (t); + + return t; + } if (TREE_CODE_CLASS (code) == '1') { -- 2.30.2