[llvm-dev] Gluing arbitrary nodes together
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Thu Jun 9 14:40:47 PDT 2016
On 6/3/2016 11:15 PM, Dylan McKay via llvm-dev wrote:
> I can’t figure out how I can glue all these nodes together and return
> the nonatomic load.
As Anton said, you would need to use glue values. A node would take a
glue as the last operand. That is the input glue, and will cause the
node to be glued to the node that produced it. The output glue is one
of the SDValues returned by the node (you can find out which one by
looking at the dump).
The DAG usually like this:
Glue0 = MVT::Glue
(..., Glue1, ...) = ISD::SOME_NODE_0 Op0, Op1, ..., Glue0
(..., Glue2, ...) = ISD::SOME_NODE_1 Op0, Op1, ..., Glue1
SOME_NODE_n would be created giving it MVT::Glue as the type of the last
operand. The problem is that getLoad does not accept glue operands, so
there isn't an easy way to use it with loads, which, I think, is the
problem you ran into.
If you want to have these nodes stick together, using glue may not be
sufficient. After the machine instructions are generated, the scheduler
may place instructions between the interrupt disable/restore and the
atomic load itself. Also, the register allocator may insert some spills
there---there are ways that this sequence may get separated.
For this, the best approach may be to define a pseudo-instruction, which
will be expanded into real instruction in the post-RA expansion pass.
If you need it only for the DAG nodes, you could try to manufacture your
own load via the generic getNode, forcing glue into it, but that may be
more effort than it's worth. Maybe lowering it into your
target-specific node would be the best approach after all?
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev