diff options
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_bb.cpp | 10 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/codegen/nv50_ir_ssa.cpp | 21 |
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: |