From: Christoph Bumiller Date: Sat, 7 Jan 2012 20:00:51 +0000 (+0100) Subject: nv50/ir/ra: don't coalesce contraint-moves X-Git-Tag: 062012170305~2292 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4021979182d3a6eb2bed1e9d784e218eb88bfa28;p=profile%2Fivi%2Fmesa.git nv50/ir/ra: don't coalesce contraint-moves This could lead to incorrect code when fixed regs are involved. Surprisingly, the increased freedom actually leads to lower register usage in some cases. Still want to find a better way to treat constraints though ... --- diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp index ff6d966..f08026c 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp @@ -513,6 +513,10 @@ RegAlloc::coalesceValues(unsigned int mask) case OP_MOV: if (!(mask & JOIN_MASK_MOV)) break; + i = insn->getDef(0)->uses ? insn->getDef(0)->uses->getInsn() : NULL; + // if this is a contraint-move there will only be a single use + if (i && i->op == OP_CONSTRAINT) + break; i = insn->getSrc(0)->getUniqueInsn(); if (i && !i->constrainedDefs()) insn->getDef(0)->coalesce(insn->getSrc(0), false);