From 0c49738211fe86e6a7b342bd85152389412f8e47 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 15 Apr 2026 17:21:38 -0400 Subject: [PATCH] nir/opt_reassociate: fix exactness bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For an inexact-associative operation (fadd or fmul), can_reassociate ensures the root of the chain is inexact to allow reassociating. However, build_chain just checks for opcodes to match up after, although we do sum up exactness across the chain. Although an Effort Was Made, it still seems incorrect to reassociate %3 = fadd! %0, %1 %4 = fadd %3, %2 to instead be (ex.) %3 = fadd! %0, %2 %4 = fadd! %3, %1 Closes: #14418 Fixes: e0b0f7e73c8 ("nir: add ALU reassocation pass") Signed-off-by: Alyssa Rosenzweig Reviewed-by: Marek Olšák Part-of: --- src/compiler/nir/nir_opt_reassociate.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/nir/nir_opt_reassociate.c b/src/compiler/nir/nir_opt_reassociate.c index 38e660ed4d3..b3ce295b294 100644 --- a/src/compiler/nir/nir_opt_reassociate.c +++ b/src/compiler/nir/nir_opt_reassociate.c @@ -227,6 +227,7 @@ build_chain(struct chain *c, nir_scalar def, unsigned reserved_count) unsigned reserved_plus_remaining = reserved_count + remaining; if (nir_scalar_is_alu(src) && nir_scalar_alu_op(src) == alu->op && + can_reassociate(nir_def_as_alu(src.def)) && list_is_singular(&src.def->uses) && c->length + reserved_plus_remaining + 2 <= MAX_CHAIN_LENGTH) {