Commit efa4aee9 authored by Pierre-Eric Pelloux-Prayer's avatar Pierre-Eric Pelloux-Prayer Committed by Dylan Baker

glsl: replace 'x + (-x)' with constant 0

This fixes a hang in shadertoy for radeonsi where a buffer was initialized with:

   value -= value

with value being undefined.
In this case LLVM replace the operation with an assignment to NaN.

Cc: 19.1 19.2 <mesa-stable@lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111241Reviewed-by: default avatarMarek Olšák <marek.olsak@amd.com>
(cherry picked from commit 47cc660d)
parent ec74c76a
Pipeline #61225 passed with stages
in 31 minutes and 53 seconds
......@@ -507,6 +507,18 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
if (is_vec_zero(op_const[1]))
return ir->operands[0];
/* Replace (x + (-x)) with constant 0 */
for (int i = 0; i < 2; i++) {
if (op_expr[i]) {
if (op_expr[i]->operation == ir_unop_neg) {
ir_rvalue *other = ir->operands[(i + 1) % 2];
if (other && op_expr[i]->operands[0]->equals(other)) {
return ir_constant::zero(ir, ir->type);
}
}
}
}
/* Reassociate addition of constants so that we can do constant
* folding.
*/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment