[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