Rail Shafigulin via llvm-dev
2016-May-12 23:05 UTC
[llvm-dev] specify dag pattern for an instructions
I'd like to apologize in advance if the question seems dumb, but I've never specified a DAG pattern for an instruction a don't know how it looks in LLVM. My target has an instruction which is similar to X86 horizontal add. The instruction, let's call is sumreduce, sums up all the elements in a vector and stores a result in GPR. What I'm trying to do is to replace a specific DAG pattern (it is given below) with this instruction (DAG node). Here is the pattern I need to replace: r0 r1 \ / add r2 \ / add r3 \ / add | r4 with r4 = sumreduce r0 r1 r2 r3 For now assume that the vector has 4 elements in it and all of them are i32. I would appreciate any pointers on how to do it. If someone could point me to an example code that converts a DAG pattern to a DAG node I would greatly appreciate it. -- Rail Shafigulin Software Engineer Esencia Technologies -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160512/affdc137/attachment-0001.html>
Nemanja Ivanovic via llvm-dev
2016-May-16 11:19 UTC
[llvm-dev] specify dag pattern for an instructions
It sounds like you want to specify a target-specific DAG combine. I'm sure most targets have many examples of this, but I'm familiar with PPC, so you can have a look at the node ISD::SIGN_EXTEND in lib/Target/PowerPC/PPCISelLowering.cpp. We specify in the target constructor that there's a DAG combine for the node ( setTargetDAGCombine(ISD::SIGN_EXTEND);). Then we specify what to do with it in PPCTargetLowering::PerformDAGCombine. Of course, the semantics are very different from what you're trying to do, but I think the general approach is what you're looking for (i.e. note that there's a target-specific DAG combine, then specify the details of the combine). I hope this helps and that I haven't misunderstood your question. Nemanja On Fri, May 13, 2016 at 1:05 AM, Rail Shafigulin via llvm-dev < llvm-dev at lists.llvm.org> wrote:> I'd like to apologize in advance if the question seems dumb, but I've > never specified a DAG pattern for an instruction a don't know how it looks > in LLVM. > > My target has an instruction which is similar to X86 horizontal add. The > instruction, let's call is sumreduce, sums up all the elements in a vector > and stores a result in GPR. What I'm trying to do is to replace a specific > DAG pattern (it is given below) with this instruction (DAG node). > > Here is the pattern I need to replace: > > r0 r1 > \ / > add r2 > \ / > add r3 > \ / > add > | > r4 > > with > r4 = sumreduce r0 r1 r2 r3 > > For now assume that the vector has 4 elements in it and all of them are > i32. > > I would appreciate any pointers on how to do it. If someone could point me > to an example code that converts a DAG pattern to a DAG node I would > greatly appreciate it. > > > -- > Rail Shafigulin > Software Engineer > Esencia Technologies > > _______________________________________________ > 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/20160516/c87ae6e2/attachment.html>