On Mon, Nov 15, 2010 at 11:21:30AM -0800, Linus Torvalds wrote: > On Mon, Nov 15, 2010 at 11:12 AM, Jakub Jelinek <ja...@redhat.com> 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