summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristoph Bumiller <[email protected]>2012-01-07 21:00:51 +0100
committerChristoph Bumiller <[email protected]>2012-01-10 00:39:12 +0100
commit4021979182d3a6eb2bed1e9d784e218eb88bfa28 (patch)
tree45469639e6d2c17801552f105fb8e1813d7f3283 /src
parent601fb4b746ac498e69356fba0c17a1f6ce78df6c (diff)
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 ...
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp
index ff6d9666a19..f08026cf844 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);