[FFmpeg-devel] fate : clang x86
Måns Rullgård
mans
Tue Aug 31 13:40:32 CEST 2010
Alexander Strange <astrange at ithinksw.com> writes:
> On Aug 23, 2010, at 6:57 PM, M?ns Rullg?rd wrote:
>
>> Eli Friedman <eli.friedman at gmail.com> writes:
>>
>>> 2010/8/21 M?ns Rullg?rd <mans at mansr.com>:
>>>> Eli Friedman <eli.friedman at gmail.com> writes:
>>>>
>>>>> 2010/8/21 M?ns Rullg?rd <mans at mansr.com>:
>>>>>> castet.matthieu at free.fr writes:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> on freebsd "-mllvm -regalloc=fast" cflags are used to make clang/llvm accept
>>>>>>> some inline asm.
>>>>>>>
>>>>>>> May be we should do the same on linux ?
>>>>>>
>>>>>> I tried and failed to figure out what that flag does. I assume it
>>>>>> does something with the register allocator, but I'd like to know what.
>>>>>
>>>>> It's a workaround of sorts for
>>>>> http://llvm.org/bugs/show_bug.cgi?id=4668 . LLVM essentially has two
>>>>> register allocator implementations: one is the "fast" allocator, which
>>>>> is a local register allocator used for -O0, and the other is the
>>>>> "linear scan" allocator, which is the slower global register allocator
>>>>> used for -O1+. "-mllvm -regalloc=fast" forces the use of the "fast"
>>>>> allocator, which leads to slower generated code, but isn't affected by
>>>>> the bug in question.
>>>>
>>>> Sounds like it's not suitable for production use. Any chance they'll
>>>> fix the bug?
>>>
>>> In the near future? Not very likely... from what I understand, it's a
>>> relatively difficult issue to solve, and bugs rejecting valid inline
>>> asm are generally considered low priority for the people who know the
>>> register allocator well enough to fix this.
>>
>> That leaves two options:
>>
>> 1. Declare clang officially unsupported for x86_32.
>> 2. Fix our code.
>
> For reference, this is the error:
>
> fatal error: error in backend: Ran out of registers during register allocation!
> Please check your inline asm statement for invalid constraints:
> INLINEASM <es:movd %eax, %xmm3
> pshuflw $$0, %xmm3, %xmm3
> punpcklwd %xmm3, %xmm3
> pxor %xmm7, %xmm7
> pxor %xmm4, %xmm4
> movdqa ($2), %xmm5
> pxor %xmm6, %xmm6
> psubw ($3), %xmm6
> mov $$-128, %eax
> .p2align 4
> 1:
> movdqa ($1, %eax), %xmm0
> movdqa %xmm0, %xmm1
> pabsw %xmm0, %xmm0
> psubusw %xmm6, %xmm0
> pmulhw %xmm5, %xmm0
> por %xmm0, %xmm4
> psignw %xmm1, %xmm0
> movdqa %xmm0, ($5, %eax)
> pcmpeqw %xmm7, %xmm0
> movdqa ($4, %eax), %xmm1
> movdqa %xmm7, ($1, %eax)
> pandn %xmm1, %xmm0
> pmaxsw %xmm0, %xmm3
> add $$16, %eax
> js 1b
> movhlps %xmm3, %xmm0
> pmaxsw %xmm0, %xmm3
> pshuflw $$0x0E, %xmm3, %xmm0
> pmaxsw %xmm0, %xmm3
> pshuflw $$0x01, %xmm3, %xmm0
> pmaxsw %xmm0, %xmm3
> movd %xmm3, %eax
> movzb %al, %eax
> >, 0, 10, %EAX<imp-def>, 9, %reg1309<kill>, 9, %reg1317, 9, %reg1305<kill>, 9, %reg1312<kill>, 9, %reg1310<kill>, 2147483657, %EAX, 14, %EFLAGS<earlyclobber,imp-def,dead>, <!-1>; GR32:%reg1309,1317,1305,1312,1310 dbg:libavcodec/x86/mpegvideo_mmx_template.c:152:9
>
> It only happens (on Darwin x86-32 at least) without
> -fomit-frame-pointer, which is already not the default
> configuration. How are they building it?
I'm using default configure apart from --cc=clang --extra-cflags=-m32.
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list