On 11/15/2010 08:51 PM, Jakub Jelinek wrote: > On Mon, Nov 15, 2010 at 11:21:30AM -0800, Linus Torvalds wrote: >> On Mon, Nov 15, 2010 at 11:12 AM, Jakub Jelinek wrote: >>> >>> Ah, the problem is that memory_identifier_string is only initialized in >>> ipa-reference.c's initialization, so it can be (and is in this case) NULL in >>> ipa-pure-const.c. >> >> Ok. And I guess you can verify that all versions of gcc do this >> correctly for "asm volatile"? > > Yes, reading 4.1/4.2/4.3/4.4/4.5/4.6 code ipa-pure-const.c handles > asm volatile correctly, in each case the function is no longer assumed to be > pure or const in the discovery (of course, user can still say the > function is const or pure). 4.0 and earlier didn't have ipa-pure-const.c. > > Using the simplified > > extern void abort (void); > > __attribute__((noinline)) int > foo (int *p) > { > int r; > asm ("movl $6, (%1)\n\txorl %0, %0" : "=r" (r) : "r" (p) : "memory"); > return r; > } > > int > main (void) > { > int p = 8; > if ((foo (&p) ? : p) != 6) > abort (); > return 0; > } > > testcase shows that in 4.1/4.2/4.3/4.4 this is miscompiled only when using > -fno-ipa-reference, in 4.5 it is miscompiled always when optimizing > unless -fno-ipa-pure-const (as 4.5 added local-pure-const pass which is run > before ipa-reference) and in 4.6 this has been fixed by Honza when > doing ipa cleanups. > >> Because since we'll have to work around this problem in the kernel, I >> suspect the simplest solution is to remove the "+m" that causes >> register pressure problems, and then use "asm volatile" to work around >> the const-function bug. > > Yes. > > Jakub > Linus, In case you didn't already fixed this, here's the follow-up patch. --- The fix to work around the gcc miscompiling i8k.c to add "+m (*regs)" caused register pressure problems. Changing the 'asm' statement to 'asm volatile' instead should prevent that and works around the gcc bug as well. Signed-off-by: Jim Bos