<div dir="ltr">Simon,<br><br>I really enjoyed reading this paper... I was wondering if you could comment on the implementation of Strict Core? Was it ever implemented in GHC (even as a proof-of-concept)? If not, was it just due to a lack of time or some fundamental limitation or problem discovered after the paper? If it was implemented, was any benefit actually measured? Can you speculate on whether some of the more recent changes/additions to Core (such as coercions and roles) might fit into this? (I don't see any obvious reason they couldn't, but that is me.)<br><br>Thanks!<div>Andrew</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 23, 2015 at 7:11 AM, Simon Peyton Jones <span dir="ltr"><<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-GB" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">It’s absolutely the case that bang patterns etc tell the caller what to do, but the function CANNOT ASSUME that its argument is evaluated.  Reason: higher order functions.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">I think that the way to allow functions that can assume their arg is evaluated is through types: see
<a href="http://research.microsoft.com/~simonpj/papers/strict-core/tacc-hs09.pdf" target="_blank">
Type are calling conventions</a>.  But it’d be a fairly big deal to implement.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">Simon<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Calibri",sans-serif">                                  
<u></u><u></u></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> ghc-devs [mailto:<a href="mailto:ghc-devs-bounces@haskell.org" target="_blank">ghc-devs-bounces@haskell.org</a>]
<b>On Behalf Of </b>Ryan Newton<br>
<b>Sent:</b> 23 October 2015 14:54<br>
<b>To:</b> <a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a>; Ömer Sinan Ağacan; Ryan Scott; Chao-Hong Chen; Johan Tibell<br>
<b>Subject:</b> Better calling conventions for strict functions (bang patterns)?<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
Hi all,<u></u><u></u></p>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
With module-level Strict and StrictData pragmas coming soon, one obvious question is what kind of the code quality GHC can achieve for strict programs.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
When it came up in discussion in our research group we realized we didn't actually know whether the bang patterns, `f !x`, on function arguments were enforced by caller or callee.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
Here's a Gist that shows the compilation of a trivial function:<u></u><u></u></p>
</div>
<div>
<table border="0" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border-spacing:0px">
<tbody>
<tr>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#795da3">foo</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">::</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">Maybe</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">Int</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">-></span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">Int</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">foo !x =<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">  </span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">case</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> x
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">of</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">   </span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">Just</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> y -> y<u></u><u></u></span></p>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
   <a href="https://na01.safelinks.protection.outlook.com/?url=https%3a%2f%2fgist.github.com%2frrnewton%2f1ac722189c65f26fe9ac&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7cb006dcdbfe834ebb6c1e08d2dbb16c03%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=qxrT8r1VSP97xQUF2qqkLlxEtSGi9VOzfmORl25W%2fWY%3d" target="_blank"><font color="red"><b>MailScanner has detected a possible fraud attempt from "na01.safelinks.protection.outlook.com" claiming to be</b></font> https://gist.github.com/rrnewton/1ac722189c65f26fe9ac</a><u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
If that function is compiled to *assume* its input is in WHNF, it should be just as efficient as the isomorphic MLton/OCaml code, right?  It only needs to branch on the tag, do a field dereference, and return.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
But as you can see from the STG and CMM generated, foo <i>does indeed</i> enter the thunk, adding an extra indirect jump.  Here's the body:<u></u><u></u></p>
</div>
<div>
<table border="0" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border-spacing:0px">
<tbody>
<tr>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3aY:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">if</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> ((Sp + -</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">)
 < SpLim) </span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">goto</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> c3aZ;
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">else</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">goto</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> c3b0;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3aZ:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#969896">// nop</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"><u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          R1 = PicBaseReg + foo_closure;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">call</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> (I64[BaseReg -
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">])(R2, R1) args:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, res:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">0</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, upd:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3b0:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          I64[Sp -
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">] = PicBaseReg + block_c3aO_info;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          R1 = R2;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          Sp = Sp -
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">if</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> (R1 &
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">7</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> !=
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">0</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">)
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">goto</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> c3aO;
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">else</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">goto</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> c3aP;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3aP:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">call</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> (I64[R1])(R1) returns to c3aO, args:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, res:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, upd:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3aO:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">if</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> (R1 &
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">7</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> >=
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">2</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">)
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">goto</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> c3aW;
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">else</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">
</span><span style="font-size:9.0pt;font-family:Consolas;color:#a71d5d">goto</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> c3aX;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3aW:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          R1 = P64[R1 +
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">6</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">] & (-</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">);<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          Sp = Sp +
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">call</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> (I64[R1])(R1) args:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, res:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">0</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, upd:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">      c3aX:<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          R1 = PicBaseReg + lvl_r39S_closure;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          Sp = Sp +
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
<tr>
<td width="50" nowrap valign="top" style="width:37.5pt;border:solid #eeeeee 1.0pt;border-top:none;padding:0cm 7.5pt 0cm 7.5pt;min-width:50px;color:rgba(0,0,0,0.298039)">
</td>
<td valign="top" style="padding:0cm 7.5pt 0cm 7.5pt;word-wrap:normal;overflow:visible">
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm;line-height:13.65pt">
<span style="font-size:9.0pt;font-family:Consolas;color:#333333">          </span>
<span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">call</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333"> (I64[R1])(R1) args:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, res:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">0</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">, upd:
</span><span style="font-size:9.0pt;font-family:Consolas;color:#0086b3">8</span><span style="font-size:9.0pt;font-family:Consolas;color:#333333">;<u></u><u></u></span></p>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
The call inside c3aP is entering "x" as a thunk, which also incurs all of the stack limit check code.  I believe that IF the input could be assumed to be in WHNF, everything above the label "c3aO" could be omitted.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
<u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal" style="margin-right:0cm;margin-bottom:6.0pt;margin-left:0cm">
So... if GHC is going to be a fabulous pure <i>and</i> imperative language, and a fabulous lazy
<i>and</i> strict compiler/runtime.. is there some work we can do here to improve this situation? Would the following make sense:<u></u><u></u></p>
</div>
<div>
<ul type="disc">
<li class="MsoNormal">
Put together a benchmark suite of all-strict programs with Strict/StrictData (compare a few benchmark's generated code to MLton, if time allows)<u></u><u></u></li><li class="MsoNormal">
Modify GHC to change calling conventions for bang patterns -- caller enforces WHNF rather than callee.  Existing strictness/demand/cardinality analysis would stay the same.<u></u><u></u></li></ul>
</div>
<div>
<p class="MsoNormal">Unless there's something I'm really missing here, the result should be that you can have a whole chain of strict function calls, each of which knows its arguments and the arguments it passes to its callees are all in WHNF, without ever
 generating thunk-entry sequences.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Thanks for your time,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  -Ryan<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>
</div>

<br>_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
<br></blockquote></div><br></div>