summaryrefslogtreecommitdiffstats
path: root/src/glsl/opt_copy_propagation_elements.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2014-08-28 15:44:49 -0700
committerKenneth Graunke <kenneth@whitecape.org>2014-09-03 17:26:04 -0700
commit702b6ea05178388aef22af36a53362212ce9b629 (patch)
tree600a2df2e40d189c13979b678a4f8b3260c24ac4 /src/glsl/opt_copy_propagation_elements.cpp
parent5ced83ee1561553d9eba831fa356bf63cc214447 (diff)
downloadexternal_mesa3d-702b6ea05178388aef22af36a53362212ce9b629.zip
external_mesa3d-702b6ea05178388aef22af36a53362212ce9b629.tar.gz
external_mesa3d-702b6ea05178388aef22af36a53362212ce9b629.tar.bz2
glsl: Skip rewriting instructions in opt_cpe when unnecessary.
Previously, opt_copy_propagation_elements would always rewrite the instruction stream, even if was the same thing as before. In order to report progress correctly, we'll need to bail if the suggested replacement is identical (or equivalent) to the original code. This also introduced unnecessary noop swizzles, as far as I can tell. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Matt Turner <mattst88@gmail.com>
Diffstat (limited to 'src/glsl/opt_copy_propagation_elements.cpp')
-rw-r--r--src/glsl/opt_copy_propagation_elements.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/glsl/opt_copy_propagation_elements.cpp b/src/glsl/opt_copy_propagation_elements.cpp
index f131894..a67f507 100644
--- a/src/glsl/opt_copy_propagation_elements.cpp
+++ b/src/glsl/opt_copy_propagation_elements.cpp
@@ -209,6 +209,7 @@ ir_copy_propagation_elements_visitor::handle_rvalue(ir_rvalue **ir)
ir_variable *source[4] = {NULL, NULL, NULL, NULL};
int source_chan[4] = {0, 0, 0, 0};
int chans;
+ bool noop_swizzle = true;
if (!*ir)
return;
@@ -250,6 +251,9 @@ ir_copy_propagation_elements_visitor::handle_rvalue(ir_rvalue **ir)
if (entry->write_mask & (1 << swizzle_chan[c])) {
source[c] = entry->rhs;
source_chan[c] = entry->swizzle[swizzle_chan[c]];
+
+ if (source_chan[c] != swizzle_chan[c])
+ noop_swizzle = false;
}
}
}
@@ -266,6 +270,12 @@ ir_copy_propagation_elements_visitor::handle_rvalue(ir_rvalue **ir)
if (!shader_mem_ctx)
shader_mem_ctx = ralloc_parent(deref_var);
+ /* Don't pointlessly replace the rvalue with itself (or a noop swizzle
+ * of itself, which would just be deleted by opt_noop_swizzle).
+ */
+ if (source[0] == var && noop_swizzle)
+ return;
+
if (debug) {
printf("Copy propagation from:\n");
(*ir)->print();