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