<div dir="auto"><div>Changes all look really good, and some performance numbers<br></div><div dir="auto">I have for a similar patch I've written shows a marginal benefit</div><div dir="auto">in compiler runtime performance (perf-stat -> cycles executed)</div><div dir="auto">For patches 4 and 5.</div><div dir="auto"><br></div><div dir="auto">Reviewed-by: <<a href="mailto:thomashelland90@gmail.com">thomashelland90@gmail.com</a>><br><div class="gmail_extra" dir="auto"><br><div class="gmail_quote">2. nov. 2017 21.26 skrev "Ian Romanick" <<a href="mailto:idr@freedesktop.org">idr@freedesktop.org</a>>:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
<br>
Signed-off-by: Ian Romanick <<a href="mailto:ian.d.romanick@intel.com">ian.d.romanick@intel.com</a>><br>
---<br>
 src/compiler/Makefile.sources                      |  3 +-<br>
 src/compiler/glsl/glsl_parser_<wbr>extras.cpp           |  3 +-<br>
 src/compiler/glsl/ir_<wbr>optimization.h                |  3 +-<br>
 src/compiler/glsl/meson.build                      |  3 +-<br>
 .../glsl/{opt_noop_swizzle.cpp => opt_swizzle.cpp} | 56 ++++++++++---<br>
 src/compiler/glsl/opt_swizzle_<wbr>swizzle.cpp          | 96 ----------------------<br>
 src/compiler/glsl/test_<wbr>optpass.cpp                 |  6 +-<br>
 7 files changed, 52 insertions(+), 118 deletions(-)<br>
 rename src/compiler/glsl/{opt_noop_<wbr>swizzle.cpp => opt_swizzle.cpp} (56%)<br>
 delete mode 100644 src/compiler/glsl/opt_swizzle_<wbr>swizzle.cpp<br>
<br>
diff --git a/src/compiler/Makefile.<wbr>sources b/src/compiler/Makefile.<wbr>sources<br>
index b80468c..60814e2 100644<br>
--- a/src/compiler/Makefile.<wbr>sources<br>
+++ b/src/compiler/Makefile.<wbr>sources<br>
@@ -130,11 +130,10 @@ LIBGLSL_FILES = \<br>
        glsl/opt_function_inlining.cpp \<br>
        glsl/opt_if_simplification.cpp \<br>
        glsl/opt_minmax.cpp \<br>
-       glsl/opt_noop_swizzle.cpp \<br>
        glsl/opt_rebalance_tree.cpp \<br>
        glsl/opt_redundant_jumps.cpp \<br>
        glsl/opt_structure_splitting.<wbr>cpp \<br>
-       glsl/opt_swizzle_swizzle.cpp \<br>
+       glsl/opt_swizzle.cpp \<br>
        glsl/opt_tree_grafting.cpp \<br>
        glsl/opt_vectorize.cpp \<br>
        glsl/program.h \<br>
diff --git a/src/compiler/glsl/glsl_<wbr>parser_extras.cpp b/src/compiler/glsl/glsl_<wbr>parser_extras.cpp<br>
index 822301a..5982173 100644<br>
--- a/src/compiler/glsl/glsl_<wbr>parser_extras.cpp<br>
+++ b/src/compiler/glsl/glsl_<wbr>parser_extras.cpp<br>
@@ -2226,8 +2226,7 @@ do_common_optimization(exec_<wbr>list *ir, bool linked,<br>
        options->EmitNoCont, options->EmitNoLoops);<br>
    OPT(do_vec_index_to_swizzle, ir);<br>
    OPT(lower_vector_insert, ir, false);<br>
-   OPT(do_swizzle_swizzle, ir);<br>
-   OPT(do_noop_swizzle, ir);<br>
+   OPT(optimize_swizzles, ir);<br>
<br>
    OPT(optimize_split_arrays, ir, linked);<br>
    OPT(optimize_redundant_jumps, ir);<br>
