]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorUros Bizjak <uros@gcc.gnu.org>
Mon, 29 Nov 2010 20:31:21 +0000 (21:31 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 29 Nov 2010 20:31:21 +0000 (21:31 +0100)
2010-11-29  Zdenek Dvorak  <rakdver@kam.uniff.cz>

PR tree-optimization/46675
* tree-ssa-loop-niter.c (split_to_var_and_offset): Avoid overflow
in offset calculation.

testsuite/ChangeLog:

2010-11-29  Richard Guenther  <rguenther@suse.de>
    Zdenek Dvorak  <rakdver@kam.uniff.cz>

PR tree-optimization/46675
* gcc.dg/pr46675.c: New test.

From-SVN: r167267

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr46675.c [new file with mode: 0644]
gcc/tree-ssa-loop-niter.c

index edf5d3f24bedb167898bdbad066c9511525c3cd0..ff8a3d377ea46e7dd2edf0a70d8078e28a21f9ed 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-29  Zdenek Dvorak  <rakdver@kam.uniff.cz>
+
+       PR tree-optimization/46675
+       * tree-ssa-loop-niter.c (split_to_var_and_offset): Avoid overflow
+       in offset calculation.
+
 2010-11-29  Alexandre Oliva  <aoliva@redhat.com>
 
        PR debug/46258
index 575fb8b89f3d297755a5a827b4598867d8d1211d..60635d7f23e41305ed8f707061071010070dc4ef 100644 (file)
@@ -1,3 +1,9 @@
+2010-11-29  Richard Guenther  <rguenther@suse.de>
+           Zdenek Dvorak  <rakdver@kam.uniff.cz>
+
+       PR tree-optimization/46675
+       * gcc.dg/pr46675.c: New test.
+
 2010-11-28  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/aliasing2.adb (dg-final): Robustify pattern matching.
diff --git a/gcc/testsuite/gcc.dg/pr46675.c b/gcc/testsuite/gcc.dg/pr46675.c
new file mode 100644 (file)
index 0000000..7493f0e
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+int j;
+
+void
+__attribute__((noinline))
+foo (int n)
+{
+  int npairs, i;
+  npairs = n - (-__INT_MAX__ - 1);
+
+  if (npairs > 0)
+    for (i = 0; i < npairs; i++)
+      j++;
+}
+
+int
+main ()
+{
+  foo (5 - __INT_MAX__ - 1);
+
+  if (j != 5)
+    abort ();
+
+  return 0;
+}
index 48e20454857f91f73502cc83b9533764ed37b91a..9bf816e1214f6d0ba1cac2e48b10d25b1b1ac8b1 100644 (file)
@@ -95,10 +95,10 @@ split_to_var_and_offset (tree expr, tree *var, mpz_t offset)
       *var = op0;
       /* Always sign extend the offset.  */
       off = tree_to_double_int (op1);
-      if (negate)
-       off = double_int_neg (off);
       off = double_int_sext (off, TYPE_PRECISION (type));
       mpz_set_double_int (offset, off, false);
+      if (negate)
+       mpz_neg (offset, offset);
       break;
 
     case INTEGER_CST: