[llvm-dev] Lowering operations using tablegen

Nemanja Ivanovic via llvm-dev llvm-dev at lists.llvm.org
Thu Nov 30 02:32:23 PST 2017


Hi Liad,
this question conflates a whole bunch of concepts at the heart of how SDAG,
lowering, ISEL, etc. works. As such, it isn't likely that you'll get a
particularly satisfying answer. Well formulated, targeted questions are
likely to be answered in detail. Very general and vague questions such as
this are not likely to receive a lot of attention from the community.

That being said, I think the first step would be for you to familiarize
yourself with how instruction selection works. Eli has a couple of
excellent blog posts regarding this:
http://eli.thegreenplace.net/2012/11/24/life-of-an-instruction-in-llvm
http://eli.thegreenplace.net/2013/02/25/a-deeper-look-into-the-llvm-code-generator-part-1
I encourage you to look through those along with LLVM's own documentation
for a target-independent code generator (
http://llvm.org/docs/CodeGenerator.html). The right approach for what
you're after should be quite clear once you have a thorough understanding
of type/operation legalization, DAG combines and SDAG ISEL.

A bit more information about the actual question you asked...
The `LowerOperation` function is called during the lowering process for
operations that are marked as 'Custom' through 'setOperationAction'. If an
operation is marked `Expand`, the target-independent code will expand it to
other operations that are likely to be available on most targets. And of
course, if it is marked `Legal`, it goes straight to instruction selection
unchanged.

Furthermore, the SDAG provides DAG Combines. These are meant to replace
patterns/nodes that satisfy certain conditions with other patterns/nodes
that are more likely to produce efficient code. Similarly to lowering,
there's the target-independent version (in
lib/CodeGen/SelectionDAG/DAGCombiner.cpp) and the target-specific versions
(in your `PerformDAGCombine()`). The target-independent combines always run
and you can tell the SDAG you want to try your target-specific combines for
specific nodes by calling `setTargetDAGCombine()` for those nodes.

In effect, all of these processes replace "patterns" with other "patterns"
(more specifically, [groups of] nodes with other [groups of] nodes). So can
you replace a pattern with a different pattern through the .td files? Of
course - all of ISEL is essentially replacing [Target]ISD nodes with
machine SD nodes. The only limitation is that after ISEL, the DAG should
only contain machine SD nodes, so if you want special handling post-isel,
you should probably use pseudo-instructions.

Hope this helps.

On Tue, Nov 28, 2017 at 9:18 AM, Liad Mordekoviz via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hello,
> through my work on writing a backend, I've noticed that when I need to
> replace a pattern in the SelectionDAG with a different pattern the correct
> way to do it seems to be through the LowerOperation hook in the
> TargetLowering class.
>
> I was wondering if there is some way to achieve the same thing using
> tablegen, thank you!
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://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/20171130/d6ebf307/attachment.html>


More information about the llvm-dev mailing list