<div dir="ltr">Most instructions produced by isel use a vreg(virtual register) as their inputs and destination. The register allocator is responsible for assigning these virtual registers to specific physical registers later. Each virtual register is assigned a specific register class and the register allocator has the freedom to allocate a physical register for it within the class. The CopyToReg and CopyFromReg nodes exist to place constraints on the register allocator.<div><br></div><div>Most CopyToReg nodes will appear on the return value of a function or just before a call to another function. These are used to ensure that things are placed in the right registers to match the calling convention. It appears that your calling convention requires result to be returned in R5 so the CopyToReg was created to make sure the return value is in R5.</div><div><br></div><div>Most CopyFromReg nodes appear on the inputs to a function where the physical register represent the input registers defined by the calling convention.<br><div><br></div><div>The register allocator will see the CopyToReg after the DAG has been converted to machine instructions at that point it will be TargetOpcode::COPY with a physical register output and a virtual register input. In your case the virtual register input comes from the output of your LI instruction. If the register allocator is able to it will allocate this virtual register to the same physical register as the output of the COPY as it did in your case. But in more complicated functions it might not be able to do that and will instead create a register to register move to get the register into the right place.</div></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Sun, Nov 5, 2017 at 5:23 PM, Robert Baruch <span dir="ltr"><<a href="mailto:robert.c.baruch@gmail.com" target="_blank">robert.c.baruch@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hmm, well that seems to have worked, but I'm a little suspicious. This is my instruction def:<div><br></div><div><div><font face="monospace">// Load Immediate (LI)</font></div><div><font face="monospace">def LI : IImmReg<0x010, (outs REG16:$dst), (ins i16imm:$src),</font></div><div><font face="monospace">    [(set REG16:$dst, imm:$src)], "LI\t$dst, $src">;</font></div><div><br></div><div><br></div><div>The rest of the debug output:</div><div><br></div><div><span class=""><div><font face="monospace">Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127></font></div></span><span class=""><div><font face="monospace">Selecting: t2: i16 = Register %R5</font></div><div><font face="monospace">Selecting: t1: i16 = Constant<127></font></div><div><font face="monospace"><br></font></div><div><font face="monospace">ISEL: Starting pattern match on root node: t1: i16 = Constant<127></font></div></span><div><font face="monospace">  Initial Opcode index to 16</font></div><div><span style="font-family:monospace">Creating constant: t5: i16 = TargetConstant<127></span><br></div><div><font face="monospace">  Morphed node: t1: i16 = LI TargetConstant:i16<127></font></div><div><font face="monospace">ISEL: Match complete!</font></div></div><div><font face="monospace"><br></font></div><div><font face="monospace"><div>Selected selection DAG: BB#0 'my_func:entry'</div><div>SelectionDAG has 6 nodes:</div><div>      t0: ch = EntryToken</div><div>      t1: i16 = LI TargetConstant:i16<127></div><div>    t3: ch,glue = CopyToReg t0, Register:i16 %R5, t1</div><div>  t4: ch,glue = RTWP Register:i16 %R5, t3</div><div><br></div></font></div><div>So at this point, t3 is still a CopyToReg with R5 and another node that is an LI with the constant. That doesn't make sense to me. Shouldn't the LI node end up being a parent of R5 and the constant?</div><div><br></div><div>The phases proceed, and this makes even less sense:</div><div><br></div><div><div><font face="monospace"># Machine code for function my_func: IsSSA, TracksLiveness</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">BB#0: derived from LLVM BB %entry</font></div><div><font face="monospace"><span style="white-space:pre-wrap">       </span>%vreg0<def> = LI 127; REG16:%vreg0</font></div><div><font face="monospace"><span style="white-space:pre-wrap">     </span>%R5<def> = COPY %vreg0; REG16:%vreg0</font></div><div><font face="monospace"><span style="white-space:pre-wrap">   </span>RTWP %R5</font></div><div><font face="monospace"><br></font></div><div><font face="monospace"># End machine code for function my_func.</font></div></div><div><br></div><div>I'm not complaining too hard, though, because in the end I get the assembly output I expect:</div><div><br></div><div><div><font face="monospace"># BB#0:                                 # %entry</font></div><div><font face="monospace"><span style="white-space:pre-wrap"> </span>LI<span style="white-space:pre-wrap">      </span>$r5, 127</font></div><div><font face="monospace"><span style="white-space:pre-wrap">     </span>RTWP</font></div></div><div><br></div><div>What I'm complaining about is that I still don't know how the DAG nodes work. Here's the <font face="monospace">-view-sched-dags</font> output:</div><div><br></div><div><br></div><div><img src="cid:15f8ee964f95560369c2" alt="dags.jpg" style="max-width:100%;opacity:1"><br></div></div><div><br></div><div>I just don't understand the LI node. From a dataflow perspective, LI does depend on the constant, and not on the register R5. Is this just how LLVM represents data stores? With a CopyToReg node?</div><div><br></div><div>There's something that I'm missing, but I don't know what it is :(</div><div><br></div><div>--Rob</div><div><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Sun, Nov 5, 2017 at 1:22 AM 陳韋任 <<a href="mailto:chenwj.cs97g@g2.nctu.edu.tw" target="_blank">chenwj.cs97g@g2.nctu.edu.tw</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Try match your instruction with (set REG16:$dst, i16imm:$src). Just give it a shot. :)<br></div></div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">2017-11-05 12:56 GMT+08:00 Robert Baruch via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Well, that's the thing: I thought that was CopyToReg. I don't know what the name of the node is to load one value into a register, so I don't know how to construct such a pattern. </div><div class="m_-6164100513803548655m_-5614703604511338509HOEnZb"><div class="m_-6164100513803548655m_-5614703604511338509h5"><br><div class="gmail_quote"><div dir="ltr">On Sat, Nov 4, 2017 at 9:23 PM Craig Topper <<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Do you have a pattern for loading an i16 immediate into a 16-bit register?</div><div class="gmail_extra"></div><div class="gmail_extra"><br clear="all"><div><div class="m_-6164100513803548655m_-5614703604511338509m_-9140908403049611248m_448168409802762758gmail_signature" data-smartmail="gmail_signature">~Craig</div></div></div><div class="gmail_extra">
<br><div class="gmail_quote">On Sat, Nov 4, 2017 at 8:00 PM, Robert Baruch <span dir="ltr"><<a href="mailto:robert.c.baruch@gmail.com" target="_blank">robert.c.baruch@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hmm, okay. Then what's the problem being reported here? I'm not sure what I'm supposed to do with "<span style="font-family:monospace;font-size:10.5625px">LLVM ERROR: Cannot select: t1: i16 = Constant<127>".</span>BTW, the function is:<div><font face="monospace"><span style="font-size:10.5625px"><br></span></font></div><div><font face="monospace"><div>; ModuleID = 'return.c'</div><div>source_filename = "return.c"</div><div>target datalayout = "E-m:e-p:16:16:16-i1:16:16-i8:<wbr>16:16-i16:16:16-i32:16:16-i64:<wbr>16:16-S16-n16"</div><div>target triple = "tms9900"</div><div><br></div><div>; Function Attrs: noinline nounwind optnone</div><div>define signext i16 @my_func() #0 {</div><div>entry:</div><div>  ret i16 127</div><div>}</div><div style="font-size:10.5625px"><br></div><div style="font-size:10.5625px">------- debug output --------</div></font><div><font face="monospace"><span style="font-size:10.5625px"><br></span></font></div><div><font face="monospace"><div>Optimized legalized selection DAG: BB#0 'my_func:entry'</div><div>SelectionDAG has 5 nodes:</div><div>    t0: ch = EntryToken</div><span><div>  t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127></div></span><div>  t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1</div></font><div><span style="font-family:monospace"><br></span></div><div><span style="font-family:monospace">===== Instruction selection begins: BB#0 'entry'</span><div><div><font face="monospace">Selecting: t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">ISEL: Starting pattern match on root node: t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">  Morphed node: t4: ch,glue = Retr Register:i16 %R5, t3</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">ISEL: Match complete!</font></div><span><div><font face="monospace">Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127></font></div><div><font face="monospace"><br></font></div></span><div><font face="monospace">Selecting: t2: i16 = Register %R5</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Selecting: t1: i16 = Constant<127></font></div><div><font face="monospace"><br></font></div><div><font face="monospace">ISEL: Starting pattern match on root node: t1: i16 = Constant<127></font></div><div><font face="monospace"><br></font></div><div><font face="monospace">  Initial Opcode index to 0</font></div><div><font face="monospace">  Match failed at index 0</font></div><div><font face="monospace">LLVM ERROR: Cannot select: t1: i16 = Constant<127></font></div><div><font face="monospace">In function: my_func</font></div></div><div><br></div></div></div></div></div><div class="m_-6164100513803548655m_-5614703604511338509m_-9140908403049611248m_448168409802762758HOEnZb"><div class="m_-6164100513803548655m_-5614703604511338509m_-9140908403049611248m_448168409802762758h5"><br><div class="gmail_quote"><div dir="ltr">On Sat, Nov 4, 2017 at 7:22 PM Craig Topper <<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div dir="auto">CopyToReg is not handle by patterns. It should be passed through isel unchanged. It’s part of a special list of ISD opcodes that don’t change in SelectioDAGISel::<wbr>SelectCodeCommon</div><div dir="auto"><br></div><div dir="auto">It will then be turned into a TargetOpcode::COPY in InstrEmitter::EmitSpecialNode when the DAG is turned into MachineInstrs.</div><div dir="auto"><br></div><div class="gmail_quote"></div></div><div><div class="gmail_quote"><div>On Sat, Nov 4, 2017 at 7:02 PM Robert Baruch via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div></div></div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>So there's a DAG that looks like this in the debug output:<div><br></div><div><div><font face="monospace">  Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127></font></div></div><div><br></div><div>In the instruction selection phase, what pattern would that match? I've constructed this so far:</div><div><br></div><div><font face="monospace">  (??? REG16:$dst, i16imm:$src)</font></div><div><br></div><div>but the problem is, I can't determine what to use as <font face="monospace">???</font>. There is an <font face="monospace">ISD::CopyToReg</font> enum value, but I don't know how that translates to the string to use in the pattern.</div><div><br></div><div>And more generally, how do I find out from a DAG diagram like the ones output by <font face="monospace">-view-isel-dags</font> which node type corresponds to which pattern string?</div><div><br></div><div>Thanks,</div><div><br></div><div>--Rob</div><div><br></div></div></blockquote></div></div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div><div dir="ltr">-- <br></div><div class="m_-6164100513803548655m_-5614703604511338509m_-9140908403049611248m_448168409802762758m_5700157314497278490m_3808137461368793721gmail_signature" data-smartmail="gmail_signature">~Craig</div>
</blockquote></div>
</div></div></blockquote></div><br></div></blockquote></div>
</div></div><br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br></div><div class="gmail_extra"><div class="m_-6164100513803548655m_-5614703604511338509gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Wei-Ren Chen (陳韋任)<br>Homepage: <a href="https://people.cs.nctu.edu.tw/~chenwj" target="_blank">https://people.cs.nctu.edu.tw/<wbr>~chenwj</a></div></div></div>
</div>
</blockquote></div></div></div></div>
</blockquote></div><br></div>