[Mesa-dev] [PATCH] glsl: Fix broken LRP algebraic optimization.

Ian Romanick idr at freedesktop.org
Sat Mar 1 09:33:32 PST 2014


On 03/01/2014 12:18 AM, Kenneth Graunke wrote:
> opt_algebraic was translating lrp(x, 0, a) into add(x, -mul(x, a)).
>
> Unfortunately, this references "x" twice, which is invalid in the IR,
> leading to assertion failures in the validator.

Right... and Matt probably didn't notice this because he tests release 
builds because they make piglit runs so much faster.  Hmm...  isn't -Og 
credible yet? :(

> Normally, cloning IR solves this.  However, "x" could actually be an
> arbitrary expression tree, so copying it could result in huge piles
> of wasted computation.  This is why we avoid reusing subexpressions.

The other way to solve this is to assign x to a temporary.  Isn't x-a*x 
slightly better because it can be implemented as MAD?

I don't have a strong opinion... if you don't feel like doing a temp,

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

> Instead, transform it into mul(x, add(1.0, -a)), which is equivalent
> but doesn't need two references to "x".
>
> Fixes a regression since d5fa8a95621169, which isn't in any stable
> branches.  Fixes 18 shaders in shader-db (bastion and yofrankie).
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>   src/glsl/opt_algebraic.cpp | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
>
> Here's the shader-db output comparing master to this:
>
> GAINED: shaders/bastion/48.shader_test fs16
> GAINED: shaders/bastion/48.shader_test fs8
> GAINED: shaders/bastion/48.shader_test vs
> GAINED: shaders/yofrankie/27.shader_test fs16
> GAINED: shaders/yofrankie/27.shader_test fs8
> GAINED: shaders/yofrankie/27.shader_test vs
> GAINED: shaders/yofrankie/30.shader_test fs16
> GAINED: shaders/yofrankie/30.shader_test fs8
> GAINED: shaders/yofrankie/30.shader_test vs
> GAINED: shaders/yofrankie/48.shader_test fs16
> GAINED: shaders/yofrankie/48.shader_test fs8
> GAINED: shaders/yofrankie/48.shader_test vs
> GAINED: shaders/yofrankie/87.shader_test fs16
> GAINED: shaders/yofrankie/87.shader_test fs8
> GAINED: shaders/yofrankie/87.shader_test vs
> GAINED: shaders/yofrankie/9.shader_test fs16
> GAINED: shaders/yofrankie/9.shader_test fs8
> GAINED: shaders/yofrankie/9.shader_test vs
>
> total instructions in shared programs: 1726391 -> 1726391 (0.00%)
> instructions in affected programs:     0 -> 0
> GAINED:                                18
> LOST:
>
> diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
> index 778638c..5c49a78 100644
> --- a/src/glsl/opt_algebraic.cpp
> +++ b/src/glsl/opt_algebraic.cpp
> @@ -571,7 +571,9 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
>         } else if (is_vec_zero(op_const[0])) {
>            return mul(ir->operands[1], ir->operands[2]);
>         } else if (is_vec_zero(op_const[1])) {
> -         return add(ir->operands[0], neg(mul(ir->operands[0], ir->operands[2])));
> +         unsigned op2_components = ir->operands[2]->type->vector_elements;
> +         ir_constant *one = new(mem_ctx) ir_constant(1.0f, op2_components);
> +         return mul(ir->operands[0], add(one, neg(ir->operands[2])));
>         }
>         break;
>
>



More information about the mesa-dev mailing list