[Mesa-dev] [PATCH 7/8] glsl: Optimize "if (cond) discard; " to a conditional discard.

Ian Romanick idr at freedesktop.org
Tue Feb 24 11:33:30 PST 2015


On 02/24/2015 02:19 AM, Kenneth Graunke wrote:
> st_glsl_to_tgsi and ir_to_mesa have handled conditional discards for a
> long time; the previous patch added that capability to i965.
> 
> i965 (Haswell) shader-db stats:
> 
> Without NIR:
> total instructions in shared programs: 5792133 -> 5776360 (-0.27%)
> instructions in affected programs:     737585 -> 721812 (-2.14%)
> helped:                                6300
> HURT:                                  68
> GAINED:                                2
> 
> With NIR:
> total instructions in shared programs: 5787538 -> 5769569 (-0.31%)
> instructions in affected programs:     767843 -> 749874 (-2.34%)
> helped:                                6522
> HURT:                                  35
> GAINED:                                6
> 
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/glsl/Makefile.sources            |  1 +
>  src/glsl/glsl_parser_extras.cpp      |  1 +
>  src/glsl/ir_optimization.h           |  1 +
>  src/glsl/opt_conditional_discard.cpp | 81 ++++++++++++++++++++++++++++++++++++
>  4 files changed, 84 insertions(+)
>  create mode 100644 src/glsl/opt_conditional_discard.cpp
> 
> diff --git a/src/glsl/Makefile.sources b/src/glsl/Makefile.sources
> index d0210d1..b876642 100644
> --- a/src/glsl/Makefile.sources
> +++ b/src/glsl/Makefile.sources
> @@ -157,6 +157,7 @@ LIBGLSL_FILES = \
>  	lower_ubo_reference.cpp \
>  	opt_algebraic.cpp \
>  	opt_array_splitting.cpp \
> +	opt_conditional_discard.cpp \
>  	opt_constant_folding.cpp \
>  	opt_constant_propagation.cpp \
>  	opt_constant_variable.cpp \
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index 9f79313..f19804b 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -1627,6 +1627,7 @@ do_common_optimization(exec_list *ir, bool linked,
>     }
>     progress = do_if_simplification(ir) || progress;
>     progress = opt_flatten_nested_if_blocks(ir) || progress;
> +   progress = opt_conditional_discard(ir) || progress;
>     progress = do_copy_propagation(ir) || progress;
>     progress = do_copy_propagation_elements(ir) || progress;
>  
> diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h
> index 7eb861a..e6939f3 100644
> --- a/src/glsl/ir_optimization.h
> +++ b/src/glsl/ir_optimization.h
> @@ -77,6 +77,7 @@ bool do_common_optimization(exec_list *ir, bool linked,
>  bool do_rebalance_tree(exec_list *instructions);
>  bool do_algebraic(exec_list *instructions, bool native_integers,
>                    const struct gl_shader_compiler_options *options);
> +bool opt_conditional_discard(exec_list *instructions);
>  bool do_constant_folding(exec_list *instructions);
>  bool do_constant_variable(exec_list *instructions);
>  bool do_constant_variable_unlinked(exec_list *instructions);
> diff --git a/src/glsl/opt_conditional_discard.cpp b/src/glsl/opt_conditional_discard.cpp
> new file mode 100644
> index 0000000..0905188
> --- /dev/null
> +++ b/src/glsl/opt_conditional_discard.cpp
> @@ -0,0 +1,81 @@
> +/*
> + * Copyright © 2010 Intel Corporation

You've been sitting on this patch for a long time, eh? :)

> + *
> + * 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_conditional_discard.cpp
> + *
> + * Replace
> + *
> + *    if (cond) discard;
> + *
> + * with
> + *
> + *    (discard <condition>)
> + */
> +
> +#include "glsl_types.h"
> +#include "ir.h"
> +
> +namespace {
> +
> +class opt_conditional_discard_visitor : public ir_hierarchical_visitor {
> +public:
> +   opt_conditional_discard_visitor()
> +   {
> +      progress = false;

Did we ever decide whether it was better to initialize members like this
or like

   opt_conditional_discard_visitor()
      : progress(false)
   {
   }

I honestly don't remember.  I know we talked about it.

Either way, with the copyright date fixed, this patch is

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

> +   }
> +
> +   ir_visitor_status visit_leave(ir_if *);
> +
> +   bool progress;
> +};
> +
> +} /* anonymous namespace */
> +
> +bool
> +opt_conditional_discard(exec_list *instructions)
> +{
> +   opt_conditional_discard_visitor v;
> +   v.run(instructions);
> +   return v.progress;
> +}
> +
> +ir_visitor_status
> +opt_conditional_discard_visitor::visit_leave(ir_if *ir)
> +{
> +   /* Look for "if (...) discard" with no else clause or extra statements. */
> +   if (ir->then_instructions.is_empty() ||
> +       !ir->then_instructions.head->next->is_tail_sentinel() ||
> +       !((ir_instruction *) ir->then_instructions.head)->as_discard() ||
> +       !ir->else_instructions.is_empty())
> +      return visit_continue;
> +
> +   /* Move the condition and replace the ir_if with the ir_discard. */
> +   ir_discard *discard = (ir_discard *) ir->then_instructions.head;
> +   discard->condition = ir->condition;
> +   ir->replace_with(discard);
> +
> +   progress = true;
> +
> +   return visit_continue;
> +}
> 



More information about the mesa-dev mailing list