<div dir="ltr"><div>Hi Quentin,<br></div><br><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>
It sounds like you only need the earlyclobber description for the N, N variant.<br>
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>
<br>
What am I missing?<br></blockquote><div><br></div><div>we are using different opcodes for widen-op NN and widen-op WN.</div><div><br></div><div>My understanding is that not setting earlyclobber to the W, N variant would allow the RegAlloc to do an allocation like this</div><div><br></div><div style="margin-left:40px">W1 = widen-op W2, N3</div><div><br></div><div>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><br></div><div>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></div><div><br></div><div style="margin-left:40px">W3 = widen-op W2, N3<br></div><div><br></div><div>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></div><div><br></div><div style="margin-left:40px">W2 = widen-op W2, N3</div><div><br></div><div>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></div><div><br></div><div>Kind regards,<br></div></div><br>-- <br><div dir="ltr" class="gmail_signature">Roger Ferrer Ibáñez<br></div></div>