diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2016-11-15 17:54:20 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2016-11-15 17:54:20 +0000 |
commit | 89e64bc0305f36a4abe486ce07cbee7c13a6dc81 (patch) | |
tree | 7865fe77f868e75b75fafceb52188b5e90e535e6 /gcc | |
parent | 8e4d2ca469ec10fca86fe7e0b3b2a4c9d0371419 (diff) | |
download | gcc-89e64bc0305f36a4abe486ce07cbee7c13a6dc81.zip gcc-89e64bc0305f36a4abe486ce07cbee7c13a6dc81.tar.gz gcc-89e64bc0305f36a4abe486ce07cbee7c13a6dc81.tar.bz2 |
Move misplaced assignment in num_sign_bit_copies1
The old assignment to bitwidth was before we handled VOIDmode with:
if (mode == VOIDmode)
mode = GET_MODE (x);
so when VOIDmode was specified we would always use:
if (bitwidth < GET_MODE_PRECISION (GET_MODE (x)))
{
num0 = cached_num_sign_bit_copies (x, GET_MODE (x),
known_x, known_mode, known_ret);
return MAX (1,
num0 - (int) (GET_MODE_PRECISION (GET_MODE (x)) - bitwidth));
}
For a zero bitwidth this always returns 1 (which is the most
pessimistic result).
gcc/
2016-11-15 Richard Sandiford <richard.sandiford@arm.com>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* rtlanal.c (num_sign_bit_copies1): Calculate bitwidth after
handling VOIDmode.
Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r242440
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/rtlanal.c | 4 |
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5ab2f3..95e3dc5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-15 Richard Sandiford <richard.sandiford@arm.com> + Alan Hayward <alan.hayward@arm.com> + David Sherwood <david.sherwood@arm.com> + + * rtlanal.c (num_sign_bit_copies1): Calculate bitwidth after + handling VOIDmode. + 2016-11-15 Matthias Klose <doko@ubuntu.com> * doc/install.texi: Remove references to gcj/libjava. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 4617e8e..e08f2be 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4795,7 +4795,6 @@ num_sign_bit_copies1 (const_rtx x, machine_mode mode, const_rtx known_x, unsigned int known_ret) { enum rtx_code code = GET_CODE (x); - unsigned int bitwidth = GET_MODE_PRECISION (mode); machine_mode inner_mode; int num0, num1, result; unsigned HOST_WIDE_INT nonzero; @@ -4811,7 +4810,8 @@ num_sign_bit_copies1 (const_rtx x, machine_mode mode, const_rtx known_x, || VECTOR_MODE_P (GET_MODE (x)) || VECTOR_MODE_P (mode)) return 1; - /* For a smaller object, just ignore the high bits. */ + /* For a smaller mode, just ignore the high bits. */ + unsigned int bitwidth = GET_MODE_PRECISION (mode); if (bitwidth < GET_MODE_PRECISION (GET_MODE (x))) { num0 = cached_num_sign_bit_copies (x, GET_MODE (x), |