[Mesa-dev] [PATCH 1/4] glsl: Merge opt_noop_swizzle, and opt_swizzle_swizzle

Thomas Helland thomashelland90 at gmail.com
Mon May 15 22:55:54 UTC 2017


2017-05-16 0:24 GMT+02:00 Ian Romanick <idr at freedesktop.org>:
> On 04/06/2017 12:49 PM, Thomas Helland wrote:
>> The pass to optimize two swizzles in a row can be interpreted as
>> a noop swizzle optimization. Merge the two passes, and avoid having
>> the extra pass that runs a visitor pattern.
>> ---
>>  src/compiler/Makefile.sources             |  1 -
>>  src/compiler/glsl/glsl_parser_extras.cpp  |  1 -
>>  src/compiler/glsl/ir_optimization.h       |  1 -
>>  src/compiler/glsl/opt_noop_swizzle.cpp    | 43 +++++++++++++-
>>  src/compiler/glsl/opt_swizzle_swizzle.cpp | 97 -------------------------------
>
> I think I would have been inclined to keep the swizzle_swizzle name, but
> meh.
>
>>  5 files changed, 42 insertions(+), 101 deletions(-)
>>  delete mode 100644 src/compiler/glsl/opt_swizzle_swizzle.cpp
>>
>> diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources
>> index 2455d4eb5a..8b4245612b 100644
>> --- a/src/compiler/Makefile.sources
>> +++ b/src/compiler/Makefile.sources
>> @@ -134,7 +134,6 @@ LIBGLSL_FILES = \
>>       glsl/opt_rebalance_tree.cpp \
>>       glsl/opt_redundant_jumps.cpp \
>>       glsl/opt_structure_splitting.cpp \
>> -     glsl/opt_swizzle_swizzle.cpp \
>>       glsl/opt_tree_grafting.cpp \
>>       glsl/opt_vectorize.cpp \
>>       glsl/program.h \
>> diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
>> index 48cbc01ba7..53fcb0e45a 100644
>> --- a/src/compiler/glsl/glsl_parser_extras.cpp
>> +++ b/src/compiler/glsl/glsl_parser_extras.cpp
>> @@ -2170,7 +2170,6 @@ do_common_optimization(exec_list *ir, bool linked,
>>         options->EmitNoCont, options->EmitNoLoops);
>>     OPT(do_vec_index_to_swizzle, ir);
>>     OPT(lower_vector_insert, ir, false);
>> -   OPT(do_swizzle_swizzle, ir);
>>     OPT(do_noop_swizzle, ir);
>>
>>     OPT(optimize_split_arrays, ir, linked);
>> diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h
>> index 67a7514c7d..65d3b3e0db 100644
>> --- a/src/compiler/glsl/ir_optimization.h
>> +++ b/src/compiler/glsl/ir_optimization.h
>> @@ -122,7 +122,6 @@ bool do_mat_op_to_vec(exec_list *instructions);
>>  bool do_minmax_prune(exec_list *instructions);
>>  bool do_noop_swizzle(exec_list *instructions);
>>  bool do_structure_splitting(exec_list *instructions);
>> -bool do_swizzle_swizzle(exec_list *instructions);
>>  bool do_vectorize(exec_list *instructions);
>>  bool do_tree_grafting(exec_list *instructions);
>>  bool do_vec_index_to_cond_assign(exec_list *instructions);
>> diff --git a/src/compiler/glsl/opt_noop_swizzle.cpp b/src/compiler/glsl/opt_noop_swizzle.cpp
>> index 41890ab2b1..082e0195fe 100644
>> --- a/src/compiler/glsl/opt_noop_swizzle.cpp
>> +++ b/src/compiler/glsl/opt_noop_swizzle.cpp
>> @@ -49,6 +49,39 @@ public:
>>
>>  } /* unnamed namespace */
>>
>> +static bool
>> +opt_swizzle_swizzle(ir_swizzle *ir)
>> +{
>> +   int mask2[4];
>> +
>> +   ir_swizzle *swiz2 = ir->val->as_swizzle();
>> +   if (!swiz2)
>> +      return visit_continue;
>> +
>> +   memset(&mask2, 0, sizeof(mask2));
>> +   if (swiz2->mask.num_components >= 1)
>> +      mask2[0] = swiz2->mask.x;
>> +   if (swiz2->mask.num_components >= 2)
>> +      mask2[1] = swiz2->mask.y;
>> +   if (swiz2->mask.num_components >= 3)
>> +      mask2[2] = swiz2->mask.z;
>> +   if (swiz2->mask.num_components >= 4)
>> +      mask2[3] = swiz2->mask.w;
>> +
>> +   if (ir->mask.num_components >= 1)
>> +      ir->mask.x = mask2[ir->mask.x];
>> +   if (ir->mask.num_components >= 2)
>> +      ir->mask.y = mask2[ir->mask.y];
>> +   if (ir->mask.num_components >= 3)
>> +      ir->mask.z = mask2[ir->mask.z];
>> +   if (ir->mask.num_components >= 4)
>> +      ir->mask.w = mask2[ir->mask.w];
>> +
>> +   ir->val = swiz2->val;
>> +
>> +   return true;
>> +}
>> +
>>  void
>>  ir_noop_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue)
>>  {
>> @@ -56,7 +89,15 @@ ir_noop_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue)
>>        return;
>>
>>     ir_swizzle *swiz = (*rvalue)->as_swizzle();
>> -   if (!swiz || swiz->type != swiz->val->type)
>> +
>> +   if (!swiz)
>> +      return;
>> +
>> +   /* Check first if we can optimize two a sequence of two swizzles */
>
>                                         to
>
> The rest looks like it's just moving code from one place to another.
> Assuming there are no shader-db changes, this patch is
>

