Tyler Kenney via llvm-dev
2016-Aug-23 21:07 UTC
[llvm-dev] Help in understanding physreg LiveVariables
So if I create a value with a DAG.getUndef(myVT); call during instruction legalization, how can I access that value as input in another BB/DAG (also during instruction legalization) without worrying about live-ins and/or phi nodes? Can I create a single virtual register and build both a CopyToReg and a CopyFromReg node with it? I assumed that would break SSA. Perhaps I should have said that what stops me is that I don't know how to pass a newly created virtual register from one MBB/DAG to another. Tyler From: Matthias Braun <mbraun at apple.com> To: Tyler Kenney/Marlborough/IBM at IBMUS Cc: llvm-dev at lists.llvm.org Date: 08/23/2016 04:43 PM Subject: Re: [llvm-dev] Help in understanding physreg LiveVariables Sent by: mbraun at apple.com On Aug 23, 2016, at 1:38 PM, Tyler Kenney <tjkenney at us.ibm.com> wrote: Matthias, Thanks for the response. In short, I'm using physregs because my current design, in some cases, needs to create an entirely new var/reg during instruction legalization. This value can be passed from one basic block to another and, therefore, must be added as a live-in to a number of basic blocks. I was unable to find a way to add a virt reg as a live-in to an MBB, thus the need for physregs. I asked about adding new inputs & outputs to basic blocks during instruction legalization/selection earlier on: http://lists.llvm.org/pipermail/llvm-dev/2016-June/100387.html Tim Northover responded with some useful insight but I did not really get a direct answer to my question on how to add MBB inputs (or if it's possible). The solution that I developed myself is to use virtual registers within MBBs and build CopyFrom/ToReg nodes at the BB boundaries with a physreg number, then add this physreg as a live-in where appropriate. This has been working for a few weeks now and, until I discovered this new issue where my live-in is ignored, had no known issues. So, to answer your question, what stops me from copying the physreg to a virtual register after the last def (and also stops me from avoiding pre-RA physregs entirely) is that I do not know how to add a virt reg live-in (and ensure the proper phi nodes get updated/created). If it's assumed that allocatable (and unreserved) PhysRegs are only live within a basic block, why is it possible to add such a physreg as an MBB live-in? Should there be an assertion added to MachineBasicBlock::addLiveIn() ? You should not need to worry about live-ins, they are only assumed to complete after register allocation. The only exception to this rule is the exception value on the edge to a landing part being marked as live-in and the per-function live-ins for arguments, but you should not need to worry about those two cases. - Matthias -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160823/6e54ec46/attachment.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: graycol.gif Type: image/gif Size: 105 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160823/6e54ec46/attachment.gif>
Matthias Braun via llvm-dev
2016-Aug-23 21:17 UTC
[llvm-dev] Help in understanding physreg LiveVariables
> On Aug 23, 2016, at 2:07 PM, Tyler Kenney <tjkenney at us.ibm.com> wrote: > > So if I create a value with a DAG.getUndef(myVT); call during instruction legalization, how can I access that value as input in another BB/DAG (also during instruction legalization) without worrying about live-ins and/or phi nodes? > > Can I create a single virtual register and build both a CopyToReg and a CopyFromReg node with it? I assumed that would break SSA. >Yes in Selection to you need to use CopyToReg/CoptFromReg to write to/from vregs that should cross basic blocks. Yes indeed this currently has to respect SSA form, so there should only be a single CopyToReg for each vreg and that def should dominate all users.> > Perhaps I should have said that what stops me is that I don't know how to pass a newly created virtual register from one MBB/DAG to another. >You have to remember the number somewhere, so you can use CopyFromReg on the vreg. - Matthias -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160823/632e72d0/attachment.html>
Tyler Kenney via llvm-dev
2016-Aug-23 21:35 UTC
[llvm-dev] Help in understanding physreg LiveVariables
So if I first create the value in an entry BB and then build a CopyToReg but then I have to read it in a BB that loops back to itself, with it's own CopyToReg at the end, then I have two CopyToReg nodes for the same value. In this case, I need to create 3 virt regs, 1 for each CopyToReg and a third for the CopyFromReg in the beginning of the loop BB, right? And then I need to build a PHI instruction at the beginning of the loop MBB that relates the 3 virt regs, right? Is there anything else I need to do regarding the creation of the new phi instruction, do you know? Tyler From: Matthias Braun <mbraun at apple.com> To: Tyler Kenney/Marlborough/IBM at IBMUS Cc: llvm-dev at lists.llvm.org Date: 08/23/2016 05:17 PM Subject: Re: [llvm-dev] Help in understanding physreg LiveVariables Sent by: mbraun at apple.com On Aug 23, 2016, at 2:07 PM, Tyler Kenney <tjkenney at us.ibm.com> wrote: So if I create a value with a DAG.getUndef(myVT); call during instruction legalization, how can I access that value as input in another BB/DAG (also during instruction legalization) without worrying about live-ins and/or phi nodes? Can I create a single virtual register and build both a CopyToReg and a CopyFromReg node with it? I assumed that would break SSA. Yes in Selection to you need to use CopyToReg/CoptFromReg to write to/from vregs that should cross basic blocks. Yes indeed this currently has to respect SSA form, so there should only be a single CopyToReg for each vreg and that def should dominate all users. Perhaps I should have said that what stops me is that I don't know how to pass a newly created virtual register from one MBB/DAG to another. You have to remember the number somewhere, so you can use CopyFromReg on the vreg. - Matthias -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160823/6ffffac5/attachment.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: graycol.gif Type: image/gif Size: 105 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160823/6ffffac5/attachment.gif>
Possibly Parallel Threads
- Help in understanding physreg LiveVariables
- Help in understanding physreg LiveVariables
- Help in understanding physreg LiveVariables
- Adding BB input/output registers during ISel
- [LLVMdev] Question on BlendSplat Code - LLVM Commit 72753f87f2b80d66cfd7ca7c7b6c0db6737d4b24