Re: [Mesa-dev] [PATCH 05/12] glsl: Combine nop-swizzle optimization with swizzle-swizzle optimization
Changes all look really good, and some performance numbers I have for a similar patch I've written shows a marginal benefit in compiler runtime performance (perf-stat -> cycles executed) For patches 4 and 5. Reviewed-by:2. nov. 2017 21.26 skrev "Ian Romanick" : From: Ian Romanick Signed-off-by: Ian Romanick --- src/compiler/Makefile.sources | 3 +- src/compiler/glsl/glsl_parser_extras.cpp | 3 +- src/compiler/glsl/ir_optimization.h| 3 +- src/compiler/glsl/meson.build | 3 +- .../glsl/{opt_noop_swizzle.cpp => opt_swizzle.cpp} | 56 ++--- src/compiler/glsl/opt_swizzle_swizzle.cpp | 96 -- src/compiler/glsl/test_optpass.cpp | 6 +- 7 files changed, 52 insertions(+), 118 deletions(-) rename src/compiler/glsl/{opt_noop_swizzle.cpp => opt_swizzle.cpp} (56%) delete mode 100644 src/compiler/glsl/opt_swizzle_swizzle.cpp diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index b80468c..60814e2 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -130,11 +130,10 @@ LIBGLSL_FILES = \ glsl/opt_function_inlining.cpp \ glsl/opt_if_simplification.cpp \ glsl/opt_minmax.cpp \ - glsl/opt_noop_swizzle.cpp \ glsl/opt_rebalance_tree.cpp \ glsl/opt_redundant_jumps.cpp \ glsl/opt_structure_splitting.cpp \ - glsl/opt_swizzle_swizzle.cpp \ + glsl/opt_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 822301a..5982173 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -2226,8 +2226,7 @@ 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_swizzles, ir); OPT(optimize_split_arrays, ir, linked); OPT(optimize_redundant_jumps, ir); diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_ optimization.h index f44ddcb..2b8c195 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -123,9 +123,8 @@ bool lower_if_to_cond_assign(gl_shader_stage stage, exec_list *instructions, unsigned max_depth = 0, unsigned min_branch_cost = 0); 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 optimize_swizzles(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/meson.build b/src/compiler/glsl/meson.build index 76fcafb..6284d0c 100644 --- a/src/compiler/glsl/meson.build +++ b/src/compiler/glsl/meson.build @@ -169,11 +169,10 @@ files_libglsl = files( 'opt_function_inlining.cpp', 'opt_if_simplification.cpp', 'opt_minmax.cpp', - 'opt_noop_swizzle.cpp', 'opt_rebalance_tree.cpp', 'opt_redundant_jumps.cpp', 'opt_structure_splitting.cpp', - 'opt_swizzle_swizzle.cpp', + 'opt_swizzle.cpp', 'opt_tree_grafting.cpp', 'opt_vectorize.cpp', 'program.h', diff --git a/src/compiler/glsl/opt_noop_swizzle.cpp b/src/compiler/glsl/opt_ swizzle.cpp similarity index 56% rename from src/compiler/glsl/opt_noop_swizzle.cpp rename to src/compiler/glsl/opt_swizzle.cpp index 41890ab..2fbe362 100644 --- a/src/compiler/glsl/opt_noop_swizzle.cpp +++ b/src/compiler/glsl/opt_swizzle.cpp @@ -22,11 +22,14 @@ */ /** - * \file opt_noop_swizzle.cpp + * \file opt_swizzle.cpp + * Optimize swizzle operations. * - * If a swizzle doesn't change the order or count of components, then - * remove the swizzle so that other optimization passes see the value - * behind it. + * First, compact a sequence of swizzled swizzles into a single swizzle. + * + * If the final resulting swizzle doesn't change the order or count of + * components, then remove the swizzle so that other optimization passes see + * the value behind it. */ #include "ir.h" @@ -36,9 +39,9 @@ namespace { -class ir_noop_swizzle_visitor : public ir_rvalue_visitor { +class ir_opt_swizzle_visitor : public ir_rvalue_visitor { public: - ir_noop_swizzle_visitor() + ir_opt_swizzle_visitor() { this->progress = false; } @@ -50,13 +53,46 @@ public: } /* unnamed namespace */ void -ir_noop_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue)
[Mesa-dev] [PATCH 05/12] glsl: Combine nop-swizzle optimization with swizzle-swizzle optimization
From: Ian RomanickSigned-off-by: Ian Romanick --- src/compiler/Makefile.sources | 3 +- src/compiler/glsl/glsl_parser_extras.cpp | 3 +- src/compiler/glsl/ir_optimization.h| 3 +- src/compiler/glsl/meson.build | 3 +- .../glsl/{opt_noop_swizzle.cpp => opt_swizzle.cpp} | 56 ++--- src/compiler/glsl/opt_swizzle_swizzle.cpp | 96 -- src/compiler/glsl/test_optpass.cpp | 6 +- 7 files changed, 52 insertions(+), 118 deletions(-) rename src/compiler/glsl/{opt_noop_swizzle.cpp => opt_swizzle.cpp} (56%) delete mode 100644 src/compiler/glsl/opt_swizzle_swizzle.cpp diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index b80468c..60814e2 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -130,11 +130,10 @@ LIBGLSL_FILES = \ glsl/opt_function_inlining.cpp \ glsl/opt_if_simplification.cpp \ glsl/opt_minmax.cpp \ - glsl/opt_noop_swizzle.cpp \ glsl/opt_rebalance_tree.cpp \ glsl/opt_redundant_jumps.cpp \ glsl/opt_structure_splitting.cpp \ - glsl/opt_swizzle_swizzle.cpp \ + glsl/opt_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 822301a..5982173 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -2226,8 +2226,7 @@ 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_swizzles, ir); OPT(optimize_split_arrays, ir, linked); OPT(optimize_redundant_jumps, ir); diff --git a/src/compiler/glsl/ir_optimization.h b/src/compiler/glsl/ir_optimization.h index f44ddcb..2b8c195 100644 --- a/src/compiler/glsl/ir_optimization.h +++ b/src/compiler/glsl/ir_optimization.h @@ -123,9 +123,8 @@ bool lower_if_to_cond_assign(gl_shader_stage stage, exec_list *instructions, unsigned max_depth = 0, unsigned min_branch_cost = 0); 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 optimize_swizzles(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/meson.build b/src/compiler/glsl/meson.build index 76fcafb..6284d0c 100644 --- a/src/compiler/glsl/meson.build +++ b/src/compiler/glsl/meson.build @@ -169,11 +169,10 @@ files_libglsl = files( 'opt_function_inlining.cpp', 'opt_if_simplification.cpp', 'opt_minmax.cpp', - 'opt_noop_swizzle.cpp', 'opt_rebalance_tree.cpp', 'opt_redundant_jumps.cpp', 'opt_structure_splitting.cpp', - 'opt_swizzle_swizzle.cpp', + 'opt_swizzle.cpp', 'opt_tree_grafting.cpp', 'opt_vectorize.cpp', 'program.h', diff --git a/src/compiler/glsl/opt_noop_swizzle.cpp b/src/compiler/glsl/opt_swizzle.cpp similarity index 56% rename from src/compiler/glsl/opt_noop_swizzle.cpp rename to src/compiler/glsl/opt_swizzle.cpp index 41890ab..2fbe362 100644 --- a/src/compiler/glsl/opt_noop_swizzle.cpp +++ b/src/compiler/glsl/opt_swizzle.cpp @@ -22,11 +22,14 @@ */ /** - * \file opt_noop_swizzle.cpp + * \file opt_swizzle.cpp + * Optimize swizzle operations. * - * If a swizzle doesn't change the order or count of components, then - * remove the swizzle so that other optimization passes see the value - * behind it. + * First, compact a sequence of swizzled swizzles into a single swizzle. + * + * If the final resulting swizzle doesn't change the order or count of + * components, then remove the swizzle so that other optimization passes see + * the value behind it. */ #include "ir.h" @@ -36,9 +39,9 @@ namespace { -class ir_noop_swizzle_visitor : public ir_rvalue_visitor { +class ir_opt_swizzle_visitor : public ir_rvalue_visitor { public: - ir_noop_swizzle_visitor() + ir_opt_swizzle_visitor() { this->progress = false; } @@ -50,13 +53,46 @@ public: } /* unnamed namespace */ void -ir_noop_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue) +ir_opt_swizzle_visitor::handle_rvalue(ir_rvalue **rvalue) { if (!*rvalue) return; ir_swizzle *swiz = (*rvalue)->as_swizzle(); - if (!swiz || swiz->type != swiz->val->type) + + if (!swiz) + return; + + ir_swizzle *swiz2; + + while ((swiz2 = swiz->val->as_swizzle()) != NULL) { + int mask2[4]; + +