diff --git a/src/compiler/glsl/ir_<wbr>optimization.h b/src/compiler/glsl/ir_<wbr>optimization.h<br>
index f44ddcb..2b8c195 100644<br>
--- a/src/compiler/glsl/ir_<wbr>optimization.h<br>
+++ b/src/compiler/glsl/ir_<wbr>optimization.h<br>
@@ -123,9 +123,8 @@ bool lower_if_to_cond_assign(gl_<wbr>shader_stage stage, exec_list *instructions,<br>
                              unsigned max_depth = 0, unsigned min_branch_cost = 0);<br>
 bool do_mat_op_to_vec(exec_list *instructions);<br>
 bool do_minmax_prune(exec_list *instructions);<br>
-bool do_noop_swizzle(exec_list *instructions);<br>
 bool do_structure_splitting(exec_<wbr>list *instructions);<br>
-bool do_swizzle_swizzle(exec_list *instructions);<br>
+bool optimize_swizzles(exec_list *instructions);<br>
 bool do_vectorize(exec_list *instructions);<br>
 bool do_tree_grafting(exec_list *instructions);<br>
 bool do_vec_index_to_cond_assign(<wbr>exec_list *instructions);<br>
diff --git a/src/compiler/glsl/meson.<wbr>build b/src/compiler/glsl/meson.<wbr>build<br>
index 76fcafb..6284d0c 100644<br>
--- a/src/compiler/glsl/meson.<wbr>build<br>
+++ b/src/compiler/glsl/meson.<wbr>build<br>
@@ -169,11 +169,10 @@ files_libglsl = files(<br>
   'opt_function_inlining.cpp',<br>
   'opt_if_simplification.cpp',<br>
   'opt_minmax.cpp',<br>
-  'opt_noop_swizzle.cpp',<br>
   'opt_rebalance_tree.cpp',<br>
   'opt_redundant_jumps.cpp',<br>
   'opt_structure_splitting.cpp',<br>
-  'opt_swizzle_swizzle.cpp',<br>
+  'opt_swizzle.cpp',<br>
   'opt_tree_grafting.cpp',<br>
   'opt_vectorize.cpp',<br>
   'program.h',<br>
diff --git a/src/compiler/glsl/opt_noop_<wbr>swizzle.cpp b/src/compiler/glsl/opt_<wbr>swizzle.cpp<br>
similarity index 56%<br>
rename from src/compiler/glsl/opt_noop_<wbr>swizzle.cpp<br>
rename to src/compiler/glsl/opt_swizzle.<wbr>cpp<br>
index 41890ab..2fbe362 100644<br>
--- a/src/compiler/glsl/opt_noop_<wbr>swizzle.cpp<br>
+++ b/src/compiler/glsl/opt_<wbr>swizzle.cpp<br>
@@ -22,11 +22,14 @@<br>
  */<br>
<br>
 /**<br>
- * \file opt_noop_swizzle.cpp<br>
+ * \file opt_swizzle.cpp<br>
+ * Optimize swizzle operations.<br>
  *<br>
- * If a swizzle doesn't change the order or count of components, then<br>
- * remove the swizzle so that other optimization passes see the value<br>
- * behind it.<br>
+ * First, compact a sequence of swizzled swizzles into a single swizzle.<br>
+ *<br>
+ * If the final resulting swizzle doesn't change the order or count of<br>
+ * components, then remove the swizzle so that other optimization passes see<br>
+ * the value behind it.<br>
  */<br>
<br>
 #include "ir.h"<br>
@@ -36,9 +39,9 @@<br>
<br>
 namespace {<br>
<br>
-class ir_noop_swizzle_visitor : public ir_rvalue_visitor {<br>
+class ir_opt_swizzle_visitor : public ir_rvalue_visitor {<br>
 public:<br>
-   ir_noop_swizzle_visitor()<br>
+   ir_opt_swizzle_visitor()<br>
    {<br>
       this->progress = false;<br>
    }<br>
@@ -50,13 +53,46 @@ public:<br>
 } /* unnamed namespace */<br>
<br>
 void<br>
-ir_noop_swizzle_visitor::<wbr>handle_rvalue(ir_rvalue **rvalue)<br>
+ir_opt_swizzle_visitor::<wbr>handle_rvalue(ir_rvalue **rvalue)<br>
 {<br>
    if (!*rvalue)<br>
       return;<br>
<br>
    ir_swizzle *swiz = (*rvalue)->as_swizzle();<br>
-   if (!swiz || swiz->type != swiz->val->type)<br>
+<br>
+   if (!swiz)<br>
+      return;<br>
+<br>
+   ir_swizzle *swiz2;<br>
+<br>
+   while ((swiz2 = swiz->val->as_swizzle()) != NULL) {<br>
+      int mask2[4];<br>
+<br>
+      memset(&mask2, 0, sizeof(mask2));<br>
+      if (swiz2->mask.num_components >= 1)<br>
+         mask2[0] = swiz2->mask.x;<br>
+      if (swiz2->mask.num_components >= 2)<br>
+         mask2[1] = swiz2->mask.y;<br>
+      if (swiz2->mask.num_components >= 3)<br>
+         mask2[2] = swiz2->mask.z;<br>
+      if (swiz2->mask.num_components >= 4)<br>
+         mask2[3] = swiz2->mask.w;<br>
+<br>
+      if (swiz->mask.num_components >= 1)<br>
+         swiz->mask.x = mask2[swiz->mask.x];<br>
+      if (swiz->mask.num_components >= 2)<br>
+         swiz->mask.y = mask2[swiz->mask.y];<br>
+      if (swiz->mask.num_components >= 3)<br>
+         swiz->mask.z = mask2[swiz->mask.z];<br>
+      if (swiz->mask.num_components >= 4)<br>
+         swiz->mask.w = mask2[swiz->mask.w];<br>
+<br>
+      swiz->val = swiz2->val;<br>
+<br>
+      this->progress = true;<br>
+   }<br>
+<br>
+   if (swiz->type != swiz->val->type)<br>
       return;<br>
<br>
    int elems = swiz->val->type->vector_<wbr>elements;<br>
@@ -74,9 +110,9 @@ ir_noop_swizzle_visitor::<wbr>handle_rvalue(ir_rvalue **rvalue)<br>
 }<br>
<br>
 bool<br>
-do_noop_swizzle(exec_list *instructions)<br>
+optimize_swizzles(exec_list *instructions)<br>
 {<br>
-   ir_noop_swizzle_visitor v;<br>
+   ir_opt_swizzle_visitor v;<br>
    visit_list_elements(&v, instructions);<br>
<br>
    return v.progress;<br>
diff --git a/src/compiler/glsl/opt_<wbr>swizzle_swizzle.cpp b/src/compiler/glsl/opt_<wbr>swizzle_swizzle.cpp<br>
deleted file mode 100644<br>
index 40ce268..0000000<br>
--- a/src/compiler/glsl/opt_<wbr>swizzle_swizzle.cpp<br>
+++ /dev/null<br>
@@ -1,96 +0,0 @@<br>
-/*<br>
- * Copyright © 2010 Intel Corporation<br>
- *<br>
- * Permission is hereby granted, free of charge, to any person obtaining a<br>
- * copy of this software and associated documentation files (the "Software"),<br>
- * to deal in the Software without restriction, including without limitation<br>
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,<br>
- * and/or sell copies of the Software, and to permit persons to whom the<br>
- * Software is furnished to do so, subject to the following conditions:<br>
- *<br>
- * The above copyright notice and this permission notice (including the next<br>
- * paragraph) shall be included in all copies or substantial portions of the<br>
- * Software.<br>
- *<br>
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL<br>
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING<br>
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER<br>
- * DEALINGS IN THE SOFTWARE.<br>
- */<br>
-<br>
-/**<br>
- * \file opt_swizzle_swizzle.cpp<br>
- * Compact a sequence of swizzled swizzles into a single swizzle.<br>
- */<br>
-<br>
-#include "ir.h"<br>
-#include "ir_visitor.h"<br>
-#include "ir_optimization.h"<br>
-#include "compiler/glsl_types.h"<br>
-<br>
-namespace {<br>
-<br>
-class ir_swizzle_swizzle_visitor : public ir_hierarchical_visitor {<br>
-public:<br>
-   ir_swizzle_swizzle_visitor()<br>
-   {<br>
-      progress = false;<br>
-   }<br>
-<br>
-   virtual ir_visitor_status visit_enter(ir_swizzle *);<br>
-<br>
-   bool progress;<br>
-};<br>
-<br>
-} /* unnamed namespace */<br>
-<br>
-ir_visitor_status<br>
-ir_swizzle_swizzle_visitor::<wbr>visit_enter(ir_swizzle *ir)<br>
-{<br>
-   ir_swizzle *swiz2;<br>
-<br>
-   while ((swiz2 = ir->val->as_swizzle()) != NULL) {<br>
-      int mask2[4];<br>
-<br>
-      memset(&mask2, 0, sizeof(mask2));<br>
-      if (swiz2->mask.num_components >= 1)<br>
-         mask2[0] = swiz2->mask.x;<br>
-      if (swiz2->mask.num_components >= 2)<br>
-         mask2[1] = swiz2->mask.y;<br>
-      if (swiz2->mask.num_components >= 3)<br>
-         mask2[2] = swiz2->mask.z;<br>
-      if (swiz2->mask.num_components >= 4)<br>
-         mask2[3] = swiz2->mask.w;<br>
-<br>
-      if (ir->mask.num_components >= 1)<br>
-         ir->mask.x = mask2[ir->mask.x];<br>
-      if (ir->mask.num_components >= 2)<br>
-         ir->mask.y = mask2[ir->mask.y];<br>
-      if (ir->mask.num_components >= 3)<br>
-         ir->mask.z = mask2[ir->mask.z];<br>
-      if (ir->mask.num_components >= 4)<br>
-         ir->mask.w = mask2[ir->mask.w];<br>
-<br>
-      ir->val = swiz2->val;<br>
-<br>
-      this->progress = true;<br>
-   }<br>
-<br>
-   return visit_continue;<br>
-}<br>
-<br>
-/**<br>
- * Does a copy propagation pass on the code present in the instruction stream.<br>
- */<br>
-bool<br>
-do_swizzle_swizzle(exec_list *instructions)<br>
-{<br>
-   ir_swizzle_swizzle_visitor v;<br>
-<br>
-   v.run(instructions);<br>
-<br>
-   return v.progress;<br>
-}<br>
diff --git a/src/compiler/glsl/test_<wbr>optpass.cpp b/src/compiler/glsl/test_<wbr>optpass.cpp<br>
index c6e9788..5fd1b2b 100644<br>
--- a/src/compiler/glsl/test_<wbr>optpass.cpp<br>
+++ b/src/compiler/glsl/test_<wbr>optpass.cpp<br>
@@ -102,12 +102,10 @@ do_optimization(struct exec_list *ir, const char *optimization,<br>
       return lower_if_to_cond_assign(MESA_<wbr>SHADER_VERTEX, ir, int_0);<br>
    } else if (strcmp(optimization, "do_mat_op_to_vec") == 0) {<br>
       return do_mat_op_to_vec(ir);<br>
-   } else if (strcmp(optimization, "do_noop_swizzle") == 0) {<br>
-      return do_noop_swizzle(ir);<br>
+   } else if (strcmp(optimization, "optimize_swizzles") == 0) {<br>
+      return optimize_swizzles(ir);<br>
    } else if (strcmp(optimization, "do_structure_splitting") == 0) {<br>
       return do_structure_splitting(ir);<br>
-   } else if (strcmp(optimization, "do_swizzle_swizzle") == 0) {<br>
-      return do_swizzle_swizzle(ir);<br>
    } else if (strcmp(optimization, "do_tree_grafting") == 0) {<br>
       return do_tree_grafting(ir);<br>
    } else if (strcmp(optimization, "do_vec_index_to_cond_assign") == 0) {<br>
<font color="#888888">--<br>
2.9.5<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></blockquote></div><br></div></div></div>