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>