nv50/ir: fix phi/union sources when their def has been merged
authorIlia Mirkin <imirkin@alum.mit.edu>
Thu, 17 Jul 2014 04:30:40 +0000 (00:30 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Thu, 24 Jul 2014 12:26:41 +0000 (08:26 -0400)
In a situation where double-register values are used, the phi nodes can
still end up being u32 values. They all get merged into one RA node
though. When fixing up the merge (which comes after the phi node), the
phi node's def would get fixed, but not its sources which would remain
at the low register value.

This maintains the invariant that a phi node's defs and sources are
allocated the same register.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp

index 242af4e073c99414c588733649cdd5c9d8956ba8..5ab6570175db99e79c83b9d2dd8448017ffd3b45 100644 (file)
@@ -1702,6 +1702,14 @@ GCRA::resolveSplitsAndMerges()
          Value *v = merge->getSrc(s);
          v->reg.data.id = regs.bytesToId(v, reg);
          v->join = v;
+         // If the value is defined by a phi/union node, we also need to
+         // perform the same fixup on that node's sources, since after RA
+         // their registers should be identical.
+         if (v->getInsn()->op == OP_PHI || v->getInsn()->op == OP_UNION) {
+            Instruction *phi = v->getInsn();
+            for (int phis = 0; phi->srcExists(phis); ++phis)
+               phi->getSrc(phis)->join = v;
+         }
          reg += v->reg.size;
       }
    }