mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 15:30:14 +01:00
nv50/ir: avoid deleting pseudo instructions too early
What happens is that a SPLIT operation is part of the spill node, and as a pseudo op, the instruction gets erased after processing its first def. However the later defs still need to refer to it, so instead delay deleting until after that whole RA node is done processing. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79462 Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Cc: "10.2 10.3" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
parent
9d2e298dd4
commit
0147c10c5f
1 changed files with 10 additions and 1 deletions
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <stack>
|
||||
#include <limits>
|
||||
#include <tr1/unordered_set>
|
||||
|
||||
namespace nv50_ir {
|
||||
|
||||
|
|
@ -1547,6 +1548,11 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
|||
LValue *lval = it->first->asLValue();
|
||||
Symbol *mem = it->second ? it->second->asSym() : NULL;
|
||||
|
||||
// Keep track of which instructions to delete later. Deleting them
|
||||
// inside the loop is unsafe since a single instruction may have
|
||||
// multiple destinations that all need to be spilled (like OP_SPLIT).
|
||||
std::tr1::unordered_set<Instruction *> to_del;
|
||||
|
||||
for (Value::DefIterator d = lval->defs.begin(); d != lval->defs.end();
|
||||
++d) {
|
||||
Value *slot = mem ?
|
||||
|
|
@ -1579,7 +1585,7 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
|||
d = lval->defs.erase(d);
|
||||
--d;
|
||||
if (slot->reg.file == FILE_MEMORY_LOCAL)
|
||||
delete_Instruction(func->getProgram(), defi);
|
||||
to_del.insert(defi);
|
||||
else
|
||||
defi->setDef(0, slot);
|
||||
} else {
|
||||
|
|
@ -1587,6 +1593,9 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
|||
}
|
||||
}
|
||||
|
||||
for (std::tr1::unordered_set<Instruction *>::const_iterator it = to_del.begin();
|
||||
it != to_del.end(); ++it)
|
||||
delete_Instruction(func->getProgram(), *it);
|
||||
}
|
||||
|
||||
// TODO: We're not trying to reuse old slots in a potential next iteration.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue