- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The reproducer given below is a simplified adaptation (no reals, smaller arrays, bound checking not involved) of a recently reported bug.
[fortran]! IFort 11.1.073 on Linux IA32 or X64
! Different output with -save -O0
! and -save -O1
program optbug
implicit none
integer :: i, sout
do i=1,2
call sub(i,sout)
write(*,'(1x,I3,2x,I4)')i,sout
end do
end program optbug
! shift values in array dh every second call
subroutine sub(rinp,rout)
implicit none
integer, parameter :: dim = 2
integer :: i, iframe, rinp, rout, dh(dim)
! save iframe,dh
! first call: set default values in array dh
if(rinp.eq.1) then
dh(1:dim)=(/ (i,i=1,dim) /)
iframe=0
endif
if (iframe .eq. 0) then
iframe = 1
do i = 1,dim-1
dh(i) = dh(i+1)
end do
dh(dim) = rinp
else
iframe = 0
end if
rout = dh(dim)
return
end subroutine sub
[/fortran] With the current issues (11.1.073) of the IA-32 and Intel64 compilers, with no options specified in ifort.cfg, here are the results: Note that the -save option is being used in lieu of the SAVE specification in the subroutine. The program assumes that the first argument to the subroutine will be equal to 1 at the first call.[bash]$ ifort -save -O0 bb.f90 $ ./a.out 1 1 2 1
$ ifort -save -O1 bb.f90
$ ./a.out
1 1
2 2
[/bash]
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you very much, mecej4.It is helpful to have check bounds eliminated.This variant is also fixed in the upcoming major release. I will include this in the report to Development and keep this thread updated along with the earlier one.
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page