[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