From 0879c15666b5f3a9d53a8431c078ab8520bb6932 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Fri, 11 Feb 2022 13:06:47 -0800 Subject: [PATCH] r600/sb: Avoid causing an exception when getting the reciprocal of 0u. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit I'm not sure what the hardware would return in this circumstance, so just don't fold it. Avoids regressions on transition to NIR. Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/r600/sb/sb_expr.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/r600/sb/sb_expr.cpp b/src/gallium/drivers/r600/sb/sb_expr.cpp index 6d062b7..091037c 100644 --- a/src/gallium/drivers/r600/sb/sb_expr.cpp +++ b/src/gallium/drivers/r600/sb/sb_expr.cpp @@ -459,8 +459,13 @@ bool expr_handler::fold_alu_op1(alu_node& n) { case ALU_OP1_RECIP_FF: case ALU_OP1_RECIP_IEEE: dv = 1.0f / cv.f; break; // case ALU_OP1_RECIP_INT: - case ALU_OP1_RECIP_UINT: dv.u = (1ull << 32) / cv.u; break; -// case ALU_OP1_RNDNE: dv = floor(cv.f + 0.5f); break; + case ALU_OP1_RECIP_UINT: { + if (!cv.u) + return false; + dv.u = (1ull << 32) / cv.u; + break; + } + // case ALU_OP1_RNDNE: dv = floor(cv.f + 0.5f); break; case ALU_OP1_SIN: dv = sin(cv.f * 2.0f * M_PI); break; case ALU_OP1_SQRT_IEEE: dv = sqrtf(cv.f); break; case ALU_OP1_TRUNC: dv = truncf(cv.f); break; -- 2.7.4