> 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