Copy propagate is not applied in function parameters when they are out
or inout.

But if the parameter is an array, we can copy propagate the index array.

This also fixes shaders@out-parameter-indexing piglit tests, that
exposes a wrong handling of inout function parameters in Mesa.

This commit does not produce any piglit regression, nor any change in
shader-db results.

v2:
  - Deal with swizzles (jasuarez)
  - Use a loop top peel off all array dereferences (Ilia)
---
 src/compiler/glsl/opt_copy_propagation.cpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/compiler/glsl/opt_copy_propagation.cpp 
b/src/compiler/glsl/opt_copy_propagation.cpp
index ae62921..e464de3 100644
--- a/src/compiler/glsl/opt_copy_propagation.cpp
+++ b/src/compiler/glsl/opt_copy_propagation.cpp
@@ -193,6 +193,24 @@ ir_copy_propagation_visitor::visit_enter(ir_call *ir)
       if (sig_param->data.mode != ir_var_function_out
           && sig_param->data.mode != ir_var_function_inout) {
          ir->accept(this);
+      } else {
+         /* Peeling of all array dereferences / swizzles */
+         ir_dereference_array *ir_array;
+         ir_swizzle *ir_swizzle;
+         do {
+            ir_array = ir->as_dereference_array();
+            if (ir_array) {
+               ir_array->array_index->accept(this);
+               ir = ir_array->array;
+               continue;
+            }
+            ir_swizzle = ir->as_swizzle();
+            if (ir_swizzle) {
+               ir = ir_swizzle->val;
+               continue;
+            }
+            ir = NULL;
+         } while (ir);
       }
    }
 
-- 
2.5.5

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to