[PATCH] D32782: Add pthread_self function prototype and make it speculatable.
Xin Tong via llvm-commits
llvm-commits at lists.llvm.org
Sat May 20 16:27:21 PDT 2017
Let me revert that. thanks for raising the issue. I will take a closer look.
Thanks
-Xni
On Sun, May 21, 2017 at 8:21 AM, Davide Italiano <dccitaliano at gmail.com> wrote:
> On Sat, May 20, 2017 at 3:51 PM, Peter Collingbourne <peter at pcc.me.uk> wrote:
>> Couldn't pthread_self() return a different value if fork() is called in the
>> body of the loop?
>>
>
> I was worried about a case where this could break but I wasn't able to
> find a counterexample.
> I guess yours holds. FWIW, I'm not sure what's the interaction between
> fork() and pthread_self() but if fork()'ing can actually change the
> value, GCC miscompiles the following code. Xin, I recommend to revert
> this one until we get a better understanding.
>
> #include <pthread.h>
> #include <unistd.h>
>
> extern void x(pthread_t);
>
> int foo(int n) {
> for (int i = 0; i < n; i++) {
> auto id = pthread_self();
> x(id);
> fork();
> }
> }
> foo(int):
> test edi, edi
> jle .L6
> push r12
> push rbp
> mov ebp, edi
> push rbx
> xor ebx, ebx
> call pthread_self
> mov r12, rax
> .L3:
> mov rdi, r12
> add ebx, 1
> call x(unsigned long)
> call fork
> cmp ebp, ebx
> jne .L3
> pop rbx
> pop rbp
> pop r12
> ret
> .L6:
> rep ret
--
Software Engineer - Compiler Toolchain
Employee of Facebook Inc.
More information about the llvm-commits
mailing list