On 10/16/07, David Miller <[EMAIL PROTECTED]> wrote: > From: David Miller <[EMAIL PROTECTED]> > Date: Tue, 16 Oct 2007 03:12:23 -0700 (PDT) > > > I have a bug I'm trying to investigate where, starting in gcc-4.2.x, > > the loop invariant pass considers a computation involving a global > > register variable as invariant across a call. The basic structure > > of the code is: > > Here is the most simplified test case I could come up with, > compile it with "-m64 -Os" on sparc. expression(regval) is > moved to before the loop by loop-invariant > > register unsigned long regval asm("g5"); > > extern void cond_resched(void); > > unsigned int var; > > void *expression(unsigned long regval) > { > void *ret; > > __asm__("" : "=r" (ret) : "0" (&var)); > return ret + regval; > } > > void func(void **pp) > { > int i; > > for (i = 0; i < 56; i++) { > cond_resched(); > *pp = expression(regval); > } > }
loop-invariant.cc uses ud-chain. So if there's something wrong with the chain, it could go nuts. Can you send me the rtl dump of loop2_invariant pass ? -- #pragma ident "Seongbae Park, compiler, http://seongbae.blogspot.com"