<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi Roger,<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On May 4, 2020, at 11:37 PM, Roger Ferrer Ibáñez <<a href="mailto:rofirrim@gmail.com" class="">rofirrim@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">Hi Quentin,<br class=""></div><br class=""><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br class="">
It sounds like you only need the earlyclobber description for the N, N variant.<br class="">
In other words, as long as you use different opcodes for widen-op NN and widen-op WN, you model exactly what you want.<br class="">
<br class="">
What am I missing?<br class=""></blockquote><div class=""><br class=""></div><div class="">we are using different opcodes for widen-op NN and widen-op WN.</div><div class=""><br class=""></div><div class="">My understanding is that not setting earlyclobber to the W, N variant would allow the RegAlloc to do an allocation like this</div><div class=""><br class=""></div><div style="margin-left:40px" class="">W1 = widen-op W2, N3</div></div></div></div></blockquote><div><br class=""></div><div>Sorry I mixed up earlyclobber and tie-operand. For some reason I thought earlyclobber could be set individually on the src operands to say that they interfere with the definition...</div><div>That’s obviously wrong.</div><div><br class=""></div><div>So yeah there isn’t anything in LLVM right now that conveys the semantic you want.</div><div><br class=""></div><div>If you’re really concerned that you would use too many registers, you can either:</div><div>1. Add this concept to llvm </div><div>2. Repair after regalloc</div><div><br class=""></div><div>For #2, basically you don’t set any constraints in regalloc then after regalloc (i.e., expand pseudo), you check if there are some overlapping and if so, you change the allocation locally.</div><div>E.g.,</div><div>W1 = W2, N3</div><div>=></div><div>N4 = copy N3</div><div>W1 = copy W2, N4</div><div>or</div><div><div>W3 = copy W2, N3</div><div class=""><div>W1 = copy W3</div></div><div class=""><br class=""></div><div class="">Depending on what is the cheapest with respect to what registers are available (you may have to spill).</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">-Quentin</div></div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class=""><br class=""></div><div class="">but this is not correct in that target because W1 and N3 are of different kind and W1 (being the group of registers N2, N3) overlaps N3.</div><div class=""><br class=""></div><div class="">If I understand earlyclobber semantics correctly, earlyclobber would allocate the destination to something that doesn't overlap W2 and also doesn't overlap N3. For instance<br class=""></div><div class=""><br class=""></div><div style="margin-left:40px" class="">W3 = widen-op W2, N3<br class=""></div><div class=""><br class=""></div><div class="">But because the dest is a W register the target's constraint only applies to N3, not to W2, so the following should be OK (however RegAlloc would never make such an assignment under earlyclobber)<br class=""></div><div class=""><br class=""></div><div style="margin-left:40px" class="">W2 = widen-op W2, N3</div><div class=""><br class=""></div><div class="">In principle earlyclobber is always going to do allocations that are correct for the target but there are a valid ones that will be missed.<br class=""></div><div class=""><br class=""></div><div class="">Kind regards,<br class=""></div></div><br class="">-- <br class=""><div dir="ltr" class="gmail_signature">Roger Ferrer Ibáñez<br class=""></div></div>
</div></blockquote></div><br class=""></body></html>