summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir.h3
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_bb.cpp10
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_ssa.cpp21
3 files changed, 34 insertions, 0 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir.h b/src/gallium/drivers/nv50/codegen/nv50_ir.h
index d50e61fea92..d4e7c945226 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir.h
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir.h
@@ -887,6 +887,7 @@ public:
Graph::Node dom;
BitSet liveSet;
+ BitSet defSet;
uint32_t binPos;
uint32_t binSize;
@@ -937,6 +938,7 @@ public:
inline LValue *getLValue(int id);
+ void buildDefSets();
bool convertToSSA();
public:
@@ -960,6 +962,7 @@ public:
private:
void buildLiveSetsPreSSA(BasicBlock *, const int sequence);
+ void buildDefSetsPreSSA(BasicBlock *bb, const int seq);
private:
int id;
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_bb.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_bb.cpp
index 07d8decee54..7c8f2e97fb5 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_bb.cpp
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_bb.cpp
@@ -415,6 +415,16 @@ Function::orderInstructions(ArrayList &result)
return result.getSize();
}
+void
+Function::buildDefSets()
+{
+ for (unsigned i = 0; i <= loopNestingBound; ++i)
+ buildDefSetsPreSSA(BasicBlock::get(cfgExit), cfg.nextSequence());
+
+ for (ArrayList::Iterator bi = allBBlocks.iterator(); !bi.end(); bi.next())
+ BasicBlock::get(bi)->liveSet.marker = false;
+}
+
bool
Pass::run(Program *prog, bool ordered, bool skipPhi)
{
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_ssa.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_ssa.cpp
index b3a14865ab4..21b6cba251c 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_ssa.cpp
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_ssa.cpp
@@ -256,6 +256,27 @@ Function::buildLiveSetsPreSSA(BasicBlock *bb, const int seq)
bb->liveSet |= usedBeforeAssigned;
}
+void
+Function::buildDefSetsPreSSA(BasicBlock *bb, const int seq)
+{
+ bb->defSet.allocate(allLValues.getSize(), !bb->liveSet.marker);
+ bb->liveSet.marker = true;
+
+ for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) {
+ BasicBlock *in = BasicBlock::get(ei.getNode());
+
+ if (in->cfg.visit(seq))
+ buildDefSetsPreSSA(in, seq);
+
+ bb->defSet |= in->defSet;
+ }
+
+ for (Instruction *i = bb->getEntry(); i; i = i->next) {
+ for (int d = 0; i->defExists(d); ++d)
+ bb->defSet.set(i->getDef(d)->id);
+ }
+}
+
class RenamePass
{
public: