mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
nv50/ir: use unordered_set instead of list to keep track of var uses
The set of variable uses does not need to be ordered in any way, and removing/adding elements is a fairly common operation in various optimization passes. This shortens runtime of piglit test fp-long-alu to ~22s from ~4h Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
parent
503391b46f
commit
a9b21015f5
4 changed files with 10 additions and 9 deletions
|
|
@ -141,9 +141,9 @@ ValueRef::set(Value *refVal)
|
|||
if (value == refVal)
|
||||
return;
|
||||
if (value)
|
||||
value->uses.remove(this);
|
||||
value->uses.erase(this);
|
||||
if (refVal)
|
||||
refVal->uses.push_back(this);
|
||||
refVal->uses.insert(this);
|
||||
|
||||
value = refVal;
|
||||
}
|
||||
|
|
@ -206,7 +206,7 @@ ValueDef::replace(const ValueRef &repVal, bool doSet)
|
|||
return;
|
||||
|
||||
while (!value->uses.empty()) {
|
||||
ValueRef *ref = value->uses.front();
|
||||
ValueRef *ref = *value->uses.begin();
|
||||
ref->set(repVal.get());
|
||||
ref->mod *= repVal.mod;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include <deque>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <tr1/unordered_set>
|
||||
|
||||
#include "codegen/nv50_ir_util.h"
|
||||
#include "codegen/nv50_ir_graph.h"
|
||||
|
|
@ -581,10 +582,10 @@ public:
|
|||
|
||||
static inline Value *get(Iterator&);
|
||||
|
||||
std::list<ValueRef *> uses;
|
||||
std::tr1::unordered_set<ValueRef *> uses;
|
||||
std::list<ValueDef *> defs;
|
||||
typedef std::list<ValueRef *>::iterator UseIterator;
|
||||
typedef std::list<ValueRef *>::const_iterator UseCIterator;
|
||||
typedef std::tr1::unordered_set<ValueRef *>::iterator UseIterator;
|
||||
typedef std::tr1::unordered_set<ValueRef *>::const_iterator UseCIterator;
|
||||
typedef std::list<ValueDef *>::iterator DefIterator;
|
||||
typedef std::list<ValueDef *>::const_iterator DefCIterator;
|
||||
|
||||
|
|
|
|||
|
|
@ -686,7 +686,7 @@ ConstantFolding::tryCollapseChainedMULs(Instruction *mul2,
|
|||
// b = mul a, imm
|
||||
// d = mul b, c -> d = mul_x_imm a, c
|
||||
int s2, t2;
|
||||
insn = mul2->getDef(0)->uses.front()->getInsn();
|
||||
insn = (*mul2->getDef(0)->uses.begin())->getInsn();
|
||||
if (!insn)
|
||||
return;
|
||||
mul1 = mul2;
|
||||
|
|
|
|||
|
|
@ -983,7 +983,7 @@ GCRA::doCoalesce(ArrayList& insns, unsigned int mask)
|
|||
break;
|
||||
i = NULL;
|
||||
if (!insn->getDef(0)->uses.empty())
|
||||
i = insn->getDef(0)->uses.front()->getInsn();
|
||||
i = (*insn->getDef(0)->uses.begin())->getInsn();
|
||||
// if this is a contraint-move there will only be a single use
|
||||
if (i && i->op == OP_MERGE) // do we really still need this ?
|
||||
break;
|
||||
|
|
@ -1559,7 +1559,7 @@ SpillCodeInserter::run(const std::list<ValuePair>& lst)
|
|||
// Unspill at each use *before* inserting spill instructions,
|
||||
// we don't want to have the spill instructions in the use list here.
|
||||
while (!dval->uses.empty()) {
|
||||
ValueRef *u = dval->uses.front();
|
||||
ValueRef *u = *dval->uses.begin();
|
||||
Instruction *usei = u->getInsn();
|
||||
assert(usei);
|
||||
if (usei->isPseudo()) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue