llvm calling convention matters
Simon Marlow
marlowsd at gmail.com
Wed Sep 18 20:22:40 UTC 2013
On 18/09/13 20:01, Geoffrey Mainland wrote:
> We did discuss this, but you may not have been present.
>
> If LLVM-only primops show up in a non-LLVM codegen, a "sorry" error is
> reported telling the user that they need to compile with "-fllvm". Yes,
> this is not a fantastic solution. Options I see:
>
> 1) Live with the error message.
> 2) Remove all SIMD support until the NCG catches up.
> 3) Figure out a mechanism that avoids inlining any code containing
> LLVM-only primops when we're not using the LLVM back end.
>
> Maybe you can think of another solution?
Those are the three unsatisfactory solutions that I know of. Even if we
did (3), the user still wants to know when that is happening because
they're getting less good code, so you'd want a warning.
One thing we might try to do is automatically enable -fllvm when the
compilation would otherwise fail. If LLVM isn't installed and the
compilation still fails, it's no worse than failing to compile the
module with the sorry error.
Simon
> Geoff
>
> On 09/18/2013 02:54 PM, Simon Marlow wrote:
>> This is slightly problematic. What if we have a wonderful
>> SIMD-enabled vector library that we compile with -fllvm, and then use
>> it in a program that isn't compiled with -fllvm, and some of the
>> wonderful SIMD-enabled functions get inlined? Presumably we get a
>> panic in the NCG.
>>
>> Did we discuss this before? I have vague memories, but don't remember
>> what the outcome was.
>>
>> Cheers,
>> Simon
>>
>> On 12/09/13 03:10, Geoffrey Mainland wrote:
>>> We support compiling some code with -fllvm and some not in the same
>>> executable. Otherwise how could users of the Haskell Platform link their
>>> -fllvm-compiled code with native-codegen-compiled libraries like
>>> base, etc.?
>>>
>>> In other words, the LLVM and native back ends use the same calling
>>> convention. With my SIMD work, they still use the same calling
>>> conventions, but the native codegen can never generate code that uses
>>> SIMD instructions.
>>>
>>> Geoff
>>>
>>> On 09/11/2013 10:03 PM, Johan Tibell wrote:
>>>> OK. But that doesn't create a problem for the code we output with the
>>>> LLVM backend, no? Or do we support compiling some code with -fllvm and
>>>> some not in the same executable?
>>>>
>>>>
>>>> On Wed, Sep 11, 2013 at 6:56 PM, Geoffrey Mainland
>>>> <mainland at apeiron.net <mailto:mainland at apeiron.net>> wrote:
>>>>
>>>> We definitely have interop between the native codegen and the LLVM
>>>> back
>>>> end now. Otherwise anyone who wanted to use the LLVM back end
>>>> would have
>>>> to build GHC themselves. Interop means that users can install the
>>>> Haskell Platform and still use -fllvm when it makes a performance
>>>> difference.
>>>>
>>>> Geoff
>>>>
>>>> On 09/11/2013 07:59 PM, Johan Tibell wrote:
>>>> > Do nothing different than you're doing for 7.8, we can sort
>>>> it out
>>>> > later. Just put a comment on the primops saying they're
>>>> LLVM-only. See
>>>> > e.g.
>>>> >
>>>> >
>>>> >
>>>>
>>>> https://github.com/ghc/ghc/blob/master/compiler/prelude/primops.txt.pp#L181
>>>> >
>>>> > for an example how to add docs to primops.
>>>> >
>>>> > I don't think we need interop between the native and the LLVM
>>>> > backends. We don't have that now do we (i.e. they use different
>>>> > calling conventions).
>>>> >
>>>> >
>>>> >
>>>> > On Wed, Sep 11, 2013 at 4:51 PM, Geoffrey Mainland
>>>> > <mainland at apeiron.net <mailto:mainland at apeiron.net>
>>>> <mailto:mainland at apeiron.net <mailto:mainland at apeiron.net>>>
>>>> wrote:
>>>> >
>>>> > On 09/11/2013 07:44 PM, Johan Tibell wrote:
>>>> > > On Wed, Sep 11, 2013 at 4:40 PM, Geoffrey Mainland
>>>> > <mainland at apeiron.net <mailto:mainland at apeiron.net>
>>>> <mailto:mainland at apeiron.net <mailto:mainland at apeiron.net>>>
>>>> wrote:
>>>> > > > Do you mean we need a reasonable emulation of the SIMD
>>>> primops for
>>>> > > > the native codegen?
>>>> > >
>>>> > > Yes. Reasonable in the sense that it computes the right
>>>> result.
>>>> > I can
>>>> > > see that some code might still want to #ifdef (if the
>>>> fallback isn't
>>>> > > fast enough).
>>>> >
>>>> > Two implications of this requirement:
>>>> >
>>>> > 1) There will not be SIMD in 7.8. I just don't have the
>>>> time. In fact,
>>>> > what SIMD support is there already will have to be
>>>> removed if we
>>>> > cannot
>>>> > live with LLVM-only SIMD primops.
>>>> >
>>>> > 2) If we also require interop between the LLVM back-end and
>>>> the native
>>>> > codegen, then we cannot pass any SIMD vectors in
>>>> registers---they all
>>>> > must be passed on the stack.
>>>> >
>>>> > My plan, as discussed with Simon PJ, is to not support SIMD
>>>> primops at
>>>> > all with the native codegen. If there is a strong feeling
>>>> that
>>>> > this *is
>>>> > not* the way to go, the I need to know ASAP.
>>>> >
>>>> > Geoff
>>>> >
>>>> >
>>>> >
>>>>
>>>>
>>>
>>
>
More information about the ghc-devs
mailing list