nir/phi-builder: Set the value in the block when creating a phi
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 15 Dec 2016 04:25:51 +0000 (20:25 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 30 Dec 2016 00:02:44 +0000 (16:02 -0800)
After we figure out the value that we are going to return, we have a
loop that walks up the dominance tree and sets the value in each of the
blocks that doesn't have one yet.  In the case of the phi, the def is
set to NEEDS_PHI not NULL, so the last one where the phi node actually
goes never gets filled out.  This can lead to duplicating the phi node
unnecessarily.

src/compiler/nir/nir_phi_builder.c

index 6b4b69399178ca48c6757b339fba2c7903728e37..acfc771da2f202b60a24468905e9d86a2c5e0df8 100644 (file)
@@ -216,7 +216,7 @@ nir_phi_builder_value_get_block_def(struct nir_phi_builder_value *val,
                         val->bit_size, NULL);
       phi->instr.block = dom;
       exec_list_push_tail(&val->phis, &phi->instr.node);
-      def = &phi->dest.ssa;
+      def = val->defs[dom->index] = &phi->dest.ssa;
    } else {
       /* In this case, we have an actual SSA def.  It's either the result of a
        * phi node created by the case above or one passed to us through