glennrp@BRL.MIL (Glenn Randers-Pehrson, TBD|WMB) (01/15/91)
I have encountered several more bugs with the IRIX 3.3.1 f77 compiler when used with -O2. These are worse than the one I reported last week, in that the compiler silently produces bogus code, instead of the core dump. I'll provide sources to anyone who is interested. One class of statements causing problems involves the INQUIRE statement, where the same logical variable appears in several INQUIRE statements, as "isopen" in inquire(8,opened=isopen) if(isopen).... inquire(9,opened=isopen) if(isopen)... The optimizer apparently does not recognize that the INQUIRE statement assigns a new value to "isopen". Another seems to involve an assumption by the programmer about storage association, that the optimizer apparently did not recognize: subroutine sub(array)) dimension array(6) common /a/ j,r(5) do 10 i=1,6 10 r(i-1)=array(i) The loop is supposed to copy the contents of the first element of "array" into "j", without doing a float-to-integer conversion. In the code, "j" does get properly defined, but the optimizer gets goofed up later on in the program, with entirely different variables. When I rewrote this coding to be a little more explicit, but still horrible to look at, then the problem went away. subroutine sub(array)) dimension array(6) common /a/ j,r(5) equivalence (rj,j) rj=array(1) do 10 i=2,5 10 r(i-1)=array(i) ...Glenn Randers-Pehrson <glennrp@brl.mil>
glennrp@BRL.MIL (Glenn Randers-Pehrson, TBD|WMB) (01/15/91)
Here's a complete example of one of the bugs I described recently. Hardware: IRIX 220GTX OS: IRIX 3.3.1 taylor.brl.mil> f77 -O1 inquirebug.f taylor.brl.mil> a.out # 8 is the correct answer 8 taylor.brl.mil> f77 -O2 inquirebug.f taylor.brl.mil> a.out # 19 is wrong 19 program inquirebug open(19) open(20) call inqbug end subroutine inqbug save logical exists,isopen,inuse integer inqfile data inqfile/19/ c find an available unit number isopen=.false. inquire(inqfile,exist=exists,err=70,iostat=junk) if(exists)inquire(inqfile,opened=isopen,err=70,iostat=junk) inuse=exists.and.isopen if(.not.inuse)go to 30 do 20 i=8,99 inqfile=i inquire(inqfile,exist=exists,err=70,iostat=junk) isopen=.false. if(exists)inquire(inqfile,opened=isopen,err=70,iostat=junk) inuse=exists.and.isopen if(.not.inuse)go to 30 20 continue write(*,*)' inqbug: No available unit.' go to 70 30 continue write(*,*)' inqbug: unit=',inqfile 65 close(inqfile,err=70) 70 continue return end The other program needs to be stripped down a bit more before I would feel comfortable sending it out. It's about 30K lines now. ...Glenn Randers-Pehrson <glennrp@brl.mil>