LLVM ERROR: Cannot select: 0x3284268: glue =
EsenciaISD::SET_FLAG
0x3283608, 0x3283710, 0x3283e48 [ORD=3] [ID=11]
0x3283608: i32,ch = CopyFromReg 0x3257980,
0x3283500 [ORD=1]
[ID=9]
0x3283500: i32 = Register %vreg5 [ID=1]
0x3283710: i32 = Constant<3> [ID=2]
0x3283e48: i32 = Constant<20> [ID=8]
In function: fib
As far as I can understand LLVM cannot select it
because the
pattern is
not specified. Unfortunately for me, I can't understand
how to
interpret
this output. Would anybody be able to help me out?
The DAG node that has failed selection is "SET_FLAG %vreg5,
3, 20",
the type of the node is "glue" and all 3 arguments are i32.
I understand where SET_FLAG, 3 and 20 come from, but how did you
arrive
the conclusion that %vreg5 should be part of the pattern?
The hex numbers are pointers. You can see the Use of 0x3283500 in
the CopyFromReg inst, and the def is here:
0x3283500: i32 = Register %vreg5 [ID=1]
I think this is where I'm loosing the "thread". Based on what I'm seeing
SET_FLAG has three operands, the first of which is a CopyFromReg.
Yes.
So how come the pattern is SET_FLAG %vreg5, 3, 20 and not SET_FLAG
CopyFromReg, 3, 20?
Because it's not... the latter is a better way of understanding it. The former is incorrect.
In other words how do we go from CopyFromReg to %vreg5?
Written imperatively, the DAG from the dump you pasted is:
something = dunno
reg = i32 Register %vreg5 [ID=1]
cpy = i32,ch CopyFromReg something, reg [ORD=1]
c1 = i32 Constant<3> [ID=2]
c2 = i32 Constant<20> [ID=8]
foo = EsenciaISD::SET_FLAG cpy, c1, c2 [ORD=3] [ID=11]
where:
something is 0x3257980
reg is 0x3283500
c1 is 0x3283710
c2 is 0x3283e48
foo is 0x3283608
These are just names I made up... the names don't actually exist as I've written them, but maybe that'll help your understanding?
This imperative order doesn't really exist either. Because it's a DAG, and the DAG isn't necessarily flattened like that... could be flattened in many different ways.
Jon