no changes without a dual_issue pass

changes with for ./GpuTest /test=pixmark_piano /benchmark /no_scorebox /msaa=0
/benchmark_duration_ms=60000 /width=1024 /height=640:

inst_executed: 1.03G
inst_issued1: 538M -> 535M
inst_issued2: 251M -> 254M

score: 1038 -> 1052

Signed-off-by: Karol Herbst <karolher...@gmail.com>
---
 src/gallium/drivers/nouveau/codegen/nv50_ir.cpp             | 11 +++++++++--
 src/gallium/drivers/nouveau/codegen/nv50_ir.h               |  1 +
 src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp |  4 ++++
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
index 179ad0b..7a90cb7 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.cpp
@@ -893,12 +893,19 @@ insnCheckCommutationDefDef(const Instruction *a, const 
Instruction *b)
 bool
 Instruction::isCommutationLegal(const Instruction *i) const
 {
-   bool ret = insnCheckCommutationDefDef(this, i);
-   ret = ret && insnCheckCommutationDefSrc(this, i);
+   bool ret = !i->dependsOn(this);
    ret = ret && insnCheckCommutationDefSrc(i, this);
    return ret;
 }
 
+bool
+Instruction::dependsOn(const Instruction *i) const
+{
+   bool ret = insnCheckCommutationDefDef(this, i);
+   ret = ret && insnCheckCommutationDefSrc(i, this);
+   return !ret;
+}
+
 TexInstruction::TexInstruction(Function *fn, operation op)
    : Instruction(fn, op, TYPE_F32)
 {
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h 
b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
index 6d2ee8b..d81fca9 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
@@ -831,6 +831,7 @@ public:
    bool isDead() const;
    bool isNop() const;
    bool isCommutationLegal(const Instruction *) const; // must be adjacent !
+   bool dependsOn(const Instruction *) const; // weaker form of 
isCommutationLegal
    bool isActionEqual(const Instruction *) const;
    bool isResultEqual(const Instruction *) const;
 
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
index faf2121..8ce8c19 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_nvc0.cpp
@@ -620,6 +620,10 @@ bool TargetNVC0::canDualIssue(const Instruction *a, const 
Instruction *b) const
       // not if the 2nd instruction isn't necessarily executed
       if (clA == OPCLASS_TEXTURE || clA == OPCLASS_FLOW)
          return false;
+
+      if (b->dependsOn(a))
+         return false;
+
       // anything with MOV
       if (a->op == OP_MOV || b->op == OP_MOV)
          return true;
-- 
2.9.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to