This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, RFT s390x] Bug in truncation simplifcation
- From: Adam Nemet <anemet at sonic dot net>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 04 Mar 2006 17:33:15 -0800
- Subject: Re: [PATCH, RFT s390x] Bug in truncation simplifcation
- References: <17414.24517.143795.750572@localhost.localdomain>
I write:
> I found this bug while working on my previous patch.
>
> If MODE is the mode of the truncation and OP is the operand then in
> order to see whether the bits outside of MODE have the same value as
> the new sign bit, the number of leading bits we need to check is:
>
> GET_MODE_BITSIZE (GET_MODE (OP)) - GET_MODE_BITSIZE (MODE) + 1
>
> Instead the code checks GET_MODE_BITSIZE (mode) + 1 bits which happens
> to work if the new mode is half the size of the original mode.
>
> Unfortunately, I couldn't sufficiently exercise the new code. I
> bootstrapped and tested on i686-pc-linux-gnu. However on x86,
> TRUNCATEs only occur before an LSHIFTRT and a MULT where this
> transformation is disabled specifically. I tried testing with a
> h8300-elf toolchain but the build fails in newlib. Finally, I built
> an s390x-ibm-linux-gnu cc1 and compared the assembly output for
> gcc.c-torture/exercise and for GCC preprocessed files. There is no
> change in the output before and after the patch and the code does
> trigger a few times.
After this week's changes from Roger
(http://gcc.gnu.org/ml/gcc-patches/2006-03/msg00187.html) the
middle-end started generating TRUNCATEs for TRULY_NOOP_TRUNCATION
targets as well.
I checked and with freshly updated sources my changes do trigger now
on x86_64-pc-linux-gnu. So I retested and bootstrapped my patch on
x86_64-pc-linux-gnu. Testing revealed no problems.
Also note that RTH has agreed that this was a bug
(http://gcc.gnu.org/ml/gcc-patches/2006-03/msg00137.html).
OK to install?
Adam
>
> * simplify-rtx.c (simplify_unary_operation_1) <TRUNCATE>: When
> trying to remove TRUNCATE check if all bits outside the new mode
> are identical to the sign bit.
>
> Index: simplify-rtx.c
> ===================================================================
> --- simplify-rtx.c (revision 111573)
> +++ simplify-rtx.c (working copy)
> @@ -640,7 +640,8 @@ simplify_unary_operation_1 (enum rtx_cod
> if ((TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
> GET_MODE_BITSIZE (GET_MODE (op)))
> ? (num_sign_bit_copies (op, GET_MODE (op))
> - >= (unsigned int) (GET_MODE_BITSIZE (mode) + 1))
> + > (unsigned int) (GET_MODE_BITSIZE (GET_MODE (op))
> + - GET_MODE_BITSIZE (mode)))
> : truncated_to_mode (mode, op))
> && ! (GET_CODE (op) == LSHIFTRT
> && GET_CODE (XEXP (op, 0)) == MULT))