Mesa (master): nv50/ir: fix false global CSE on instructions with multiple defs

Ilia Mirkin imirkin at kemper.freedesktop.org
Sat Jan 30 23:01:09 UTC 2016


Module: Mesa
Branch: master
Commit: 3ca941d60ed38800038cd545842e0ed3a69946da
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3ca941d60ed38800038cd545842e0ed3a69946da

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Sat Jan 30 17:13:33 2016 -0500

nv50/ir: fix false global CSE on instructions with multiple defs

If an instruction has multiple defs, we have to do a lot more checks to
make sure that we can move it forward. Among other things, various code
likes to do

    a, b = tex()
    if () c = a
    else c = b

which means that a single phi node will have results pointing at the
same instruction. We obviously can't propagate the tex in this case, but
properly accounting for this situation is tricky. Just don't try for
instructions with multiple defs.

This fixes about 20 shaders in shader-db, including the dolphin efb2ram
shader.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
Cc: mesa-stable at lists.freedesktop.org

---

 src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
index 684998e..81ee111 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -3075,6 +3075,8 @@ GlobalCSE::visit(BasicBlock *bb)
       ik = phi->getSrc(0)->getInsn();
       if (!ik)
          continue; // probably a function input
+      if (ik->defCount(0xff) > 1)
+         continue; // too painful to check if we can really push this forward
       for (s = 1; phi->srcExists(s); ++s) {
          if (phi->getSrc(s)->refCount() > 1)
             break;




More information about the mesa-commit mailing list