diff options
author | Ilia Mirkin <[email protected]> | 2014-07-07 01:53:52 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2015-02-20 19:51:50 -0500 |
commit | 5491458843998e8083baf9b62c14895946de1a3f (patch) | |
tree | 8861108c6c4b72cda0d220d18c2dbd6cc9b8a34d /src/gallium/drivers | |
parent | 93812dc10aebf805568926583b0f289ebb5ccbf6 (diff) |
nvc0/ir: remove merge/split pairs to allow normal propagation to occur
Because the TGSI interface creates merges for each instruction source
and then splits them back out, there are a lot of unnecessary
merge/split pairs which do essentially nothing. The various modifier/etc
propagation doesn't know how to walk though those, so just remove them
when they're unnecessary.
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index 62d2ef75f46..6a4ea4ed6e8 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -118,6 +118,35 @@ CopyPropagation::visit(BasicBlock *bb) // ============================================================================= +class MergeSplits : public Pass +{ +private: + virtual bool visit(BasicBlock *); +}; + +// For SPLIT / MERGE pairs that operate on the same registers, replace the +// post-merge def with the SPLIT's source. +bool +MergeSplits::visit(BasicBlock *bb) +{ + Instruction *i, *next, *si; + + for (i = bb->getEntry(); i; i = next) { + next = i->next; + if (i->op != OP_MERGE || typeSizeof(i->dType) != 8) + continue; + si = i->getSrc(0)->getInsn(); + if (si->op != OP_SPLIT || si != i->getSrc(1)->getInsn()) + continue; + i->def(0).replace(si->getSrc(0), false); + delete_Instruction(prog, i); + } + + return true; +} + +// ============================================================================= + class LoadPropagation : public Pass { private: @@ -2662,6 +2691,7 @@ Program::optimizeSSA(int level) { RUN_PASS(1, DeadCodeElim, buryAll); RUN_PASS(1, CopyPropagation, run); + RUN_PASS(1, MergeSplits, run); RUN_PASS(2, GlobalCSE, run); RUN_PASS(1, LocalCSE, run); RUN_PASS(2, AlgebraicOpt, run); |