Robert Baruch via llvm-dev
2017-Nov-05 04:56 UTC
[llvm-dev] What pattern string corresponds to CopyToReg?
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. On Sat, Nov 4, 2017 at 9:23 PM Craig Topper <craig.topper at gmail.com> wrote:> Do you have a pattern for loading an i16 immediate into a 16-bit register? > > ~Craig > > On Sat, Nov 4, 2017 at 8:00 PM, Robert Baruch <robert.c.baruch at gmail.com> > wrote: > >> Hmm, okay. Then what's the problem being reported here? I'm not sure what >> I'm supposed to do with "LLVM ERROR: Cannot select: t1: i16 >> Constant<127>".BTW, the function is: >> >> ; ModuleID = 'return.c' >> source_filename = "return.c" >> target datalayout >> "E-m:e-p:16:16:16-i1:16:16-i8:16:16-i16:16:16-i32:16:16-i64:16:16-S16-n16" >> target triple = "tms9900" >> >> ; Function Attrs: noinline nounwind optnone >> define signext i16 @my_func() #0 { >> entry: >> ret i16 127 >> } >> >> ------- debug output -------- >> >> Optimized legalized selection DAG: BB#0 'my_func:entry' >> SelectionDAG has 5 nodes: >> t0: ch = EntryToken >> t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127> >> t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1 >> >> ===== Instruction selection begins: BB#0 'entry' >> Selecting: t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1 >> >> ISEL: Starting pattern match on root node: t4: ch = TMS9900ISD::Ret t3, >> Register:i16 %R5, t3:1 >> >> Morphed node: t4: ch,glue = Retr Register:i16 %R5, t3 >> >> ISEL: Match complete! >> Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127> >> >> Selecting: t2: i16 = Register %R5 >> >> Selecting: t1: i16 = Constant<127> >> >> ISEL: Starting pattern match on root node: t1: i16 = Constant<127> >> >> Initial Opcode index to 0 >> Match failed at index 0 >> LLVM ERROR: Cannot select: t1: i16 = Constant<127> >> In function: my_func >> >> >> On Sat, Nov 4, 2017 at 7:22 PM Craig Topper <craig.topper at gmail.com> >> wrote: >> >>> 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::SelectCodeCommon >>> >>> It will then be turned into a TargetOpcode::COPY in >>> InstrEmitter::EmitSpecialNode when the DAG is turned into MachineInstrs. >>> >>> On Sat, Nov 4, 2017 at 7:02 PM Robert Baruch via llvm-dev < >>> llvm-dev at lists.llvm.org> wrote: >>> >>>> So there's a DAG that looks like this in the debug output: >>>> >>>> Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, >>>> Constant:i16<127> >>>> >>>> In the instruction selection phase, what pattern would that match? I've >>>> constructed this so far: >>>> >>>> (??? REG16:$dst, i16imm:$src) >>>> >>>> but the problem is, I can't determine what to use as ???. There is an >>>> ISD::CopyToReg enum value, but I don't know how that translates to the >>>> string to use in the pattern. >>>> >>>> And more generally, how do I find out from a DAG diagram like the ones >>>> output by -view-isel-dags which node type corresponds to which pattern >>>> string? >>>> >>>> Thanks, >>>> >>>> --Rob >>>> >>>> _______________________________________________ >>>> LLVM Developers mailing list >>>> llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>> >>> -- >>> ~Craig >>> >> >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171105/73ce6bc1/attachment.html>
陳韋任 via llvm-dev
2017-Nov-05 08:22 UTC
[llvm-dev] What pattern string corresponds to CopyToReg?
Try match your instruction with (set REG16:$dst, i16imm:$src). Just give it a shot. :) 2017-11-05 12:56 GMT+08:00 Robert Baruch via llvm-dev < llvm-dev at lists.llvm.org>:> 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. > > On Sat, Nov 4, 2017 at 9:23 PM Craig Topper <craig.topper at gmail.com> > wrote: > >> Do you have a pattern for loading an i16 immediate into a 16-bit register? >> >> ~Craig >> >> On Sat, Nov 4, 2017 at 8:00 PM, Robert Baruch <robert.c.baruch at gmail.com> >> wrote: >> >>> Hmm, okay. Then what's the problem being reported here? I'm not sure >>> what I'm supposed to do with "LLVM ERROR: Cannot select: t1: i16 >>> Constant<127>".BTW, the function is: >>> >>> ; ModuleID = 'return.c' >>> source_filename = "return.c" >>> target datalayout = "E-m:e-p:16:16:16-i1:16:16-i8: >>> 16:16-i16:16:16-i32:16:16-i64:16:16-S16-n16" >>> target triple = "tms9900" >>> >>> ; Function Attrs: noinline nounwind optnone >>> define signext i16 @my_func() #0 { >>> entry: >>> ret i16 127 >>> } >>> >>> ------- debug output -------- >>> >>> Optimized legalized selection DAG: BB#0 'my_func:entry' >>> SelectionDAG has 5 nodes: >>> t0: ch = EntryToken >>> t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127> >>> t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1 >>> >>> ===== Instruction selection begins: BB#0 'entry' >>> Selecting: t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1 >>> >>> ISEL: Starting pattern match on root node: t4: ch = TMS9900ISD::Ret t3, >>> Register:i16 %R5, t3:1 >>> >>> Morphed node: t4: ch,glue = Retr Register:i16 %R5, t3 >>> >>> ISEL: Match complete! >>> Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, >>> Constant:i16<127> >>> >>> Selecting: t2: i16 = Register %R5 >>> >>> Selecting: t1: i16 = Constant<127> >>> >>> ISEL: Starting pattern match on root node: t1: i16 = Constant<127> >>> >>> Initial Opcode index to 0 >>> Match failed at index 0 >>> LLVM ERROR: Cannot select: t1: i16 = Constant<127> >>> In function: my_func >>> >>> >>> On Sat, Nov 4, 2017 at 7:22 PM Craig Topper <craig.topper at gmail.com> >>> wrote: >>> >>>> 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::SelectCodeCommon >>>> >>>> It will then be turned into a TargetOpcode::COPY in >>>> InstrEmitter::EmitSpecialNode when the DAG is turned into MachineInstrs. >>>> >>>> On Sat, Nov 4, 2017 at 7:02 PM Robert Baruch via llvm-dev < >>>> llvm-dev at lists.llvm.org> wrote: >>>> >>>>> So there's a DAG that looks like this in the debug output: >>>>> >>>>> Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, >>>>> Constant:i16<127> >>>>> >>>>> In the instruction selection phase, what pattern would that match? >>>>> I've constructed this so far: >>>>> >>>>> (??? REG16:$dst, i16imm:$src) >>>>> >>>>> but the problem is, I can't determine what to use as ???. There is an >>>>> ISD::CopyToReg enum value, but I don't know how that translates to >>>>> the string to use in the pattern. >>>>> >>>>> And more generally, how do I find out from a DAG diagram like the ones >>>>> output by -view-isel-dags which node type corresponds to which >>>>> pattern string? >>>>> >>>>> Thanks, >>>>> >>>>> --Rob >>>>> >>>>> _______________________________________________ >>>>> LLVM Developers mailing list >>>>> llvm-dev at lists.llvm.org >>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>> >>>> -- >>>> ~Craig >>>> >>> >> > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >-- Wei-Ren Chen (陳韋任) Homepage: https://people.cs.nctu.edu.tw/~chenwj -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171105/307bbf20/attachment.html>
Robert Baruch via llvm-dev
2017-Nov-06 01:23 UTC
[llvm-dev] What pattern string corresponds to CopyToReg?
Hmm, well that seems to have worked, but I'm a little suspicious. This is my instruction def: // Load Immediate (LI) def LI : IImmReg<0x010, (outs REG16:$dst), (ins i16imm:$src), [(set REG16:$dst, imm:$src)], "LI\t$dst, $src">; The rest of the debug output: Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127> Selecting: t2: i16 = Register %R5 Selecting: t1: i16 = Constant<127> ISEL: Starting pattern match on root node: t1: i16 = Constant<127> Initial Opcode index to 16 Creating constant: t5: i16 = TargetConstant<127> Morphed node: t1: i16 = LI TargetConstant:i16<127> ISEL: Match complete! Selected selection DAG: BB#0 'my_func:entry' SelectionDAG has 6 nodes: t0: ch = EntryToken t1: i16 = LI TargetConstant:i16<127> t3: ch,glue = CopyToReg t0, Register:i16 %R5, t1 t4: ch,glue = RTWP Register:i16 %R5, t3 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? The phases proceed, and this makes even less sense: # Machine code for function my_func: IsSSA, TracksLiveness BB#0: derived from LLVM BB %entry %vreg0<def> = LI 127; REG16:%vreg0 %R5<def> = COPY %vreg0; REG16:%vreg0 RTWP %R5 # End machine code for function my_func. I'm not complaining too hard, though, because in the end I get the assembly output I expect: # BB#0: # %entry LI $r5, 127 RTWP What I'm complaining about is that I still don't know how the DAG nodes work. Here's the -view-sched-dags output: [image: dags.jpg] 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? There's something that I'm missing, but I don't know what it is :( --Rob On Sun, Nov 5, 2017 at 1:22 AM 陳韋任 <chenwj.cs97g at g2.nctu.edu.tw> wrote:> Try match your instruction with (set REG16:$dst, i16imm:$src). Just give > it a shot. :) > > 2017-11-05 12:56 GMT+08:00 Robert Baruch via llvm-dev < > llvm-dev at lists.llvm.org>: > >> 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. >> >> On Sat, Nov 4, 2017 at 9:23 PM Craig Topper <craig.topper at gmail.com> >> wrote: >> >>> Do you have a pattern for loading an i16 immediate into a 16-bit >>> register? >>> >>> ~Craig >>> >>> On Sat, Nov 4, 2017 at 8:00 PM, Robert Baruch <robert.c.baruch at gmail.com >>> > wrote: >>> >>>> Hmm, okay. Then what's the problem being reported here? I'm not sure >>>> what I'm supposed to do with "LLVM ERROR: Cannot select: t1: i16 >>>> Constant<127>".BTW, the function is: >>>> >>>> ; ModuleID = 'return.c' >>>> source_filename = "return.c" >>>> target datalayout >>>> "E-m:e-p:16:16:16-i1:16:16-i8:16:16-i16:16:16-i32:16:16-i64:16:16-S16-n16" >>>> target triple = "tms9900" >>>> >>>> ; Function Attrs: noinline nounwind optnone >>>> define signext i16 @my_func() #0 { >>>> entry: >>>> ret i16 127 >>>> } >>>> >>>> ------- debug output -------- >>>> >>>> Optimized legalized selection DAG: BB#0 'my_func:entry' >>>> SelectionDAG has 5 nodes: >>>> t0: ch = EntryToken >>>> t3: ch,glue = CopyToReg t0, Register:i16 %R5, Constant:i16<127> >>>> t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1 >>>> >>>> ===== Instruction selection begins: BB#0 'entry' >>>> Selecting: t4: ch = TMS9900ISD::Ret t3, Register:i16 %R5, t3:1 >>>> >>>> ISEL: Starting pattern match on root node: t4: ch = TMS9900ISD::Ret t3, >>>> Register:i16 %R5, t3:1 >>>> >>>> Morphed node: t4: ch,glue = Retr Register:i16 %R5, t3 >>>> >>>> ISEL: Match complete! >>>> Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, >>>> Constant:i16<127> >>>> >>>> Selecting: t2: i16 = Register %R5 >>>> >>>> Selecting: t1: i16 = Constant<127> >>>> >>>> ISEL: Starting pattern match on root node: t1: i16 = Constant<127> >>>> >>>> Initial Opcode index to 0 >>>> Match failed at index 0 >>>> LLVM ERROR: Cannot select: t1: i16 = Constant<127> >>>> In function: my_func >>>> >>>> >>>> On Sat, Nov 4, 2017 at 7:22 PM Craig Topper <craig.topper at gmail.com> >>>> wrote: >>>> >>>>> 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::SelectCodeCommon >>>>> >>>>> It will then be turned into a TargetOpcode::COPY in >>>>> InstrEmitter::EmitSpecialNode when the DAG is turned into MachineInstrs. >>>>> >>>>> On Sat, Nov 4, 2017 at 7:02 PM Robert Baruch via llvm-dev < >>>>> llvm-dev at lists.llvm.org> wrote: >>>>> >>>>>> So there's a DAG that looks like this in the debug output: >>>>>> >>>>>> Selecting: t3: ch,glue = CopyToReg t0, Register:i16 %R5, >>>>>> Constant:i16<127> >>>>>> >>>>>> In the instruction selection phase, what pattern would that match? >>>>>> I've constructed this so far: >>>>>> >>>>>> (??? REG16:$dst, i16imm:$src) >>>>>> >>>>>> but the problem is, I can't determine what to use as ???. There is >>>>>> an ISD::CopyToReg enum value, but I don't know how that translates >>>>>> to the string to use in the pattern. >>>>>> >>>>>> And more generally, how do I find out from a DAG diagram like the >>>>>> ones output by -view-isel-dags which node type corresponds to which >>>>>> pattern string? >>>>>> >>>>>> Thanks, >>>>>> >>>>>> --Rob >>>>>> >>>>>> _______________________________________________ >>>>>> LLVM Developers mailing list >>>>>> llvm-dev at lists.llvm.org >>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>>>>> >>>>> -- >>>>> ~Craig >>>>> >>>> >>> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >> > > > -- > Wei-Ren Chen (陳韋任) > Homepage: https://people.cs.nctu.edu.tw/~chenwj >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171106/5bee238d/attachment.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: dags.jpg Type: image/jpeg Size: 24329 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171106/5bee238d/attachment.jpg>