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 b90cbc6..17e9831 100644 (file)
@@ -1,5 +1,11 @@
 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
        * combine.c (simplify_comparison): Cast to unsigned to avoid
        left shifting of negative value.
index 0a2ee5e..ead2543 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