* fold-const.c (fold): Fold some comparisons of bit operations.
From-SVN: r70009
This commit is contained in:
parent
049d2251b8
commit
b7de586461
2 changed files with 32 additions and 0 deletions
|
@ -1,3 +1,7 @@
|
|||
2003-07-31 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
|
||||
|
||||
* fold-const.c (fold): Fold some comparisons of bit operations.
|
||||
|
||||
Thu Jul 31 19:49:53 CEST 2003 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* cgraph.c (create_edge): Fix typo.
|
||||
|
|
|
@ -7182,6 +7182,34 @@ fold (tree expr)
|
|||
if (tem)
|
||||
return tem;
|
||||
|
||||
/* If we have (A & C) == D where D & ~C != 0, convert this into 0.
|
||||
Similarly for NE_EXPR. */
|
||||
if ((code == EQ_EXPR || code == NE_EXPR)
|
||||
&& TREE_CODE (arg0) == BIT_AND_EXPR
|
||||
&& TREE_CODE (arg1) == INTEGER_CST
|
||||
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
|
||||
{
|
||||
tree dandnotc = fold (build (BIT_ANDTC_EXPR, TREE_TYPE (arg0),
|
||||
arg1, TREE_OPERAND (arg0, 1)));
|
||||
tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
|
||||
if (!integer_zerop (dandnotc))
|
||||
return omit_one_operand (type, rslt, arg0);
|
||||
}
|
||||
|
||||
/* If we have (A | C) == D where C & ~D != 0, convert this into 0.
|
||||
Similarly for NE_EXPR. */
|
||||
if ((code == EQ_EXPR || code == NE_EXPR)
|
||||
&& TREE_CODE (arg0) == BIT_IOR_EXPR
|
||||
&& TREE_CODE (arg1) == INTEGER_CST
|
||||
&& TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
|
||||
{
|
||||
tree candnotd = fold (build (BIT_ANDTC_EXPR, TREE_TYPE (arg0),
|
||||
TREE_OPERAND (arg0, 1), arg1));
|
||||
tree rslt = code == EQ_EXPR ? integer_zero_node : integer_one_node;
|
||||
if (!integer_zerop (candnotd))
|
||||
return omit_one_operand (type, rslt, arg0);
|
||||
}
|
||||
|
||||
/* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
|
||||
and similarly for >= into !=. */
|
||||
if ((code == LT_EXPR || code == GE_EXPR)
|
||||
|
|
Loading…
Add table
Reference in a new issue