https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98110
--- Comment #15 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #13)
> And no, the asm isn't marked volatile, that would have prevented it too:
> # define THREAD_SELF \
> ({ struct pthread *__self;
> \
> asm ("mov %%fs:%c1,%0" : "=r" (__self)
> \
> : "i" (offsetof (struct pthread, header.self)));
> \
> __self;})
> This all boils down to:
> void
> foo (int *p)
> {
> for (int i = 0; i < 64; i++)
> {
> if (p[i])
> {
> int *q;
> asm ("mov %%fs:%c1,%0" : "=r" (q) : "i" (16));
> q[0]++;
> }
> }
> }
> which would hoist the inline asm to the function prologue even in GCC 4.1.
I suppose we'd need to mark it possibly trapping (which it actually does),
but I think there's no good way to do this.