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