aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2014-09-01 09:18:43 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2014-09-01 09:18:43 +0000
commite507a43338b75714233a271186baa4c68bf50e64 (patch)
tree41fdc21f64faaca5558438f1c9624a5f383275b3 /gcc
parente3ef4162ba903788ebd080eef633841dc9690430 (diff)
downloadgcc-e507a43338b75714233a271186baa4c68bf50e64.zip
gcc-e507a43338b75714233a271186baa4c68bf50e64.tar.gz
gcc-e507a43338b75714233a271186baa4c68bf50e64.tar.bz2
re PR middle-end/61903 (signed integer overflow in expmed.c store_fixed_bit_filed_1)
PR middle-end/61903 * expmed.c (store_fixed_bit_field_1): Shift UHWI 1 instead of HWI 1. Change the type of V to unsigned HOST_WIDE_INT. From-SVN: r214781
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expmed.c9
2 files changed, 11 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 19f7f79..ec0e6c4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-09-01 Marek Polacek <polacek@redhat.com>
+
+ PR middle-end/61903
+ * expmed.c (store_fixed_bit_field_1): Shift UHWI 1 instead of HWI 1.
+ Change the type of V to unsigned HOST_WIDE_INT.
+
2014-09-01 Thomas Preud'homme <thomas.preudhomme@arm.com>
* tree-ssa-math-opts.c (struct symbolic_number): Clarify comment about
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 1eb712e..82afd7f 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -1057,16 +1057,17 @@ store_fixed_bit_field_1 (rtx op0, unsigned HOST_WIDE_INT bitsize,
if (CONST_INT_P (value))
{
- HOST_WIDE_INT v = INTVAL (value);
+ unsigned HOST_WIDE_INT v = UINTVAL (value);
if (bitsize < HOST_BITS_PER_WIDE_INT)
- v &= ((HOST_WIDE_INT) 1 << bitsize) - 1;
+ v &= ((unsigned HOST_WIDE_INT) 1 << bitsize) - 1;
if (v == 0)
all_zero = 1;
else if ((bitsize < HOST_BITS_PER_WIDE_INT
- && v == ((HOST_WIDE_INT) 1 << bitsize) - 1)
- || (bitsize == HOST_BITS_PER_WIDE_INT && v == -1))
+ && v == ((unsigned HOST_WIDE_INT) 1 << bitsize) - 1)
+ || (bitsize == HOST_BITS_PER_WIDE_INT
+ && v == (unsigned HOST_WIDE_INT) -1))
all_one = 1;
value = lshift_value (mode, v, bitnum);