nvc0/ir: fix collection of first uses for texture barrier insertion
One of the places we have to insert texbars is in situations where the result of the tex gets overwritten by a different instruction (e.g. in a conditional statement). However in some situations it can actually appear as though the original tex itself is an overwriting instruction. This can naturally never really happen, so just ignore the tex instruction when it comes up. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90347 Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: "10.5 10.6" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user