re PR fortran/55633 (FAIL: gfortran.dg/g77/f90-intrinsic-bit.f -Os execution test)
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
This commit is contained in:
parent
4e74424074
commit
4c052539b6
4 changed files with 62 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
39
gcc/testsuite/gcc.dg/torture/pr55633.c
Normal file
39
gcc/testsuite/gcc.dg/torture/pr55633.c
Normal file
|
@ -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;
|
||||
}
|
|
@ -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))
|
||||
|
|
Loading…
Add table
Reference in a new issue