From dfb0ca16065c1d251101bb094f2cfd08cf3cda15 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 17 Jul 2014 00:30:40 -0400 Subject: [PATCH] nv50/ir: fix phi/union sources when their def has been merged 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 --- src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp index 242af4e073c..5ab6570175d 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp @@ -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; } } -- 2.30.2