<div dir="ltr">hey all, <div><br></div><div style>first let me preface by saying I am in favor of breaking and updating/modernizing the GHC ABI. </div><div style><br></div><div style>I just think that for a number of reasons, it doesn&#39;t make sense to do it for the 7.8 release, but rather start work on it in another month or so, so we can systematically have a better set of ABI, and keep all the code gens are first class citizens. (also work out the type system changes need to be able to correctly use SIMD shuffles, which are currently inexpressible correctly with GHC&#39;s type system. Simd Shuffles are crucial for interesting levels of SIMD performance!)</div>

<div><br><div>the reason I don&#39;t want to make the ABI change right now is because then we&#39;d have to wait until after llvm 3.4 gets released in like 6 months before giving them another breaking change!</div><div> (OR start baking a LLVM into GHC, which is a leap we&#39;re not 100% on, though theres clear good reasons for why! ).</div>

<div><br></div><div>  Basically, if we make breaking changes to the ABI now (and thus have split ABI for llvm 3.4HEAD vs earlier), and then we do fixups or more breakage for 7.10, then when 7.10 rolls around (perhaps late next spring or sometime in the summer, perhaps?), the only supported llvm version for 7.10 would be LLVM HEAD / 3.5 (which won&#39;t be released till some time thereafter)! Unless we go ahead and break the 3.4 ABI to 7.10 rather than 7.8 abi (whatever that would entai, which would ).  This is assuming the ~ 7-8 months between major version releases cycle that LLVM has done of late</div>

<div><br></div><div style>additionally, as Johan remarked today on a pending patch of mine, having operations only work on the llvm backend, and not on the native code gen is pretty problematical!  see  <a href="http://ghc.haskell.org/trac/ghc/ticket/8256">http://ghc.haskell.org/trac/ghc/ticket/8256</a> </div>

<div style><br></div><div style>tl;dr : Unless we&#39;re throwing away native code gen backend next month, we probably want to actually not increase their capability gap / current ABI incompatibility right before 7.8 release. I am willing to help explore modernizing the native code gens so that they have parity with the llvm backends. Additionally, boxing ourselves in a corner where for 7.10 the only llvm with the right ABI will be llvm 3.5 seems totally unacceptable from an end users / distribution package managers standpoint, and a huge support headache for the  community. </div>

<div style><br></div><div style>I&#39;ve had to help deal with the support headache of the xcode5 clang + ghc issues on OS X,  A LOT,  in the past 2 months, I&#39;m not keen on deliberately creating similar support disasters for myself and others. </div>

<div style><br></div><div style>that said: I absolutely agree that we should fix up the ABI, have a clear story for XMM, YMM, and ZMM registers, and if you&#39;ve been following trac tickets at all, you&#39;ll see theres even a type system issue in properly handling the SIMD shuffles! i briefly sketch out the issue in <a href="http://ghc.haskell.org/trac/ghc/ticket/8107">http://ghc.haskell.org/trac/ghc/ticket/8107</a> (last comment)</div>

<div style><br></div><div style>that said: i&#39;m open to being convinced i&#39;m wrong, and I absolutely understand your motivations for wanting it now, but I really believe that doing so right now will create a number of problems that are better off evaded to begin with</div>

<div style><br></div><div style>cheers</div><div style>-Carter</div><div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Sep 11, 2013 at 5:49 PM, Geoffrey Mainland <span dir="ltr">&lt;<a href="mailto:mainland@cs.drexel.edu" target="_blank">mainland@cs.drexel.edu</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Carter,<br>
<div><div class="h5"><br>
On 09/06/2013 03:24 PM, Carter Tazio Schonwald wrote:<br>
&gt; Hey Geoff,<br>
<br>
&gt; I&#39;m leary about doing a calling convention change right before the ghc<br>
&gt; release (and I&quot;m happy to elaborate more on the phone some time) 1)<br>
&gt; I&#39;d rather we test the patches on llvm locally ourselves before going<br>
&gt; upstream 2) doing that AVX change on the calling convention now, would<br>
&gt; make it harder to make a more systematic exploration of calling<br>
&gt; convention changes post 7.8 release, because we would face either<br>
&gt; breaking the llvm head/3.4 changes, or having to wait till the next<br>
&gt; llvm release cycle (3.5?!) to upstream any more systematic<br>
&gt; changes. (such as adding substantially more SIMD registers to the GHC<br>
&gt; calling convention!)<br>
&gt;<br>
&gt; I understand your likely motivation for wanting the calling convention<br>
&gt; landing in the 7.8 release, namely it may eke an easy 2x perf boost in<br>
&gt; your stream fusion libs, i just worry that the change would ultimately<br>
&gt; cut off our ability to do more aggressive experimentation and<br>
&gt; improvements (eg more simd registers!) for ghc 7.10 over the next<br>
&gt; year?<br>
&gt;<br>
&gt; on an unrelated note: I will spend some time this weekend given you<br>
&gt; the various simd operations I want / think are valuable. the low<br>
&gt; hanging fruit would be figuring out a good haskell type / analogue of<br>
&gt; the llvm __builtin_shuffle(a,b,c) primop, because that usually should<br>
&gt; generate decent code. I&#39;ll work out the details of this and some other<br>
&gt; examples and send it your way in the next few days<br>
&gt;<br>
&gt; -Carter<br>
<br>
</div></div>Currently, on x86-64 we pass floats, doubles, and 128-bit wide SIMD<br>
vectors in xmm1-xmm6. I propose that we change the calling conventions<br>
to pass 256-bit wide SIMD vectors in ymm1-ymm6 and 512-bit wide SIMD<br>
vectors in zmm1-zmm6. I don&#39;t know why GHC doesn&#39;t use xmm0 or xmm7, as<br>
the Linux C calling convention uses xmm0-xmm7. Simon, perhaps you know<br>
why? I get that we only needed 6 registers originally, F1-F4, D1-D2),<br>
but why count from one rather than zero?<br>
<br>
On x86-32, we pass floats, double, and all SIMD vectors on the stack. I<br>
propose that we pass 128-bit wide SIMD vectors in xmm0-xmm2, and make<br>
analogous arrangements for 256- and 512-bit SIMD vectors. We will still<br>
pass floats and doubles on the stack. This matches the Linux x86 32-bit<br>
C calling convention.<br>
<br>
I think these are fairly conservative changes. I also don&#39;t think we<br>
should be afraid of revising the calling convention for GHC 7.10. Surely<br>
the LLVM folks won&#39;t be upset if we send them one set of patches a year<br>
instead of one set of patches every two years.<br>
<br>
Geoff<br>
<br>
</blockquote></div><br></div>