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.

Reply via email to