[llvm-dev] [Release-testers] [7.0.0 Release] rc1 has been tagged
Dimitry Andric via llvm-dev
llvm-dev at lists.llvm.org
Tue Aug 7 12:49:16 PDT 2018
On 6 Aug 2018, at 18:23, Hans Wennborg <hans at chromium.org> wrote:
>
> On Sun, Aug 5, 2018 at 5:49 PM, Dimitry Andric <dimitry at andric.com> wrote:
>> On 3 Aug 2018, at 13:37, Hans Wennborg via Release-testers <release-testers at lists.llvm.org> wrote:
>>>
>>> 7.0.0-rc1 was just tagged (from the branch at r338847).
...
>
>> Hmm, I'm running into a rather nasty snag now on i386-freebsd11, due to our lack of atomic 64 bit primitives; Phase2's configure dies with:
>>
>> -- Performing Test HAVE_CXX_ATOMICS_WITHOUT_LIB
>> -- Performing Test HAVE_CXX_ATOMICS_WITHOUT_LIB - Success
>> -- Performing Test HAVE_CXX_ATOMICS64_WITHOUT_LIB
>> -- Performing Test HAVE_CXX_ATOMICS64_WITHOUT_LIB - Failed
>> -- Looking for __atomic_load_8 in atomic
>> -- Looking for __atomic_load_8 in atomic - not found
...
>> Apparently, with clang 6.0 it didn't generate libcalls to atomic functions, but just put in cmpxchg8b's, I guess? And with clang 7.0 this seems to have changed.
...
> Did you file a bug to track this? (Sorry if you already did, I haven't
> read through the list today.)
This is a regression caused by https://reviews.llvm.org/rL323281:
------------------------------------------------------------------------
r323281 | wmi | 2018-01-23 23:27:57 +0000 (Tue, 23 Jan 2018) | 12 lines
Adjust MaxAtomicInlineWidth for i386/i486 targets.
This is to fix the bug reported in https://bugs.llvm.org/show_bug.cgi?id=34347#c6.
Currently, all MaxAtomicInlineWidth of x86-32 targets are set to 64. However,
i386 doesn't support any cmpxchg related instructions. i486 only supports cmpxchg.
So in this patch MaxAtomicInlineWidth is reset as follows:
For i386, the MaxAtomicInlineWidth should be 0 because no cmpxchg is supported.
For i486, the MaxAtomicInlineWidth should be 32 because it supports cmpxchg.
For others 32 bits x86 cpu, the MaxAtomicInlineWidth should be 64 because of cmpxchg8b.
Differential Revision: https://reviews.llvm.org/D42154
------------------------------------------------------------------------
I'm not sure whether we should report this as an LLVM bug though, since
the problem really lies with FreeBSD: we never had proper atomic
libcalls in our libc (at least the 64 bit ones for 32-bit x86), nor a
separate libatomic.
Before r323281, and with all released versions of clang to date, it
actually generated incorrect instructions for the default target CPU,
if you used the triple i386-unknown-freebsd, e.g.:
$ ~/obj/clang-323280/bin/clang -m32 -O2 -S atomic-test.cpp -o -
[...]
pushl %ebp
movl %esp, %ebp
pushl %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %ecx, %ecx
xorl %ebx, %ebx
lock cmpxchg8b x
xorl %eax, %eax
popl %ebx
popl %ebp
retl
After r323281, this is corrected:
$ ~/obj/clang-323281/bin/clang -m32 -O2 -S atomic-test.cpp -o -
[...]
pushl %ebp
movl %esp, %ebp
pushl $0
pushl $x
calll __atomic_load_8
addl $8, %esp
xorl %eax, %eax
popl %ebp
retl
Targeting i586 or higher makes the cmpxchg8b come back:
$ ~/obj/clang-323281/bin/clang -m32 -march=i586 -O2 -S atomic-test.cpp -o -
[...]
pushl %ebp
movl %esp, %ebp
pushl %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %ecx, %ecx
xorl %ebx, %ebx
lock cmpxchg8b x
xorl %eax, %eax
popl %ebx
popl %ebp
retl
I think there are other scenarios where you could cause atomic libcalls
to appear, though, even if you target higher CPUs.
That said, we'll have to at least discuss this in the FreeBSD community,
since I think it is high time it is fixed on *that* side.
-Dimitry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180807/98430a99/attachment.sig>
More information about the llvm-dev
mailing list