Commit 79bf94d3 by Richard Kenner

(fold...

(fold, case EQ_EXPR): Re-enable converting signed MOD operations to
unsigned when inside comparisons against zero, but only when the
second operand of the MOD is an integral power of two.

From-SVN: r5166
parent 41fe0b83
...@@ -4224,20 +4224,17 @@ fold (expr) ...@@ -4224,20 +4224,17 @@ fold (expr)
arg1)); arg1));
} }
/* It would be nice to do this since it generates better code.
Unfortunately, it doesn't produce the correct result if the
first operand is negative. */
#if 0
/* If this is an NE or EQ comparison of zero against the result of a /* If this is an NE or EQ comparison of zero against the result of a
signed MOD operation, make the MOD operation unsigned since it signed MOD operation whose second operand is a power of 2, make
is simpler and equivalent. */ the MOD operation unsigned since it is simpler and equivalent. */
if ((code == NE_EXPR || code == EQ_EXPR) if ((code == NE_EXPR || code == EQ_EXPR)
&& integer_zerop (arg1) && integer_zerop (arg1)
&& ! TREE_UNSIGNED (TREE_TYPE (arg0)) && ! TREE_UNSIGNED (TREE_TYPE (arg0))
&& (TREE_CODE (arg0) == TRUNC_MOD_EXPR && (TREE_CODE (arg0) == TRUNC_MOD_EXPR
|| TREE_CODE (arg0) == CEIL_MOD_EXPR || TREE_CODE (arg0) == CEIL_MOD_EXPR
|| TREE_CODE (arg0) == FLOOR_MOD_EXPR || TREE_CODE (arg0) == FLOOR_MOD_EXPR
|| TREE_CODE (arg0) == ROUND_MOD_EXPR)) || TREE_CODE (arg0) == ROUND_MOD_EXPR)
&& integer_pow2p (TREE_OPERAND (arg0, 1)))
{ {
tree newtype = unsigned_type (TREE_TYPE (arg0)); tree newtype = unsigned_type (TREE_TYPE (arg0));
tree newmod = build (TREE_CODE (arg0), newtype, tree newmod = build (TREE_CODE (arg0), newtype,
...@@ -4246,7 +4243,6 @@ fold (expr) ...@@ -4246,7 +4243,6 @@ fold (expr)
return build (code, type, newmod, convert (newtype, arg1)); return build (code, type, newmod, convert (newtype, arg1));
} }
#endif
/* If this is an NE comparison of zero with an AND of one, remove the /* If this is an NE comparison of zero with an AND of one, remove the
comparison since the AND will give the correct value. */ comparison since the AND will give the correct value. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment