On 13.08.2016 12:02, Karol Herbst wrote:
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;

Reviewed-by: Tobias Klausmann <tobias.johannes.klausm...@mni.thm.de>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to