Hello,<br><br>I'm getting a machine verifier error after introducing the earlyclobber constraint to some instructions where the src and dest regs can't be the same. The offending instruction pattern is this one:<br>
<br>let canFoldAsLoad = 1,<br>isReMaterializable = 1,<br>Constraints = "@earlyclobber $dst" in<br>def LDDWRdPtrQ : Inst<(outs DREGS:$dst),<br>                        (ins memri:$src),<br>                        "lddw\t$dst, $src",<br>
                        [(set DREGS:$dst, (load addr:$src))]>;<br><br>This is just a load with displacement instruction of the form "load reg, [reg_addr+<offs>]", where reg_addr and dest can't be the same register.<br>
<br>This caused the following verifier error:<br><br>*** Bad machine code: No live range at def ***<br>- function:    f3<br>- basic block: entry 0x9d68664 (BB#0) [0B;5056B)<br>- instruction: 3688B    %vreg96<earlyclobber,def> = LDDWRdPtrQ <fi#0>, 0; mem:LD2[FixedStack0](align=1) DREGS:%vreg96<br>
- operand 0:   %vreg96<earlyclobber,def><br>3688e is not live in [3688r,4480r:0)  0@3688r<br><br>*** Bad machine code: Early clobber def must be at an early-clobber slot ***<br>- function:    f3<br>Valno #0 is defined at 3688r in [3688r,4480r:0)  0@3688r<br>
<br>I've noticed this only happens when loading from frame indexes like in this case, regular loads won't error.<br><br>Does anybody know what is causing this sort of error or if I'm missing something obvious? I can provide any other debug info if requested.<br>
<br>Thanks in advance.<br>