<div dir="ltr">yet more<div><a href="https://llvm.org/bugs/show_bug.cgi?id=25552">https://llvm.org/bugs/show_bug.cgi?id=25552</a>;<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 24, 2015 at 11:44 AM, Eliot Miranda <span dir="ltr">&lt;<a href="mailto:eliot.miranda@gmail.com" target="_blank">eliot.miranda@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br><div dir="ltr">Hi All,<div><br></div><div>    I&#39;m trying to use clang in Xcode on Mac OS X to compile a new 32-bit VM.  One of my installations is Mavericks 10.9 with Xcode 6.2 and clang 6.0.  The other is 10.10.5 with Xcode 7.1 and clang 7.0.  Both seem to have problems with the integer side of bytecodePrimMultiply, the interpreter&#39;s multiplication routine:</div><div><br></div><div><div><div>        CASE(184)</div><div>            /* bytecodePrimMultiply */</div><div>            {</div><div>                sqInt arg;</div><div>                sqInt rcvr;</div><div>                sqInt result;</div><div>                char *sp;</div><div><br></div><div>                VM_LABEL(bytecodePrimMultiply);</div><div>                rcvr = longAtPointer(localSP + (1 * BytesPerOop));</div><div>                arg = longAtPointer(localSP + (0 * BytesPerOop));</div><div>                if (((rcvr &amp; arg) &amp; 1) != 0) {<span style="white-space:pre-wrap">                        // both SmallIntegers?</span></div><div>                    rcvr = (rcvr &gt;&gt; 1);<span style="white-space:pre-wrap">                                // convert from SmallInteger to value</span></div><div>                    arg = (arg &gt;&gt; 1);</div><div>                    result = rcvr * arg;<span style="white-space:pre-wrap">                                // multiply</span></div><div>                    if ((arg == 0)</div><div>                     || (((result / arg) == rcvr)<span style="white-space:pre-wrap">                        // check for overflow</span></div><div>                     &amp;&amp; ((((sqInt)(result ^ (result &lt;&lt; 1)))) &gt;= 0))) {<span style="white-space:pre-wrap">        // check for SmallInteger overflow</span></div><div>                        /* begin internalPop:thenPush: */</div><div>                        longAtPointerput((localSP += (2 - 1) * BytesPerOop), ((result &lt;&lt; 1) | 1));</div><div>                        /* begin fetchNextBytecode */</div><div>                        currentBytecode = byteAtPointer(++localIP);</div><div><br></div><div>                        goto l58;</div><div>                    }</div><div>                }</div><div>                else {</div></div><div><br></div><div>clang 6 inserts a spurious instruction at 0x36799:</div><div><br></div><div>0x36784:<span style="white-space:pre-wrap">        </span>89 ca<span style="white-space:pre-wrap">                        </span>movl<span style="white-space:pre-wrap">        </span>%ecx, %edx<span style="white-space:pre-wrap">        // both SmallIntegers?</span></div><div>0x36786:<span style="white-space:pre-wrap">        </span>83 e2 01<span style="white-space:pre-wrap">                        </span>andl<span style="white-space:pre-wrap">        </span>$0x1, %edx</div><div>0x36789:<span style="white-space:pre-wrap">        </span>85 d0<span style="white-space:pre-wrap">                        </span>testl<span style="white-space:pre-wrap">        </span>%eax, %edx</div><div>0x3678b:<span style="white-space:pre-wrap">        </span>74 6b<span style="white-space:pre-wrap">                        </span>je<span style="white-space:pre-wrap">                </span>0x367f8</div><div>0x3678d:<span style="white-space:pre-wrap">        </span>d1 f9<span style="white-space:pre-wrap">                        </span>sarl<span style="white-space:pre-wrap">                </span>%ecx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">// convert from SmallInteger to value</span></div><div>0x3678f:<span style="white-space:pre-wrap">        </span>d1 f8<span style="white-space:pre-wrap">                        </span>sarl<span style="white-space:pre-wrap">                </span>%eax</div><div>0x36791:<span style="white-space:pre-wrap">        </span>0f af c8<span style="white-space:pre-wrap">                        </span>imull<span style="white-space:pre-wrap">        </span>%eax, %ecx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        // do the multiply</span></div><div>0x36794:<span style="white-space:pre-wrap">        </span>8d 14 09<span style="white-space:pre-wrap">                        </span>leal<span style="white-space:pre-wrap">                </span>(%ecx,%ecx), %edx</div><div>0x36797:<span style="white-space:pre-wrap">        </span>85 c0<span style="white-space:pre-wrap">                        </span>testl<span style="white-space:pre-wrap">        </span>%eax, %eax</div><div>0x36799:<span style="white-space:pre-wrap">        </span>89 f7<span style="white-space:pre-wrap">                        </span>movl<span style="white-space:pre-wrap">        </span>%esi, %edi<span style="white-space:pre-wrap">        // AFAICS, totally spurious</span></div><div>0x3679b:<span style="white-space:pre-wrap">        </span>74 08<span style="white-space:pre-wrap">                        </span>je<span style="white-space:pre-wrap">                </span>0x367a5</div><div>0x3679d:<span style="white-space:pre-wrap">        </span>31 d1<span style="white-space:pre-wrap">                        </span>xorl<span style="white-space:pre-wrap">                </span>%edx, %ecx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">// check for SmallInteger overflow</span></div><div>0x3679f:<span style="white-space:pre-wrap">        </span>0f 88 96 01 00 00<span style="white-space:pre-wrap">        </span>js<span style="white-space:pre-wrap">                </span>0x3693b</div><div>0x367a5:<span style="white-space:pre-wrap">        </span>83 ca 01<span style="white-space:pre-wrap">                        </span>orl<span style="white-space:pre-wrap">                </span>$0x1, %edx</div><div><br></div><div>clang 7 does better:</div><div>0x36741:<span style="white-space:pre-wrap">        </span>89 ca<span style="white-space:pre-wrap">                        </span>movl   %ecx, %edx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">// both SmallIntegers?</span></div><div>0x36743:<span style="white-space:pre-wrap">        </span>83 e2 01<span style="white-space:pre-wrap">                        </span>andl   $0x1, %edx</div><div>0x36746:<span style="white-space:pre-wrap">        </span>85 d0<span style="white-space:pre-wrap">                        </span>testl  %eax, %edx</div><div>0x36748:<span style="white-space:pre-wrap">        </span>74 67<span style="white-space:pre-wrap">                        </span>je     0x367b1</div><div>0x3674a:<span style="white-space:pre-wrap">        </span>d1 f9<span style="white-space:pre-wrap">                        </span>sarl   %ecx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">// convert from SmallInteger to value</span></div><div>0x3674c:<span style="white-space:pre-wrap">        </span>d1 f8<span style="white-space:pre-wrap">                        </span>sarl   %eax</div><div>0x3674e:<span style="white-space:pre-wrap">        </span>0f af c8<span style="white-space:pre-wrap">                        </span>imull  %eax, %ecx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        // do the multiply</span></div><div>0x36751:<span style="white-space:pre-wrap">        </span>8d 14 09<span style="white-space:pre-wrap">                        </span>leal   (%ecx,%ecx), %edx</div><div>0x36754:<span style="white-space:pre-wrap">        </span>85 c0<span style="white-space:pre-wrap">                        </span>testl  %eax, %eax</div><div>0x36756:<span style="white-space:pre-wrap">        </span>74 08<span style="white-space:pre-wrap">                        </span>je     0x36760</div><div>0x36758:<span style="white-space:pre-wrap">        </span>31 d1<span style="white-space:pre-wrap">                        </span>xorl   %edx, %ecx<span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">        </span><span style="white-space:pre-wrap">// check for SmallInteger overflow</span></div><div>0x3675a:<span style="white-space:pre-wrap">        </span>0f 88 a9 01 00 00<span style="white-space:pre-wrap">        </span>js     0x36909</div><div>0x36760:<span style="white-space:pre-wrap">        </span>83 ca 01<span style="white-space:pre-wrap">                        </span>orl    $0x1, %edx</div><div><br></div><div><br></div><div>What I don&#39;t understand is how, given</div><div><br></div><div>                typedef long sqInt;<br></div><div><div>                sqInt arg;</div><div>                sqInt rcvr;</div><div>                sqInt result;</div></div><div>...</div><div><div>                    result = rcvr * arg;<span style="white-space:pre-wrap">                                // multiply</span></div></div><div><span style="white-space:pre-wrap"><br></span></div><div><span style="white-space:pre-wrap">clang reasons it doesn&#39;t need to evaluate</span></div><div><span style="white-space:pre-wrap"><br></span></div><div><div dir="ltr"><div><span style="font-size:small;border-collapse:separate">                     || (((result / arg) == rcvr)<span style="white-space:pre-wrap">                        // check for overflow</span></span></div><div><span style="white-space:pre-wrap"><br></span></div><div><span style="white-space:pre-wrap">Given</span> that arg and receiver can both have values &gt; 64k, the result can of course overflow and there&#39;s no guarantee that because result = rcvr * arg, that (result / arg) == rcvr.</div><div><br></div><div>Am I missing something?  Are there flags I should be using?  This looks like a pretty basic issue.</div><div><br><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr">===========================================================================<br>John M. McIntosh. Corporate Smalltalk Consulting Ltd <a href="https://www.linkedin.com/in/smalltalk" target="_blank">https://www.linkedin.com/in/smalltalk</a><br>===========================================================================<br></div></div></div></div>
</div>