This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix folding of -(unsigned)(a * -b)
- From: Michael Matz <matz at suse dot de>
- To: Richard Guenther <rguenther at suse dot de>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 7 Jul 2011 17:47:40 +0200 (CEST)
- Subject: Re: [PATCH] Fix folding of -(unsigned)(a * -b)
- References: <alpine.LNX.2.00.1107071514100.810@zhemvz.fhfr.qr>
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.