diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp index 411e2de1b11..7a5d1ce0299 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -168,7 +168,7 @@ NVC0LegalizePostRA::insnDominatedBy(const Instruction *later, void NVC0LegalizePostRA::addTexUse(std::list<TexUse> &uses, - Instruction *usei, const Instruction *insn) + Instruction *usei, const Instruction *texi) { bool add = true; for (std::list<TexUse>::iterator it = uses.begin(); @@ -183,7 +183,7 @@ NVC0LegalizePostRA::addTexUse(std::list<TexUse> &uses, ++it; } if (add) - uses.push_back(TexUse(usei, insn)); + uses.push_back(TexUse(usei, texi)); } void @@ -195,7 +195,8 @@ NVC0LegalizePostRA::findOverwritingDefs(const Instruction *texi, while (insn->op == OP_MOV && insn->getDef(0)->equals(insn->getSrc(0))) insn = insn->getSrc(0)->getUniqueInsn(); - if (!insn->bb->reachableBy(texi->bb, term)) + // NOTE: the tex itself is, of course, not an overwriting definition + if (insn == texi || !insn->bb->reachableBy(texi->bb, term)) return; switch (insn->op) { @@ -243,7 +244,12 @@ NVC0LegalizePostRA::findFirstUses( visited.insert(usei); if (usei->op == OP_PHI || usei->op == OP_UNION) { - // need a barrier before WAW cases + // need a barrier before WAW cases, like: + // %r0 = tex + // if ... + // texbar <- is required or tex might replace x again + // %r1 = x <- overwriting def + // %r2 = phi %r0, %r1 for (int s = 0; usei->srcExists(s); ++s) { Instruction *defi = usei->getSrc(s)->getUniqueInsn(); if (defi && &usei->src(s) != *u) @@ -262,7 +268,7 @@ NVC0LegalizePostRA::findFirstUses( usei->subOp != NV50_IR_SUBOP_MOV_FINAL) { findFirstUses(texi, usei, uses, visited); } else { - addTexUse(uses, usei, insn); + addTexUse(uses, usei, texi); } } } |