diff options
author | Francisco Jerez <[email protected]> | 2012-03-21 21:43:26 +0100 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2012-04-14 21:54:01 +0200 |
commit | 3e9150cd961b2399e402e940400deae11ec7852f (patch) | |
tree | 13eda3dd9391fe9788b4bec3f7cff1e572005910 /src/gallium/drivers/nv50 | |
parent | d6d1f0e4a25c9fbefce7485d77617855a8ea956a (diff) |
nv50/ir: Add support code for calculating the clobber set of a BB or function.
Diffstat (limited to 'src/gallium/drivers/nv50')
-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: |