Hi, On Thu, 7 Jul 2011, Richard Guenther wrote:
> Index: gcc/fold-const.c > =================================================================== > --- gcc/fold-const.c (revision 175962) > +++ gcc/fold-const.c (working copy) > @@ -7561,7 +7561,7 @@ fold_unary_loc (location_t loc, enum tre > if (arg0) > { > if (CONVERT_EXPR_CODE_P (code) > - || code == FLOAT_EXPR || code == ABS_EXPR) > + || code == FLOAT_EXPR || code == ABS_EXPR || code == NEGATE_EXPR) > { > /* Don't use STRIP_NOPS, because signedness of argument type > matters. */ Um, so why would stripping a signchange ever be okay? There are many other unary codes that behave similar enough to FLOAT_EXPR, or CONVERT_EXPR that it's not obvious to me why those would allow sign stripping but the above not. When the operand is float or fixed point types then STRIP_SIGN_NOPS and STRIP_NOPS aren't different, and when the operands are integer types I don't see how we can ignore sign-changing nops. I'm thinking about: VEC_UNPACK_HI_EXPR, VEC_UNPACK_LO_EXPR and PAREN_EXPR Perhaps BIT_NOT_EXPR. Perhaps also NON_LVALUE_EXPR. All these can conceivably have integer operands, where signedness seems to matter. I think these are harmless: CONJ_EXPR, FIXED_CONVERT_EXPR, FIX_TRUNC_EXPR, ADDR_SPACE_CONVERT_EXPR as their operands are either float/fixed-point types or pointers, but as said in those cases STRIP_NOPS and STRIP_SIGN_NOPS are equivalent. So, why not simply always use STRIP_SIGN_NOPS? Ciao, Michael.