diff options
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
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; } } |