Yup, there are no shader-db changes.

> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>

Thanks for the review!

>> +   if (opt_swizzle_swizzle(swiz))
>> +      this->progress = true;
>> +
>> +   if (swiz->type != swiz->val->type)
>>        return;
>>
>>     int elems = swiz->val->type->vector_elements;
>> diff --git a/src/compiler/glsl/opt_swizzle_swizzle.cpp b/src/compiler/glsl/opt_swizzle_swizzle.cpp
>> deleted file mode 100644
>> index 7285474b08..0000000000
>> --- a/src/compiler/glsl/opt_swizzle_swizzle.cpp
>> +++ /dev/null
>> @@ -1,97 +0,0 @@
>> -/*
>> - * Copyright © 2010 Intel Corporation
>> - *
>> - * Permission is hereby granted, free of charge, to any person obtaining a
>> - * copy of this software and associated documentation files (the "Software"),
>> - * to deal in the Software without restriction, including without limitation
>> - * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>> - * and/or sell copies of the Software, and to permit persons to whom the
>> - * Software is furnished to do so, subject to the following conditions:
>> - *
>> - * The above copyright notice and this permission notice (including the next
>> - * paragraph) shall be included in all copies or substantial portions of the
>> - * Software.
>> - *
>> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>> - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>> - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>> - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>> - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>> - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
>> - * DEALINGS IN THE SOFTWARE.
>> - */
>> -
>> -/**
>> - * \file opt_swizzle_swizzle.cpp
>> - *
>> - * Eliminates the second swizzle in a swizzle chain.
>> - */
>> -
>> -#include "ir.h"
>> -#include "ir_visitor.h"
>> -#include "ir_optimization.h"
>> -#include "compiler/glsl_types.h"
>> -
>> -namespace {
>> -
>> -class ir_swizzle_swizzle_visitor : public ir_hierarchical_visitor {
>> -public:
>> -   ir_swizzle_swizzle_visitor()
>> -   {
>> -      progress = false;
>> -   }
>> -
>> -   virtual ir_visitor_status visit_enter(ir_swizzle *);
>> -
>> -   bool progress;
>> -};
>> -
>> -} /* unnamed namespace */
>> -
>> -ir_visitor_status
>> -ir_swizzle_swizzle_visitor::visit_enter(ir_swizzle *ir)
>> -{
>> -   int mask2[4];
>> -
>> -   ir_swizzle *swiz2 = ir->val->as_swizzle();
>> -   if (!swiz2)
>> -      return visit_continue;
>> -
>> -   memset(&mask2, 0, sizeof(mask2));
>> -   if (swiz2->mask.num_components >= 1)
>> -      mask2[0] = swiz2->mask.x;
>> -   if (swiz2->mask.num_components >= 2)
>> -      mask2[1] = swiz2->mask.y;
>> -   if (swiz2->mask.num_components >= 3)
>> -      mask2[2] = swiz2->mask.z;
>> -   if (swiz2->mask.num_components >= 4)
>> -      mask2[3] = swiz2->mask.w;
>> -
>> -   if (ir->mask.num_components >= 1)
>> -      ir->mask.x = mask2[ir->mask.x];
>> -   if (ir->mask.num_components >= 2)
>> -      ir->mask.y = mask2[ir->mask.y];
>> -   if (ir->mask.num_components >= 3)
>> -      ir->mask.z = mask2[ir->mask.z];
>> -   if (ir->mask.num_components >= 4)
>> -      ir->mask.w = mask2[ir->mask.w];
>> -
>> -   ir->val = swiz2->val;
>> -
>> -   this->progress = true;
>> -
>> -   return visit_continue;
>> -}
>> -
>> -/**
>> - * Does a copy propagation pass on the code present in the instruction stream.
>> - */
>> -bool
>> -do_swizzle_swizzle(exec_list *instructions)
>> -{
>> -   ir_swizzle_swizzle_visitor v;
>> -
>> -   v.run(instructions);
>> -
>> -   return v.progress;
>> -}
>>
>


More information about the mesa-dev mailing list