Fix PR tree-optimization/78598 - tree-ssa-loop-prefetch.c:835:16: runtime error:...
authorMarkus Trippelsdorf <markus@trippelsdorf.de>
Thu, 1 Dec 2016 14:59:03 +0000 (14:59 +0000)
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>
Thu, 1 Dec 2016 14:59:03 +0000 (14:59 +0000)
Using bootstrap-ubsan gcc to build mplayer shows:

tree-ssa-loop-prefetch.c:835:16: runtime error: signed integer overflow:
288230376151711743 * 64 cannot be represented in type 'long int'

Here signed und unsigned integers are mixed in a division resulting in
bogus values: (-83 + 64ULL -1) / 64ULL) == 288230376151711743

Fixed by casting the unsigned parameter to signed.

PR tree-optimization/78598
* tree-ssa-loop-prefetch.c (ddown): Cast to signed to avoid
overflows.

From-SVN: r243113

gcc/ChangeLog
gcc/tree-ssa-loop-prefetch.c

index b90cbc6ffa21d20c18956c87cca13f5edbc72275..17e9831b26e784b6611cb6ba0f95fc9b136d9d81 100644 (file)
@@ -1,3 +1,9 @@
+2016-12-01  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       PR tree-optimization/78598
+       * tree-ssa-loop-prefetch.c (ddown): Cast to signed to avoid
+       overflows.
+
 2016-12-01  Markus Trippelsdorf  <markus@trippelsdorf.de>
 
        PR rtl-optimization/78596
index 0a2ee5ea25fdbe8003c663b3a584b32a0f0ee7d0..ead2543ada46c4a46958a350650e0ced1ad00dbf 100644 (file)
@@ -700,9 +700,9 @@ ddown (HOST_WIDE_INT x, unsigned HOST_WIDE_INT by)
   gcc_assert (by > 0);
 
   if (x >= 0)
-    return x / by;
+    return x / (HOST_WIDE_INT) by;
   else
-    return (x + by - 1) / by;
+    return (x + (HOST_WIDE_INT) by - 1) / (HOST_WIDE_INT) by;
 }
 
 /* Given a CACHE_LINE_SIZE and two inductive memory references