From 47cc660d9c19572e5ef2dce7c8ae1766a2ac9885 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 28 Aug 2019 10:56:52 +0200 Subject: [PATCH] glsl: replace 'x + (-x)' with constant 0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111241 Reviewed-by: Marek Olšák --- src/compiler/glsl/opt_algebraic.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/compiler/glsl/opt_algebraic.cpp b/src/compiler/glsl/opt_algebraic.cpp index ff4be269578..3147d25aea8 100644 --- a/src/compiler/glsl/opt_algebraic.cpp +++ b/src/compiler/glsl/opt_algebraic.cpp @@ -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. */ -- 2.30.2