]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/61903 (signed integer overflow in expmed.c store_fixed_bit_filed_1)
authorMarek Polacek <polacek@redhat.com>
Mon, 1 Sep 2014 09:18:43 +0000 (09:18 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Mon, 1 Sep 2014 09:18:43 +0000 (09:18 +0000)
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

gcc/ChangeLog
gcc/expmed.c

index 19f7f7935d68e5566f48229e8e6d9e61640a7d60..ec0e6c44fd045f12053cc65d12112db42dc6b3af 100644 (file)
@@ -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
index 1eb712e84ba82091ce00b85bacaa05c886a5f97a..82afd7fee50402d4286e09785a267d5df19a441b 100644 (file)
@@ -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);