> this code from fold-const.c starts on line 13811.
>
> else if (TREE_INT_CST_HIGH (arg1) == signed_max_hi
> && TREE_INT_CST_LOW (arg1) == signed_max_lo
> && TYPE_UNSIGNED (arg1_type)
> /* We will flip the signedness of the comparison operator
> associated with the mode of arg1, so the sign bit is
> specified by this mode. Check that arg1 is the signed
> max associated with this sign bit. */
> && width == GET_MODE_BITSIZE (TYPE_MODE (arg1_type))
> /* signed_type does not work on pointer types. */
> && INTEGRAL_TYPE_P (arg1_type))
with width defined as:
unsigned int width = TYPE_PRECISION (arg1_type);
> it seems that the check on bitsize should really be a check on the
> precision of the variable. If this seems right, i will correct this on
> the trunk and make the appropriate changes to the wide-int branch.
Do you mean
&& width == GET_MODE_PRECISION (TYPE_MODE (arg1_type))
instead? If so, that would probably make sense, but there are a few other
places with the same TYPE_PRECISION/GET_MODE_BITSIZE check, in particular the
very similar transformation done in fold_single_bit_test_into_sign_test.
--
Eric Botcazou