[llvm-dev] Proposing a small change to the SelectionDAG class to support recover from LLVM IR
Craig Topper via llvm-dev
llvm-dev at lists.llvm.org
Sun Jan 31 11:26:05 PST 2021
Hi Alex,
I'm not sure I understand how this map works. A single Value * may have a
StructType which is initially represented by a MERGE_VALUES node. But that
node will be removed in DAGCombine by connecting each operand of the
MERGE_VALUES to the users of each of the results. At that point there is no
single SDValue that represents the Value *. How does the map model this?
~Craig
On Sun, Jan 31, 2021 at 10:38 AM Alex Susu via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Hello, llvm-dev.
> I am trying to commit in the following weeks the back end I wrote for
> our research
> lab's Connex SIMD processor, a promising vector processor which we hope to
> make it visible
> (please see if you have the time these links related to the Connex
> processor:
> https://dl.acm.org/doi/10.1145/3406536,
> http://users.dcae.pub.ro/~gstefan/2ndLevel/functional_electronics.html ).
>
> But, since our back end has the exotic feature of handling symbolic
> immediate
> assembler operands to achieve vector-length portability by using JIT
> assembling I had to
> make a small change to the SelectionDAG class which I now would like to
> commit on Github.
>
> So I come to ask you what do you think about adding this useful small
> feature in the
> SelectionDAG class (a DenseMap<const Value*, SDValue> *crtNodeMapPtr
> datastructure and a
> bit of book-keeping for it).
>
> From https://reviews.llvm.org/D60052#change-7t38wfUuDjbR (my
> previous attempt to
> commit the Connex backend):
> > As written at
> http://lists.llvm.org/pipermail/llvm-dev/2019-May/132133.html:
> > There is one thing a bit more special with this back end,
> namely our back
> > end handles symbolic immediate operands (C/C++ expressions written
> as strings in
> INLINEASM MachineInstrs). This means the back end can output vector
> assembly code like:
> > VLOAD Reg0, N * 10 + 5 // where N is a variable in the
> original C program,
> which means that to assign to register Reg0 the value N*10 + 5.
> This instruction is
> later JIT assembled (at runtime) in order to have a constant immediate
> operand equal to
> N*10 + 5
> > Therefore, in order to support recovering from a SelectionDAG
> node to LLVM IR
> (and then all the way back to the original source C/C++ code), something
> possible with the
> current LLVM distribution, which is implemented in our Connex LLVM
> compiler project, we
> require adding a simple data structure in the LLVM source file:
> > include/llvm/CodeGen/SelectionDAG.h (and helper methods
> in the related
> > SelectionDAG.cpp file)
> > that maps an SDValue to the LLVM IR Value object it was
> used to translate
> from called:
> > DenseMap<const Value*, SDValue> *crtNodeMapPtr .
>
> Roman Lebedev asked me about this new feature that I propose, at
> https://lists.llvm.org/pipermail/llvm-dev/2019-May/132136.html
> > I'm not sure how that is supposed to work. What if IR does not
> originate from C?
> > How do you verify that the "C string" is in the form that will be
> understood
> > by whatever will handle it later on? Is there a clang part of the
> patch?
> My answer to his question is: the IR originates from C and there is no
> clang patch,
> since there is no need to alter clang. To recover a C/C++ expression from
> SelectionDAG
> node to LLVM IR (and then all the way back to the original source C/C++
> code) we only need
> to add this crtNodeMapPtr data structure. The recovery is performed by
> walking recursively
> on the LLVM IR code starting from the immediate operand of the assembler
> instruction until
> the end: the moment we visit an LLVM IR add instruction we simply put in
> the resulting
> C/C++ string we create a "+" operator.
>
> This recovery from SelectionDAG node to LLVM IR and then to C/C++ is
> working very well
> in my LLVM build. It is well tested on a few tenths of small benchmarks.
>
> Please let me know if you have any questions related to this proposed
> small change to
> the SelectionDAG class. You can find some more explanation on how we
> recover to C/C++ in
> my PhD thesis: see Section 4.1.8 ("Symbolic Scalar Immediate Operands") at
> https://sites.google.com/site/alexsusu/myfilecabinet/PhDThesis_AlexSusu.pdf
> .
>
>
> Thank you,
> Alex
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210131/57c0f683/attachment.html>
More information about the llvm-dev
mailing list