summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_opt_undef.c
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2016-04-20 02:38:57 -0700
committerKenneth Graunke <kenneth@whitecape.org>2016-05-05 14:24:00 -0700
commitbc0062c54abeab6ee2848315990066fde2ca4d97 (patch)
treecf7206196bff05c0ab56728b2de99b45e785437e /src/compiler/nir/nir_opt_undef.c
parentc7a8b3270058a8831ee811494f722d278074b0f1 (diff)
downloadexternal_mesa3d-bc0062c54abeab6ee2848315990066fde2ca4d97.zip
external_mesa3d-bc0062c54abeab6ee2848315990066fde2ca4d97.tar.gz
external_mesa3d-bc0062c54abeab6ee2848315990066fde2ca4d97.tar.bz2
nir: Optimize out stores of undefs.
There are a couple of cycle count changes in shader-db, but it's basically a wash. However, with the Broadwell scalar TCS backend enabled, many Shadow of Mordor shaders benefit from this patch. Because we don't batch up output writes for TCS, vec4 outputs might not have all components defined. Many output writes have a value of undef, which is useless. With scalar TCS, stats for tessellation shaders on Broadwell: total instructions in shared programs: 1283000 -> 1280444 (-0.20%) instructions in affected programs: 34302 -> 31746 (-7.45%) helped: 71 HURT: 0 total cycles in shared programs: 10798768 -> 10780682 (-0.17%) cycles in affected programs: 158004 -> 139918 (-11.45%) helped: 71 HURT: 0 Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
Diffstat (limited to 'src/compiler/nir/nir_opt_undef.c')
-rw-r--r--src/compiler/nir/nir_opt_undef.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/compiler/nir/nir_opt_undef.c b/src/compiler/nir/nir_opt_undef.c
index a7bb887..c4777a8 100644
--- a/src/compiler/nir/nir_opt_undef.c
+++ b/src/compiler/nir/nir_opt_undef.c
@@ -100,6 +100,33 @@ opt_undef_vecN(nir_builder *b, nir_alu_instr *alu)
return true;
}
+/**
+ * Remove any store intrinsics whose value is undefined (the existing
+ * value is a fine representation of "undefined").
+ */
+static bool
+opt_undef_store(nir_intrinsic_instr *intrin)
+{
+ switch (intrin->intrinsic) {
+ case nir_intrinsic_store_var:
+ case nir_intrinsic_store_output:
+ case nir_intrinsic_store_per_vertex_output:
+ case nir_intrinsic_store_ssbo:
+ case nir_intrinsic_store_shared:
+ break;
+ default:
+ return false;
+ }
+
+ if (!intrin->src[0].is_ssa ||
+ intrin->src[0].ssa->parent_instr->type != nir_instr_type_ssa_undef)
+ return false;
+
+ nir_instr_remove(&intrin->instr);
+
+ return true;
+}
+
bool
nir_opt_undef(nir_shader *shader)
{
@@ -116,6 +143,9 @@ nir_opt_undef(nir_shader *shader)
progress = opt_undef_csel(alu) || progress;
progress = opt_undef_vecN(&b, alu) || progress;
+ } else if (instr->type == nir_instr_type_intrinsic) {
+ nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
+ progress = opt_undef_store(intrin) || progress;
}
}
}