[Mesa-stable] [Mesa-dev] [PATCH 1/5] nir/cf: Remove phi sources if needed in nir_handle_add_jump
Iago Toral
itoral at igalia.com
Wed Oct 3 05:31:02 UTC 2018
On Tue, 2018-10-02 at 07:50 -0500, Jason Ekstrand wrote:
> On Tue, Oct 2, 2018 at 7:30 AM Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > On Tue, Oct 2, 2018 at 5:53 AM Iago Toral <itoral at igalia.com>
> > wrote:
> > > On Sat, 2018-09-22 at 16:39 -0500, Jason Ekstrand wrote:
> > >
> > > > If the block in which the jump is inserted is the predecessor
> > > of a
> > >
> > > > phi
> > >
> > > > then we need to remove phi sources otherwise the phi may end up
> > > with
> > >
> > > > things improperly connected. Found by running the Vulkan CTS
> > > with
> > >
> > > > SPIR-V optimizations enabled.
> > >
> > > >
> > >
> > > > Cc: mesa-stable at lists.freedesktop.org
> > >
> > > > ---
> > >
> > > > src/compiler/nir/nir_control_flow.c | 36 +++++++++++++++----
> > > ------
> > >
> > > > ----
> > >
> > > > 1 file changed, 19 insertions(+), 17 deletions(-)
> > >
> > > >
> > >
> > > > diff --git a/src/compiler/nir/nir_control_flow.c
> > >
> > > > b/src/compiler/nir/nir_control_flow.c
> > >
> > > > index 3b0a0f1a5b0..a82f35550b8 100644
> > >
> > > > --- a/src/compiler/nir/nir_control_flow.c
> > >
> > > > +++ b/src/compiler/nir/nir_control_flow.c
> > >
> > > > @@ -437,6 +437,23 @@ nearest_loop(nir_cf_node *node)
> > >
> > > > return nir_cf_node_as_loop(node);
> > >
> > > > }
> > >
> > > >
> > >
> > > > +static void
> > >
> > > > +remove_phi_src(nir_block *block, nir_block *pred)
> > >
> > > > +{
> > >
> > > > + nir_foreach_instr(instr, block) {
> > >
> > > > + if (instr->type != nir_instr_type_phi)
> > >
> > > > + break;
> > >
> > > > +
> > >
> > > > + nir_phi_instr *phi = nir_instr_as_phi(instr);
> > >
> > > > + nir_foreach_phi_src_safe(src, phi) {
> > >
> > > > + if (src->pred == pred) {
> > >
> > > > + list_del(&src->src.use_link);
> > >
> > > > + exec_node_remove(&src->node);
> > >
> > > > + }
> > >
> > > > + }
> > >
> > > > + }
> > >
> > > > +}
> > >
> > > > +
> > >
> > > > /*
> > >
> > > > * update the CFG after a jump instruction has been added to
> > > the end
> > >
> > > > of a block
> > >
> > > > */
> > >
> > > > @@ -447,6 +464,8 @@ nir_handle_add_jump(nir_block *block)
> > >
> > > > nir_instr *instr = nir_block_last_instr(block);
> > >
> > > > nir_jump_instr *jump_instr = nir_instr_as_jump(instr);
> > >
> > > >
> > >
> > > > + if (block->successors[0])
> > >
> > > > + remove_phi_src(block->successors[0], block);
> > >
> > >
> > >
> > > Don't we need to do the same for block->successors[1]?
> >
> > I was going to say no because his function handles *adding* a phi
> > and so the block should already only have one successor. However,
> > I suppose you could add a phi right before an if. I'll add the one
> > for block->successors[1] just to be safe.
>
> On further thought, I don't think it's possible to end up with phi
> sources at block->successors[1]. The only type of block that can
> have multiple successors is one right before an if and both sides of
> the if have only one predecessor so they can't have phis. Unless, of
> course, we add a bunch of no-op phis for some reason. Eh, removing
> phis on block->successors[1] is harmless and probably more correct.
> Still, it's a very weird case...
Yeah, that makes sense.
Iago
> --Jason
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-stable/attachments/20181003/24a87603/attachment.html>
More information about the mesa-stable
mailing list