summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorChristoph Bumiller <[email protected]>2012-04-18 17:00:52 +0200
committerChristoph Bumiller <[email protected]>2012-04-19 14:56:03 +0200
commit90b5301ceab8fd86fccf76efe7ebb039c0e4a28f (patch)
tree0e59c1b63cd4a5171e41021458dcf77c09f7fbc3 /src/gallium
parent97e2f625b8bcba96acde29dcd017031e036f4a24 (diff)
nv50/ir/opt: swap VP inputs to first source where possible
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
index 3852a8de3d0..7d0ebc69710 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
@@ -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;
}