<div dir="ltr"><div class="markdown-here-wrapper" style><p style="margin:1.2em 0px!important">Hello all,</p>
<p style="margin:1.2em 0px!important">I am working on an <a href="https://github.com/avr-llvm/llvm">AVR backend</a>. From the instruction <a href="https://github.com/avr-llvm/architecture/raw/master/Manuals/avr-instruction-set-manual.pdf">manual</a>, there are about a dozen instructions which have (seemingly arbitrary) constraints on their operands.</p>
<p style="margin:1.2em 0px!important">For example, take the “load from pointer P into register R and then postincrement P” instruction:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-asm" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)">; Prototy
; LD R, P+
; load byte from Z pointer register into r20 and postincrement
LD r20, Z+
</code></pre>
<p style="margin:1.2em 0px!important">Here is a list of undefined operand combinations:</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ELPM r30, Z+</code> </li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ELPM r31, Z+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r26, X+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r27, X+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r26, -X</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r27, -X</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r28, Y+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r29, Y+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r28, -Y</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r29, -Y</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r30, Z+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r31, Z+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r30, -Z</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LD r31, -Z</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LPM r30, Z+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">LPM r31, Z+</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST X+, r26</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST X+, r27</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST -X, r26</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST -X, r27</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST Y+, r28</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST Y+, r29</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST -Y, r28</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST -Y, r29</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST Z+, r30</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST Z+, r31</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST -Z, r30</code></li>
<li style="margin:0.5em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ST -Z, r31</code></li>
</ul>
<p style="margin:1.2em 0px!important">How can I tell LLVM to not generate these combinations during instruction selection?<br>Or maybe just a way to indicate to the register allocator that a set of operands for an instruction is undefined in a virtual function that can be overriden?</p><p style="margin:1.2em 0px!important">Thanks,<br>Dylan</p>
<div title="MDH:SGVsbG8gYWxsLDxkaXY+PGJyPjwvZGl2PjxkaXY+SSBhbSB3b3JraW5nIG9uIGFuIFtBVlIgYmFj
a2VuZF0oaHR0cHM6Ly9naXRodWIuY29tL2F2ci1sbHZtL2xsdm0pLiBGcm9tIHRoZSBpbnN0cnVj
dGlvbiBbbWFudWFsXShodHRwczovL2dpdGh1Yi5jb20vYXZyLWxsdm0vYXJjaGl0ZWN0dXJlL3Jh
dy9tYXN0ZXIvTWFudWFscy9hdnItaW5zdHJ1Y3Rpb24tc2V0LW1hbnVhbC5wZGYpLCB0aGVyZSBh
cmUgYWJvdXQgYSBkb3plbiBpbnN0cnVjdGlvbnMgd2hpY2ggaGF2ZSAoc2VlbWluZ2x5IGFyYml0
cmFyeSkgY29uc3RyYWludHMgb24gdGhlaXIgb3BlcmFuZHMuPC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj5Gb3IgZXhhbXBsZSwgdGFrZSB0aGUgImxvYWQgZnJvbSBwb2ludGVyIFAgaW50byByZWdp
c3RlciBSIGFuZCB0aGVuIHBvc3RpbmNyZW1lbnQgUCIgaW5zdHJ1Y3Rpb246PC9kaXY+PGRpdj5g
YGAgYXNtPC9kaXY+PGRpdj47IFByb3RvdHk8L2Rpdj48ZGl2PjsgTEQgUiwgUCs8L2Rpdj48ZGl2
Pjxicj48L2Rpdj48ZGl2PjsgbG9hZCBieXRlIGZyb20gWiBwb2ludGVyIHJlZ2lzdGVyIGludG8g
cjIwIGFuZCBwb3N0aW5jcmVtZW50PC9kaXY+PGRpdj5MRCByMjAsIForPC9kaXY+PGRpdj5gYGA8
L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkhlcmUgaXMgYSBsaXN0IG9mIHVuZGVmaW5lZCBvcGVy
YW5kIGNvbWJpbmF0aW9uczo8L2Rpdj48ZGl2PjxkaXY+KiBgRUxQTSByMzAsIForYCZuYnNwOzwv
ZGl2PjxkaXY+KiBgRUxQTSByMzEsIForYDwvZGl2PjxkaXY+KiBgTEQgcjI2LCAmbmJzcDtYK2A8
L2Rpdj48ZGl2PiogYExEIHIyNywgJm5ic3A7WCtgPC9kaXY+PGRpdj4qIGBMRCByMjYsIC1YYDwv
ZGl2PjxkaXY+KiBgTEQgcjI3LCAtWGA8L2Rpdj48ZGl2PiogYExEIHIyOCwgJm5ic3A7WStgPC9k
aXY+PGRpdj4qIGBMRCByMjksICZuYnNwO1krYDwvZGl2PjxkaXY+KiBgTEQgcjI4LCAtWWA8L2Rp
dj48ZGl2PiogYExEIHIyOSwgLVlgPC9kaXY+PGRpdj4qIGBMRCByMzAsICZuYnNwO1orYDwvZGl2
PjxkaXY+KiBgTEQgcjMxLCAmbmJzcDtaK2A8L2Rpdj48ZGl2PiogYExEIHIzMCwgLVpgPC9kaXY+
PGRpdj4qIGBMRCByMzEsIC1aYDwvZGl2PjxkaXY+KiBgTFBNIHIzMCwgWitgPC9kaXY+PGRpdj4q
IGBMUE0gcjMxLCBaK2A8L2Rpdj48ZGl2PiogYFNUICZuYnNwO1grLCByMjZgPC9kaXY+PGRpdj4q
IGBTVCAmbmJzcDtYKywgcjI3YDwvZGl2PjxkaXY+KiBgU1QgLVgsICZuYnNwO3IyNmA8L2Rpdj48
ZGl2PiogYFNUIC1YLCAmbmJzcDtyMjdgPC9kaXY+PGRpdj4qIGBTVCAmbmJzcDtZKywgcjI4YDwv
ZGl2PjxkaXY+KiBgU1QgJm5ic3A7WSssIHIyOWA8L2Rpdj48ZGl2PiogYFNUIC1ZLCAmbmJzcDty
MjhgPC9kaXY+PGRpdj4qIGBTVCAtWSwgJm5ic3A7cjI5YDwvZGl2PjxkaXY+KiBgU1QgJm5ic3A7
WissIHIzMGA8L2Rpdj48ZGl2PiogYFNUICZuYnNwO1orLCByMzFgPC9kaXY+PGRpdj4qIGBTVCAt
WiwgJm5ic3A7cjMwYDwvZGl2PjxkaXY+KiBgU1QgLVosICZuYnNwO3IzMWA8L2Rpdj48L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PkhvdyBjYW4gSSB0ZWxsIExMVk0gdG8gbm90IGdlbmVyYXRlIHRo
ZXNlIGNvbWJpbmF0aW9ucyBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uPzwvZGl2PjxkaXY+
T3IgbWF5YmUganVzdCBhIHdheSB0byBpbmRpY2F0ZSB0byB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9y
IHRoYXQgYSBzZXQgb2Ygb3BlcmFuZHMgZm9yIGFuIGluc3RydWN0aW9uIGlzIHVuZGVmaW5lZCBp
biBhIHZpcnR1YWwgZnVuY3Rpb24gdGhhdCBjYW4gYmUgb3ZlcnJpZGVuPzwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div></div>