Liad Mordekoviz via llvm-dev
2017-Nov-28 08:18 UTC
[llvm-dev] Lowering operations using tablegen
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! -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171128/20fd429d/attachment.html>
Nemanja Ivanovic via llvm-dev
2017-Nov-30 10:32 UTC
[llvm-dev] Lowering operations using tablegen
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>