re PR fortran/55633 (FAIL: gfortran.dg/g77/f90-intrinsic-bit.f -Os execution test)
authorJakub Jelinek <jakub@redhat.com>
Wed, 12 Dec 2012 09:32:52 +0000 (10:32 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 12 Dec 2012 09:32:52 +0000 (10:32 +0100)
PR fortran/55633
* tree-ssa-loop-niter.c (discover_iteration_bound_by_body_walk):
Ignore bounds on which bound += double_int_one overflowed.

* gcc.dg/torture/pr55633.c: New test.

From-SVN: r194438

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

index f457101ae2e850645aef1d7114fe614e27ed5ec5..40405d5d58023a3cb4221f9941b23c35b2efdf58 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/55633
+       * tree-ssa-loop-niter.c (discover_iteration_bound_by_body_walk):
+       Ignore bounds on which bound += double_int_one overflowed.
+
 2012-12-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/54121
index 2f80e7df4191f7c7275d4e187f7003eb07b35d60..0c8b49f56fa4f9398ef0d66afed0aa73cf3b126f 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/55633
+       * gcc.dg/torture/pr55633.c: New test.
+
 2012-12-11  Marc Glisse  <marc.glisse@inria.fr>
 
        PR c++/53094
diff --git a/gcc/testsuite/gcc.dg/torture/pr55633.c b/gcc/testsuite/gcc.dg/torture/pr55633.c
new file mode 100644 (file)
index 0000000..5d30d61
--- /dev/null
@@ -0,0 +1,39 @@
+/* PR fortran/55633 */
+/* { dg-do run { target int128 } } */
+
+extern void abort (void);
+
+__attribute__((noinline, noclone)) void
+bar (__int128_t *x)
+{
+  int c = sizeof (__int128_t) * __CHAR_BIT__;
+  if (c > 127)
+    c = 127;
+  if (*x != c)
+    abort ();
+}
+
+__attribute__((noinline)) void
+foo (void)
+{
+  __int128_t m, ma;
+  ma = 0;
+  m = 0;
+  m = ~m;
+  do
+    {
+      if (m == 0 || ma > 126)
+       break;
+      ma = ma + 1;
+      m = ((__uint128_t) m) >> 1;
+    }
+  while (1);
+  bar (&ma);
+}
+
+int
+main ()
+{
+  foo ();
+  return 0;
+}
index d3007d78aec8e2b1d0b2a1f4ef787a3e15a14d6e..a9b70778952981615af382f21783d7621f6830cd 100644 (file)
@@ -3011,7 +3011,12 @@ discover_iteration_bound_by_body_walk (struct loop *loop)
       /* Exit terminates loop at given iteration, while non-exits produce undefined
         effect on the next iteration.  */
       if (!elt->is_exit)
-       bound += double_int_one;
+       {
+         bound += double_int_one;
+         /* If an overflow occurred, ignore the result.  */
+         if (bound.is_zero ())
+           continue;
+       }
 
       if (!loop->any_upper_bound
          || bound.ult (loop->nb_iterations_upper_bound))
@@ -3037,7 +3042,12 @@ discover_iteration_bound_by_body_walk (struct loop *loop)
     {
       double_int bound = elt->bound;
       if (!elt->is_exit)
-       bound += double_int_one;
+       {
+         bound += double_int_one;
+         /* If an overflow occurred, ignore the result.  */
+         if (bound.is_zero ())
+           continue;
+       }
 
       if (!loop->any_upper_bound
          || bound.ult (loop->nb_iterations_upper_bound))