Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!ELF.STANFORD.EDU!eirik From: eirik@ELF.STANFORD.EDU (Eirik Fuller) Newsgroups: gnu.gcc.bug Subject: optimizer bug Message-ID: <8904111000.AA07961@elf.Stanford.EDU> Date: 11 Apr 89 10:00:37 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 43 gcc 1.34 compiles the enclosed program incorrectly on a Tek 4316, when invoked with -O. Since the gcc configuration for the 4316 is similar to the Sun 3 (68020/68881, m68k.md, tm-m68k.h), the same problem might also occur on a Sun 3 configured for a 68881. bug.c: main() { double d = 2, *p = &d; exit ( *p ? 0 : 1 ); } bug.s: #NO_APP gcc_compiled.: .text .even .globl _main _main: link a6,#-8 movel #1073741824,a6@(-8) clrl a6@(-4) jeq L2 clrl d0 jra L3 L2: moveq #1,d0 L3: movel d0,sp@- jbsr _exit unlk a6 rts If I might venture a guess about what's going on ... the two instructions after the link (movel,clrl) move the two halves of 2.0 into the stack frame (double d in bug.c). Before optimization there is an explicit compare against 0.0; after optimization the process of moving 2.0 onto the stack is allowed to set the condition code. It seems reversing the order of these two instructions (clrl,movel) would give correct code, though the conditional branch could, in principle, be optimized out entirely in this case.