https://gcc.gnu.org/bugzilla/show_bug.cgi?id=31593

--- Comment #46 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
(In reply to Dominique d'Humieres from comment #45)
> Anything left to fix in this PR?

Unfortunately yes...

We still do not take advantage of the fact that the call
to a subroutine cannot change the value of the do loop:

ig25@linux-fd1f:~/Krempel/Do> cat call_unspec.f90
module foo                         
contains                           
  subroutine output(i1,i2,i3,i4,i5)
    integer :: i1,i2,i3,i4,i5
    print '(5(I0,:" "))',i1,i2,i3,i4,i5    
  end subroutine output                
end module foo                         
program main                           
  use foo
  implicit none
  integer :: value
  integer :: p1, p2, p3, p4
  integer :: i

  do value = 750,800
     do i=1, 10
        do p1 = 1, value-2
           do p2 = p1 + 1, value - p1
              do p3 = p2 + 1, (value - (p1 + p2))/2
                 p4 = value - p1 - p2 - p3
                 if (p1 * p2 * p3 * p4 == value * 1000000) &
                      & call output (value, p1, p2, p3, p4)
              end do
           end do
        end do
     end do
  end do
end program main
ig25@linux-fd1f:~/Krempel/Do> gfortran -O2 call_unspec.f90 && time ./a.out >
/dev/null

real    0m4.586s
user    0m4.578s
sys     0m0.000s
ig25@linux-fd1f:~/Krempel/Do> cat call_intent.f90
module foo                         
contains                           
  subroutine output(i1,i2,i3,i4,i5)
    integer, intent(in) :: i1,i2,i3,i4,i5
    print '(5(I0,:" "))',i1,i2,i3,i4,i5
  end subroutine output                
end module foo                         
program main                           
  use foo
  implicit none
  integer :: value
  integer :: p1, p2, p3, p4
  integer :: i

  do value = 750,800
     do i=1, 10
        do p1 = 1, value-2
           do p2 = p1 + 1, value - p1
              do p3 = p2 + 1, (value - (p1 + p2))/2
                 p4 = value - p1 - p2 - p3
                 if (p1 * p2 * p3 * p4 == value * 1000000) &
                 & call output(value , p1 , p2 , p3 , p4)
              end do
           end do
        end do
     end do
  end do
end program main
ig25@linux-fd1f:~/Krempel/Do> gfortran -O2 call_intent.f90 && time ./a.out >
/dev/null

real    0m3.090s
user    0m3.089s
sys     0m0.000s
ig25@linux-fd1f:~/Krempel/Do> cat call_parens.f90
module foo                         
contains                           
  subroutine output(i1,i2,i3,i4,i5)
    print '(5(I0,:" "))',i1,i2,i3,i4,i5
  end subroutine output                
end module foo                         
program main                           
  use foo
  implicit none
  integer :: value
  integer :: p1, p2, p3, p4
  integer :: i

  do value = 750,800
     do i=1, 10
        do p1 = 1, value-2
           do p2 = p1 + 1, value - p1
              do p3 = p2 + 1, (value - (p1 + p2))/2
                 p4 = value - p1 - p2 - p3
                 if (p1 * p2 * p3 * p4 == value * 1000000) &
                 & call output((value),(p1),(p2),(p3),(p4))
              end do
           end do
        end do
     end do
  end do
end program main
ig25@linux-fd1f:~/Krempel/Do> gfortran -O2 call_parens.f90 && time ./a.out >
/dev/null

real    0m3.134s
user    0m3.131s
sys     0m0.000s

Reply via email to