summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/opt_copy_propagation.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2016-04-03 02:02:12 -0700
committerKenneth Graunke <kenneth@whitecape.org>2016-04-12 15:57:48 -0700
commit95d622e16df0ddbf52e43a34bd6ed6dd15e3bdee (patch)
tree5e8821f5804efc214feb7073fa6e91e36eaae1d3 /src/compiler/glsl/opt_copy_propagation.cpp
parent8ec971a9972e5343cfb28da6f48650caba0a7e50 (diff)
downloadexternal_mesa3d-95d622e16df0ddbf52e43a34bd6ed6dd15e3bdee.zip
external_mesa3d-95d622e16df0ddbf52e43a34bd6ed6dd15e3bdee.tar.gz
external_mesa3d-95d622e16df0ddbf52e43a34bd6ed6dd15e3bdee.tar.bz2
glsl: Don't copy propagate or tree graft precise values.
This is kind of a hack. We currently track precise requirements by decorating ir_variables. Propagating or grafting the RHS of an assignment to a precise value into some other expression tree can lose those decorations. In the long run, it might be better to replace these ir_variable decorations with an "exact" decoration on ir_expression nodes, similar to what NIR does. In the short run, this is probably good enough. It preserves enough information for glsl_to_nir to generate "exact" decorations, and NIR will then handle optimizing these expressions reasonably. Fixes ES31-CTS.gpu_shader5.precise_qualifier. v2: Drop invariant handling, as it shouldn't be necessary (caught by Jason Ekstrand). Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Diffstat (limited to 'src/compiler/glsl/opt_copy_propagation.cpp')
-rw-r--r--src/compiler/glsl/opt_copy_propagation.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/compiler/glsl/opt_copy_propagation.cpp b/src/compiler/glsl/opt_copy_propagation.cpp
index 310708d..ae62921 100644
--- a/src/compiler/glsl/opt_copy_propagation.cpp
+++ b/src/compiler/glsl/opt_copy_propagation.cpp
@@ -331,7 +331,8 @@ ir_copy_propagation_visitor::add_copy(ir_assignment *ir)
ir->condition = new(ralloc_parent(ir)) ir_constant(false);
this->progress = true;
} else if (lhs_var->data.mode != ir_var_shader_storage &&
- lhs_var->data.mode != ir_var_shader_shared) {
+ lhs_var->data.mode != ir_var_shader_shared &&
+ lhs_var->data.precise == rhs_var->data.precise) {
entry = new(this->acp) acp_entry(lhs_var, rhs_var);
this->acp->push_tail(entry);
}