Fix PR61657 (undefined behavior in loop-iv.c)
authorMarkus Trippelsdorf <markus@trippelsdorf.de>
Fri, 21 Aug 2015 16:44:30 +0000 (16:44 +0000)
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>
Fri, 21 Aug 2015 16:44:30 +0000 (16:44 +0000)
bootstrap-ubsan shows:
 loop-iv.c:2626:14: runtime error: signed integer overflow: 9223372036854775806 - -9223372036854775808 cannot be represented in type 'long int'

Fixed by moving the variables in question from signed to unsigned.

PR rtl-optimization/61657
* loop-iv.c (iv_number_of_iterations): Declare up and down as
unsigned. Remove superflous uint64_t cast.

From-SVN: r227075

gcc/ChangeLog
gcc/loop-iv.c

index 66006138bab640ac538a9ea9f6ee81c49a0ce9ac..806ea55043ca958301f7845ea7681626fb03cc43 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-21  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       PR rtl-optimization/61657
+       * loop-iv.c (iv_number_of_iterations): Declare up and down as
+       unsigned.  Remove superflous uint64_t cast.
+
 2014-08-21  Felix Yang  <felix.yang@huawei.com>
            Jiji Jiang  <jiangjiji@huawei.com>
 
index 6e9cc8cf09ef09c75030d092200edea4545aa290..1c9a159ed318fcdb02bc1c6b39f0414d05d047b6 100644 (file)
@@ -2330,8 +2330,8 @@ iv_number_of_iterations (struct loop *loop, rtx_insn *insn, rtx condition,
   enum rtx_code cond;
   machine_mode mode, comp_mode;
   rtx mmin, mmax, mode_mmin, mode_mmax;
-  uint64_t s, size, d, inv, max;
-  int64_t up, down, inc, step_val;
+  uint64_t s, size, d, inv, max, up, down;
+  int64_t inc, step_val;
   int was_sharp = false;
   rtx old_niter;
   bool step_is_pow2;
@@ -2621,7 +2621,7 @@ iv_number_of_iterations (struct loop *loop, rtx_insn *insn, rtx condition,
          down = INTVAL (CONST_INT_P (iv0.base)
                         ? iv0.base
                         : mode_mmin);
-         max = (uint64_t) (up - down) / inc + 1;
+         max = (up - down) / inc + 1;
          if (!desc->infinite
              && !desc->assumptions)
            record_niter_bound (loop, max, false, true);