diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp index b33d7b4010d..3a0e56e1385 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp @@ -2331,9 +2331,21 @@ RegAlloc::InsertConstraintsPass::insertConstraintMoves() assert(cst->getSrc(s)->defs.size() == 1); // still SSA Instruction *defi = cst->getSrc(s)->defs.front()->getInsn(); + bool imm = defi->op == OP_MOV && + defi->src(0).getFile() == FILE_IMMEDIATE; + bool load = defi->op == OP_LOAD && + defi->src(0).getFile() == FILE_MEMORY_CONST && + !defi->src(0).isIndirect(0); // catch some cases where don't really need MOVs - if (cst->getSrc(s)->refCount() == 1 && !defi->constrainedDefs()) + if (cst->getSrc(s)->refCount() == 1 && !defi->constrainedDefs()) { + if (imm || load) { + // Move the defi right before the cst. No point in expanding + // the range. + defi->bb->remove(defi); + cst->bb->insertBefore(cst, defi); + } continue; + } LValue *lval = new_LValue(func, cst->src(s).getFile()); lval->reg.size = size; @@ -2341,6 +2353,14 @@ RegAlloc::InsertConstraintsPass::insertConstraintMoves() mov = new_Instruction(func, OP_MOV, typeOfSize(size)); mov->setDef(0, lval); mov->setSrc(0, cst->getSrc(s)); + + if (load) { + mov->op = OP_LOAD; + mov->setSrc(0, defi->getSrc(0)); + } else if (imm) { + mov->setSrc(0, defi->getSrc(0)); + } + cst->setSrc(s, mov->getDef(0)); cst->bb->insertBefore(cst, mov); |