[Mesa-dev] Mesa (master): glsl: Avoid extra if statements for logic and/ or with no side effects.

Jose Fonseca jfonseca at vmware.com
Wed Mar 14 11:38:09 PDT 2012


This commit caused the piglit tests

  glsl-algebraic-logicand-false-2
  glsl-algebraic-logicor-true

to start failing on llvmpipe.  Not sure if this is failing for all drivers or just llvmpipe/gallium.

Jose

----- Original Message -----
> Module: Mesa
> Branch: master
> Commit: ead3589aa2810b66164178a1d55d2063cfa3b041
> URL:
>    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ead3589aa2810b66164178a1d55d2063cfa3b041
> 
> Author: Eric Anholt <eric at anholt.net>
> Date:   Tue Feb  7 22:59:24 2012 -0800
> 
> glsl: Avoid extra if statements for logic and/or with no side
> effects.
> 
> This avoids extra if statements in the common case of just comparing
> two expressions that don't involve assignments or function calls,
> along with simplifying the handling of constant expressions.  Reduces
> i965 instructions generated in unigine tropics and sanctuary,
> yofrankie, warsow, gstreamer shaders, and the weston compositor.
> 
> shader-db results:
> Total instructions: 213052 -> 212752
> 38/1246 programs affected (3.0%)
> 14309 -> 14009 instructions in affected programs (2.1% reduction)
> 
> ---
> 
>  src/glsl/ast_to_hir.cpp |   23 ++++++-----------------
>  1 files changed, 6 insertions(+), 17 deletions(-)
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index c580359..75d7e9d 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -1199,15 +1199,9 @@ ast_expression::hir(exec_list *instructions,
>        op[1] = get_scalar_boolean_operand(&rhs_instructions, state,
>        this, 1,
>  					 "RHS", &error_emitted);
>  
> -      ir_constant *op0_const = op[0]->constant_expression_value();
> -      if (op0_const) {
> -	 if (op0_const->value.b[0]) {
> -	    instructions->append_list(&rhs_instructions);
> -	    result = op[1];
> -	 } else {
> -	    result = op0_const;
> -	 }
> -	 type = glsl_type::bool_type;
> +      if (rhs_instructions.is_empty()) {
> +	 result = new(ctx) ir_expression(ir_binop_logic_and, op[0], op[1]);
> +	 type = result->type;
>        } else {
>  	 ir_variable *const tmp = new(ctx)
>  	 ir_variable(glsl_type::bool_type,
>  						       "and_tmp",
> @@ -1241,14 +1235,9 @@ ast_expression::hir(exec_list *instructions,
>        op[1] = get_scalar_boolean_operand(&rhs_instructions, state,
>        this, 1,
>  					 "RHS", &error_emitted);
>  
> -      ir_constant *op0_const = op[0]->constant_expression_value();
> -      if (op0_const) {
> -	 if (op0_const->value.b[0]) {
> -	    result = op0_const;
> -	 } else {
> -	    result = op[1];
> -	 }
> -	 type = glsl_type::bool_type;
> +      if (rhs_instructions.is_empty()) {
> +	 result = new(ctx) ir_expression(ir_binop_logic_or, op[0], op[1]);
> +	 type = result->type;
>        } else {
>  	 ir_variable *const tmp = new(ctx)
>  	 ir_variable(glsl_type::bool_type,
>  						       "or_tmp",
> 
> _______________________________________________
> mesa-commit mailing list
> mesa-commit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
> 


More information about the mesa-dev mailing list