re PR middle-end/67485 (expmed.c sanitizer detects overflow)
authorJakub Jelinek <jakub@redhat.com>
Tue, 16 Aug 2016 16:48:16 +0000 (18:48 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 16 Aug 2016 16:48:16 +0000 (18:48 +0200)
PR middle-end/67485
* expmed.c (expand_mult_const): Change val_so_far's type to UHWI,
only cast it to SHWI for the final comparison.

* gcc.c-torture/compile/pr67485.c: New test.

From-SVN: r239507

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr67485.c [new file with mode: 0644]

index df133208b2c90b720df26d504ad1f42e62f1811e..e2bec5f87ae87ce0076fc8a1b55b59b19b764362 100644 (file)
@@ -1,3 +1,9 @@
+2016-08-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/67485
+       * expmed.c (expand_mult_const): Change val_so_far's type to UHWI,
+       only cast it to SHWI for the final comparison.
+
 2016-08-16  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/36412
index 674c8f08928b99fc0abf087b5ec1f7c9b08f0fe7..1cedf023c8e8916d887bd3a9d9a723e3cc2354f7 100644 (file)
@@ -3055,7 +3055,7 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val,
                   rtx target, const struct algorithm *alg,
                   enum mult_variant variant)
 {
-  HOST_WIDE_INT val_so_far;
+  unsigned HOST_WIDE_INT val_so_far;
   rtx_insn *insn;
   rtx accum, tem;
   int opno;
@@ -3105,14 +3105,14 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val,
          tem = expand_shift (LSHIFT_EXPR, mode, op0, log, NULL_RTX, 0);
          accum = force_operand (gen_rtx_PLUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
-         val_so_far += HOST_WIDE_INT_1 << log;
+         val_so_far += HOST_WIDE_INT_1U << log;
          break;
 
        case alg_sub_t_m2:
          tem = expand_shift (LSHIFT_EXPR, mode, op0, log, NULL_RTX, 0);
          accum = force_operand (gen_rtx_MINUS (mode, accum, tem),
                                 add_target ? add_target : accum_target);
-         val_so_far -= HOST_WIDE_INT_1 << log;
+         val_so_far -= HOST_WIDE_INT_1U << log;
          break;
 
        case alg_add_t2_m:
@@ -3188,7 +3188,7 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val,
   nmode = GET_MODE_INNER (mode);
   val &= GET_MODE_MASK (nmode);
   val_so_far &= GET_MODE_MASK (nmode);
-  gcc_assert (val == val_so_far);
+  gcc_assert (val == (HOST_WIDE_INT) val_so_far);
 
   return accum;
 }
index f39434dfc8d55d0ec49640a911fc1e2998c4c046..f9668c9229f75c464bc2f8280bd14416f7b1cbf2 100644 (file)
@@ -1,5 +1,8 @@
 2016-08-16  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/67485
+       * gcc.c-torture/compile/pr67485.c: New test.
+
        PR target/72867
        * gcc.target/i386/pr72867.c: Add -msse to dg-options.
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr67485.c b/gcc/testsuite/gcc.c-torture/compile/pr67485.c
new file mode 100644 (file)
index 0000000..05098f9
--- /dev/null
@@ -0,0 +1,7 @@
+/* PR middle-end/67485 */
+
+long int
+foo (long int x)
+{
+  return x * __LONG_MAX__;
+}