<div dir="ltr">Hi All,<div><br></div><div>    here&#39;s a challenge.  Currently the JIT is naive about a sequence of inst var assignments.  It treats assignment separately, each getting its own copy of the store check.  For example when initializing an Interval via:</div><div><br></div><div>setFrom: startInteger to: stopInteger by: stepInteger</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>start := startInteger.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>stop := stopInteger.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>step := stepInteger </div><div><div><br></div><div>it generates the following assembly on ARM:</div><div><br></div><div><div>A0D0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>objhdr: 8000000A000035</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>nArgs: 3<span class="Apple-tab-span" style="white-space:pre">        </span>type: 2</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>blksiz: 140</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>method: C03C10</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>mthhdr: 6180005</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>selctr: 6B71A0=#setFrom:to:by:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>blkentry: 0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>stackCheckOffset: 0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>cmRefersToYoung: no</div><div>0000a0ec: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r7, #0</div><div>0000a0f0: push<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div>0000a0f4: bl<span class="Apple-tab-span" style="white-space:pre">        </span>0x000009f8 = 16r9F8 = ceMethodAbortNArgs</div><div>0000a0f8: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #1</div><div>0000a0fc: b<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a114 = 16rA114 = setFrom:to:by:@44</div><div>entry:</div><div>0000a100: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r7, #3</div><div>0000a104: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a0f8 = 16rA0F8 = setFrom:to:by:@28</div><div>0000a108: ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7]</div><div>0000a10c: mvn<span class="Apple-tab-span" style="white-space:pre">        </span>ip, #0</div><div>0000a110: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, ip, lsr #10</div><div>0000a114: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r8</div><div>0000a118: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a0f0 = 16rA0F0 = setFrom:to:by:@20</div><div>noCheckEntry:</div><div>0000a11c: ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp, #8]                                                          startInteger</div><div>0000a120: str<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [r7, #8]                                                           start</div><div>0000a124: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r5</div><div><span class="Apple-style-span">0000a128: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #3        </span>                                           <span class="Apple-style-span">  </span>startInteger<span class="Apple-style-span"> immediate?</span></div><div>0000a12c: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a168 = 16rA168 = setFrom:to:by:@98</div><div>0000a130: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, #0, 8</div><div>0000a134: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #5308416<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x510000</div><div>0000a138: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #50944<span class="Apple-tab-span" style="white-space:pre">        </span>; 0xc700</div><div>0000a13c: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #136<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x88 = 16r51C788 = nil</div><div>0000a140: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r7, r0                                                           self in oldSpace?  (self &gt;= nil)</div><div>0000a144: bcc<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a168 = 16rA168 = setFrom:to:by:@98</div><div>0000a148: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r0                                                           startInteger young? (startInteger &lt; nil)</div><div>0000a14c: bcs<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a168 = 16rA168 = setFrom:to:by:@98</div><div>0000a150: ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7, #3]                                                   self in remembered table?</div><div>0000a154: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #32</div><div>0000a158: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a168 = 16rA168 = setFrom:to:by:@98</div><div>0000a15c: push<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}                                                               add self to remembered table</div><div>0000a160: bl<span class="Apple-tab-span" style="white-space:pre">        </span>0x00000f88 = 16rF88 = ceStoreCheckTrampoline</div><div>IsRelativeCall:</div><div>0000a164: pop<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div>0000a168: ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp, #4]                                                          stopInteger</div><div>0000a16c: str<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [r7, #12]</div><div>0000a170: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r5</div><div>0000a174: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #3</div><div>0000a178: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a1b4 = 16rA1B4 = setFrom:to:by:@E4</div><div>0000a17c: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, #0, 8</div><div>0000a180: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #5308416<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x510000</div><div>0000a184: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #50944<span class="Apple-tab-span" style="white-space:pre">        </span>; 0xc700</div><div>0000a188: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #136<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x88 = 16r51C788 = nil</div><div>0000a18c: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r7, r0</div><div>0000a190: bcc<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a1b4 = 16rA1B4 = setFrom:to:by:@E4</div><div>0000a194: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r0</div><div>0000a198: bcs<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a1b4 = 16rA1B4 = setFrom:to:by:@E4</div><div>0000a19c: ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7, #3]</div><div>0000a1a0: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #32</div><div>0000a1a4: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a1b4 = 16rA1B4 = setFrom:to:by:@E4</div><div>0000a1a8: push<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div>0000a1ac: bl<span class="Apple-tab-span" style="white-space:pre">        </span>0x00000f88 = 16rF88 = ceStoreCheckTrampoline</div><div>IsRelativeCall:</div><div>0000a1b0: pop<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div>0000a1b4: ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp]                                                          stepInteger</div><div>0000a1b8: str<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [r7, #16]</div><div>0000a1bc: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r5</div><div>0000a1c0: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #3</div><div>0000a1c4: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a200 = 16rA200 = setFrom:to:by:@130</div><div>0000a1c8: mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, #0, 8</div><div>0000a1cc: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #5308416<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x510000</div><div>0000a1d0: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #50944<span class="Apple-tab-span" style="white-space:pre">        </span>; 0xc700</div><div>0000a1d4: orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #136<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x88 = 16r51C788 = nil</div><div>0000a1d8: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r7, r0</div><div>0000a1dc: bcc<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a200 = 16rA200 = setFrom:to:by:@130</div><div>0000a1e0: cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r0</div><div>0000a1e4: bcs<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a200 = 16rA200 = setFrom:to:by:@130</div><div>0000a1e8: ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7, #3]</div><div>0000a1ec: ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #32</div><div>0000a1f0: bne<span class="Apple-tab-span" style="white-space:pre">        </span>0x0000a200 = 16rA200 = setFrom:to:by:@130</div><div>0000a1f4: push<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div>0000a1f8: bl<span class="Apple-tab-span" style="white-space:pre">        </span>0x00000f88 = 16rF88 = ceStoreCheckTrampoline</div><div>IsRelativeCall:</div><div>0000a1fc: pop<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div>0000a200: add<span class="Apple-tab-span" style="white-space:pre">        </span>sp, sp, #16 ADD 16 to SP </div><div>0000a204: mov<span class="Apple-tab-span" style="white-space:pre">        </span>pc, lr</div><div>0000a208: nop<span class="Apple-tab-span" style="white-space:pre">                        </span>; (mov r0, r0)</div><div>startpc: 12</div><div>  16rA164 IsRelativeCall      (16rA20F)</div><div>  16rA1B0 IsRelativeCall      (16rA20E)</div><div>  16rA1FC IsRelativeCall      (16rA20D)</div></div><div><br></div><div>If the Cogit were smart enough to identify methods that contained only instance initialization code (push arg or push constant, storePop inst var, and return self) we could generate much more compact code, e.g.</div><div><br></div><div><div><div>noCheckEntry:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp, #8]                                                            startInteger</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>str<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [r7, #8]</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp, #4]                                                            stopInteger</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>str<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [r7, #12]</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp]                                                                  stepInteger</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>str<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [r7, #16]</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>mov<span class="Apple-tab-span" style="white-space:pre">        </span>r0, #0, 8</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #5308416<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x510000</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #50944<span class="Apple-tab-span" style="white-space:pre">        </span>; 0xc700</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>orr<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #136<span class="Apple-tab-span" style="white-space:pre">        </span>; 0x88 = 16r51C788 = nil</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r7, r0                                                                self young?  if so, jump to return</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bcc<span class="Apple-tab-span" style="white-space:pre">        </span>L4</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp, #8]                                                              startInteger immediate?</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>tests<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r5, #3</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bne<span class="Apple-tab-span" style="white-space:pre">        </span>L1</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r0                                                                startInteger old?</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bcs<span class="Apple-tab-span" style="white-space:pre">        </span>L1</div><div><br></div><div>L2:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7, #3]                                                        self in remembered table?</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #32</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bne<span class="Apple-tab-span" style="white-space:pre">        </span>L1</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>push<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bl<span class="Apple-tab-span" style="white-space:pre">        </span>ceStoreCheckTrampoline</div><div>IsRelativeCall:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>pop<span class="Apple-tab-span" style="white-space:pre">        </span>{lr}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>add<span class="Apple-tab-span" style="white-space:pre">        </span>sp, sp, #16 ADD 16 to SP </div><div><span class="Apple-tab-span" style="white-space:pre">        </span>mov<span class="Apple-tab-span" style="white-space:pre">        </span>pc, lr</div><div><br></div><div>L1:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp, #4]                                                            stopInteger</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>tests<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r5, #3</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bne<span class="Apple-tab-span" style="white-space:pre">        </span>L3</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bcs<span class="Apple-tab-span" style="white-space:pre">        </span>L3</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7, #3]</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #32</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>beq<span class="Apple-tab-span" style="white-space:pre">        </span>L2</div><div><br></div><div>L3:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldr<span class="Apple-tab-span" style="white-space:pre">        </span>r5, [sp]                                                                stepInteger</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>tests<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r5, #3</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bne<span class="Apple-tab-span" style="white-space:pre">        </span>L4</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>cmp<span class="Apple-tab-span" style="white-space:pre">        </span>r5, r0</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>bcs<span class="Apple-tab-span" style="white-space:pre">        </span>L4</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r7, #3]</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ands<span class="Apple-tab-span" style="white-space:pre">        </span>r0, r0, #32</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>beq<span class="Apple-tab-span" style="white-space:pre">        </span>L2</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div><div>L4:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>add<span class="Apple-tab-span" style="white-space:pre">        </span>sp, sp, #16 ADD 16 to SP </div><div><span class="Apple-tab-span" style="white-space:pre">        </span>mov<span class="Apple-tab-span" style="white-space:pre">        </span>pc, lr</div></div></div><div><br></div><div>That&#39;s 5 times shorter, including method header, and does far less work in common cases (self is compared with nil, which is also the old/new boundary only once, not once for every inst var) but in the case of an Interval using SmallIntegers may be slower because each variable is read from the stack twice.  Interesting choices.  But I think the code density would win.  Of course, this may make no difference to overall speed but it would be nice to now :-).  If you&#39;re up for this, let me know.</div>-- <br><div class="gmail_signature">best,<div>Eliot</div></div>
</div></div>