[Mesa-dev] [PATCH] glsl: Do not vectorize vector array dereferences.

Andrew Guertin lists at dolphinling.net
Mon Feb 10 13:37:27 PST 2014


Tested-by: Andrew Guertin <lists at dolphinling.net>

On 02/10/2014 04:09 PM, Matt Turner wrote:
> Array dereferences must have scalar indices, so we cannot vectorize
> them.
>
> Reported-by: Andrew Guertin <lists at dolphinling.net>
> ---
>   src/glsl/opt_vectorize.cpp | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
>
> diff --git a/src/glsl/opt_vectorize.cpp b/src/glsl/opt_vectorize.cpp
> index 8ee81f1..dba303d 100644
> --- a/src/glsl/opt_vectorize.cpp
> +++ b/src/glsl/opt_vectorize.cpp
> @@ -82,6 +82,7 @@ public:
>
>      virtual ir_visitor_status visit_enter(ir_assignment *);
>      virtual ir_visitor_status visit_enter(ir_swizzle *);
> +   virtual ir_visitor_status visit_enter(ir_dereference_array *);
>      virtual ir_visitor_status visit_enter(ir_if *);
>      virtual ir_visitor_status visit_enter(ir_loop *);
>
> @@ -289,6 +290,19 @@ ir_vectorize_visitor::visit_enter(ir_swizzle *ir)
>      return visit_continue;
>   }
>
> +/* Upon entering an ir_array_dereference, remove the current assignment from
> + * further consideration. Since the index of an array dereference must scalar,
> + * we are not able to vectorize it.
> + *
> + * FINISHME: If all of scalar indices are identical we could vectorize.
> + */
> +ir_visitor_status
> +ir_vectorize_visitor::visit_enter(ir_dereference_array *ir)
> +{
> +   this->current_assignment = NULL;
> +   return visit_continue_with_parent;
> +}
> +
>   /* Since there is no statement to visit between the "then" and "else"
>    * instructions try to vectorize before, in between, and after them to avoid
>    * combining statements from different basic blocks.
>



More information about the mesa-dev mailing list