nv50/ir/opt: swap VP inputs to first source where possible
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 18 Apr 2012 15:00:52 +0000 (17:00 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 19 Apr 2012 12:56:03 +0000 (14:56 +0200)
src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp

index 3852a8de3d0b5b3277319e308cbbad22edba83e1..7d0ebc69710c83b8ecc4590bf8f849576eeafdf4 100644 (file)
@@ -123,6 +123,7 @@ private:
 
    bool isCSpaceLoad(Instruction *);
    bool isImmd32Load(Instruction *);
+   bool isAttribOrSharedLoad(Instruction *);
 };
 
 bool
@@ -139,6 +140,16 @@ LoadPropagation::isImmd32Load(Instruction *ld)
    return ld->src(0).getFile() == FILE_IMMEDIATE;
 }
 
+bool
+LoadPropagation::isAttribOrSharedLoad(Instruction *ld)
+{
+   return ld &&
+      (ld->op == OP_VFETCH ||
+       (ld->op == OP_LOAD &&
+        (ld->src(0).getFile() == FILE_SHADER_INPUT ||
+         ld->src(0).getFile() == FILE_MEMORY_SHARED)));
+}
+
 void
 LoadPropagation::checkSwapSrc01(Instruction *insn)
 {
@@ -162,6 +173,12 @@ LoadPropagation::checkSwapSrc01(Instruction *insn)
          insn->swapSources(0, 1);
       else
          return;
+   } else
+   if (isAttribOrSharedLoad(i1)) {
+      if (!isAttribOrSharedLoad(i0))
+         insn->swapSources(0, 1);
+      else
+         return;
    } else {
       return;
    }