This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix folding of -(unsigned)(a * -b)


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]