diff mbox

Fix PR61657 (undefined behavior in loop-iv.c)

Message ID 20150821134029.GE399@x4
State New
Headers show

Commit Message

Markus Trippelsdorf Aug. 21, 2015, 1:40 p.m. UTC
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.

Bootstrapped and tested on ppc64le.
OK for trunk and gcc-5 branch?

Thanks.

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.

Comments

Jeff Law Aug. 21, 2015, 4:40 p.m. UTC | #1
On 08/21/2015 07:40 AM, Markus Trippelsdorf wrote:
> 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.
>
> Bootstrapped and tested on ppc64le.
> OK for trunk and gcc-5 branch?
>
> Thanks.
>
> 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.
OK for trunk.

AFAIK this isn't a regression, so Richi, Jakub or Joseph ought to 
explicitly ack for the gcc-5 branch.

jeff
>
diff mbox

Patch

diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index 6e9cc8c..1c9a159 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -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);