From 89e64bc0305f36a4abe486ce07cbee7c13a6dc81 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 15 Nov 2016 17:54:20 +0000 Subject: [PATCH] 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 Alan Hayward David Sherwood * rtlanal.c (num_sign_bit_copies1): Calculate bitwidth after handling VOIDmode. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r242440 --- gcc/ChangeLog | 7 +++++++ gcc/rtlanal.c | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5ab2f3275f..95e3dc5047c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-15 Richard Sandiford + Alan Hayward + David Sherwood + + * rtlanal.c (num_sign_bit_copies1): Calculate bitwidth after + handling VOIDmode. + 2016-11-15 Matthias Klose * doc/install.texi: Remove references to gcj/libjava. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 4617e8ee449..e08f2be789b 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), -- 2.30.2