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.
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. 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 <kenn...@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; -- 1.9.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev