http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54932



             Bug #: 54932

           Summary: Invalid loop code generated by Fortran FE for loops

                    with bounds in HIGH(type)

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: fortran

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: hubi...@gcc.gnu.org





The following fortran testcase (derrived from do-1.f90):

! { dg-do run }

! Program to check corner cases for DO statements.

program do_1

  implicit none

  integer i, j



  ! limit=HUGE(i), step 1

  j = 0

  do i = HUGE(i) - 10, HUGE(i), 1

    j = j + 1

  end do

  if (j .ne. 11) call abort



end program



gets invalid estimate on number of iterations of the loop



Statement i_9 = i_8 + 1;

 is executed at most 9 (bounded by 9) + 1 times in loop 1.

Loop 1 iterates at most 9 times.



(should be 10) this is because:

  <bb 3>:

  # i_8 = PHI <2147483637(2), i_9(3)>

  # j_6 = PHI <0(2), j_7(3)>

  # DEBUG j => j_6

  # DEBUG i => i_8

  j_7 = j_6 + 1;

  # DEBUG j => j_7

  i_9 = i_8 + 1;

  # DEBUG i => i_9

  if (i_8 == 2147483647)

    goto <bb 4>;

  else

    goto <bb 3>;



the loop is produce din a way that i_9 overflows in the last iteration. It is

unused by according to discussion with Richard on IRC the program is not valid.

This is already wrong in the output from the fortran FE:

<bb 3>:

  j = j + 1;

  test (&i);

  i.1 = i;

  D.1852 = i.1 == 2147483647;

  i.1 = i;

  i.2 = i.1 + 1;

  i = i.2;

  if (D.1852 != 0)

    goto <bb 4>;

  else

    goto <bb 3>;



the increment really should happen in the latch block.

Or is the testcase bogus?



Honza

Reply via email to