<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">                        // both SmallIntegers?</span></div><div>                    rcvr = (rcvr &gt;&gt; 1);<span class="" style="white-space:pre">                                // convert from SmallInteger to value</span></div><div>                    arg = (arg &gt;&gt; 1);</div><div>                    result = rcvr * arg;<span class="" style="white-space:pre">                                // multiply</span></div><div>                    if ((arg == 0)</div><div>                     || (((result / arg) == rcvr)<span class="" style="white-space:pre">                        // check for overflow</span></div><div>                     &amp;&amp; ((((sqInt)(result ^ (result &lt;&lt; 1)))) &gt;= 0))) {<span class="" style="white-space:pre">        // 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 class="" style="white-space:pre">        </span>89 ca<span class="" style="white-space:pre">                        </span>movl<span class="" style="white-space:pre">        </span>%ecx, %edx<span style="white-space:pre">        // both SmallIntegers?</span></div><div>0x36786:<span class="" style="white-space:pre">        </span>83 e2 01<span class="" style="white-space:pre">                        </span>andl<span class="" style="white-space:pre">        </span>$0x1, %edx</div><div>0x36789:<span class="" style="white-space:pre">        </span>85 d0<span class="" style="white-space:pre">                        </span>testl<span class="" style="white-space:pre">        </span>%eax, %edx</div><div>0x3678b:<span class="" style="white-space:pre">        </span>74 6b<span class="" style="white-space:pre">                        </span>je<span class="" style="white-space:pre">                </span>0x367f8</div><div>0x3678d:<span class="" style="white-space:pre">        </span>d1 f9<span class="" style="white-space:pre">                        </span>sarl<span class="" style="white-space:pre">                </span>%ecx<span style="white-space:pre">        </span><span style="white-space:pre">        </span><span style="white-space:pre">// convert from SmallInteger to value</span></div><div>0x3678f:<span class="" style="white-space:pre">        </span>d1 f8<span class="" style="white-space:pre">                        </span>sarl<span class="" style="white-space:pre">                </span>%eax</div><div>0x36791:<span class="" style="white-space:pre">        </span>0f af c8<span class="" style="white-space:pre">                        </span>imull<span class="" style="white-space:pre">        </span>%eax, %ecx<span style="white-space:pre">        </span><span style="white-space:pre">        // do the multiply</span></div><div>0x36794:<span class="" style="white-space:pre">        </span>8d 14 09<span class="" style="white-space:pre">                        </span>leal<span class="" style="white-space:pre">                </span>(%ecx,%ecx), %edx</div><div>0x36797:<span class="" style="white-space:pre">        </span>85 c0<span class="" style="white-space:pre">                        </span>testl<span class="" style="white-space:pre">        </span>%eax, %eax</div><div>0x36799:<span class="" style="white-space:pre">        </span>89 f7<span class="" style="white-space:pre">                        </span>movl<span class="" style="white-space:pre">        </span>%esi, %edi<span style="white-space:pre">        // AFAICS, totally spurious</span></div><div>0x3679b:<span class="" style="white-space:pre">        </span>74 08<span class="" style="white-space:pre">                        </span>je<span class="" style="white-space:pre">                </span>0x367a5</div><div>0x3679d:<span class="" style="white-space:pre">        </span>31 d1<span class="" style="white-space:pre">                        </span>xorl<span class="" style="white-space:pre">                </span>%edx, %ecx<span style="white-space:pre">        </span><span style="white-space:pre">// check for SmallInteger overflow</span></div><div>0x3679f:<span class="" style="white-space:pre">        </span>0f 88 96 01 00 00<span class="" style="white-space:pre">        </span>js<span class="" style="white-space:pre">                </span>0x3693b</div><div>0x367a5:<span class="" style="white-space:pre">        </span>83 ca 01<span class="" style="white-space:pre">                        </span>orl<span class="" style="white-space:pre">                </span>$0x1, %edx</div><div><br></div><div>clang 7 does better:</div><div>0x36741:<span class="" style="white-space:pre">        </span>89 ca<span class="" style="white-space:pre">                        </span>movl   %ecx, %edx<span style="white-space:pre">        </span><span style="white-space:pre">        </span><span style="white-space:pre">// both SmallIntegers?</span></div><div>0x36743:<span class="" style="white-space:pre">        </span>83 e2 01<span class="" style="white-space:pre">                        </span>andl   $0x1, %edx</div><div>0x36746:<span class="" style="white-space:pre">        </span>85 d0<span class="" style="white-space:pre">                        </span>testl  %eax, %edx</div><div>0x36748:<span class="" style="white-space:pre">        </span>74 67<span class="" style="white-space:pre">                        </span>je     0x367b1</div><div>0x3674a:<span class="" style="white-space:pre">        </span>d1 f9<span class="" style="white-space:pre">                        </span>sarl   %ecx<span style="white-space:pre">        </span><span style="white-space:pre">        </span><span style="white-space:pre">        </span><span style="white-space:pre">// convert from SmallInteger to value</span></div><div>0x3674c:<span class="" style="white-space:pre">        </span>d1 f8<span class="" style="white-space:pre">                        </span>sarl   %eax</div><div>0x3674e:<span class="" style="white-space:pre">        </span>0f af c8<span class="" style="white-space:pre">                        </span>imull  %eax, %ecx<span style="white-space:pre">        </span><span style="white-space:pre">        // do the multiply</span></div><div>0x36751:<span class="" style="white-space:pre">        </span>8d 14 09<span class="" style="white-space:pre">                        </span>leal   (%ecx,%ecx), %edx</div><div>0x36754:<span class="" style="white-space:pre">        </span>85 c0<span class="" style="white-space:pre">                        </span>testl  %eax, %eax</div><div>0x36756:<span class="" style="white-space:pre">        </span>74 08<span class="" style="white-space:pre">                        </span>je     0x36760</div><div>0x36758:<span class="" style="white-space:pre">        </span>31 d1<span class="" style="white-space:pre">                        </span>xorl   %edx, %ecx<span style="white-space:pre">        </span><span style="white-space:pre">        </span><span style="white-space:pre">// check for SmallInteger overflow</span></div><div>0x3675a:<span class="" style="white-space:pre">        </span>0f 88 a9 01 00 00<span class="" style="white-space:pre">        </span>js     0x36909</div><div>0x36760:<span class="" style="white-space:pre">        </span>83 ca 01<span class="" style="white-space:pre">                        </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 class="" style="white-space:pre">                                // multiply</span></div></div><div><span class="" style="white-space:pre"><br></span></div><div><span class="" style="white-space:pre">clang reasons it doesn&#39;t need to evaluate</span></div><div><span class="" style="white-space:pre"><br></span></div><div class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate">                     || (((result / arg) == rcvr)<span class="" style="white-space:pre">                        // check for overflow</span></span></div><div><span style="white-space:pre"><br></span></div><div><span style="white-space:pre">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>