From dad5ee103925f8ccb812fc9097741dad8ea9cc48 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Mon, 3 Feb 2025 09:50:59 +0100 Subject: [PATCH] intel/brw, lp: enable lower_pack_64_4x16 The compiler won't be able to emit pack_64_4x16, so we should prevent nir_opt_algebraic to optimize to it. This fixes an infinite optimization loop inside brw_nir_optimize: nir_copy_prop 16x4 %77 = @load_global (%80) 32 %61995 = pack_32_2x16_split %77.x, %77.y 32 %61998 = pack_32_2x16_split %77.z, %77.w 64 %61999 = pack_64_2x32_split %61995, %61998 64 %76 = iadd %100, %79 @store_global (%61999, %76) nir_opt_algebraic 16x4 %77 = @load_global (%80) 32 %61995 = pack_32_2x16_split %77.x, %77.y 32 %61998 = pack_32_2x16_split %77.z, %77.w 16x4 %62000 = vec4 %77.x, %77.y, %77.z, %77.w 64 %62001 = pack_64_4x16 %62000 64 %76 = iadd %100, %79 @store_global (%62001, %76) nir_lower_pack 16x4 %77 = @load_global (%80) 16x4 %62000 = vec4 %77.x, %77.y, %77.z, %77.w 16 %62002 = mov %62000.y 16 %62003 = mov %62000.x 32 %62004 = pack_32_2x16_split %62003, %62002 16 %62005 = mov %62000.w 16 %62006 = mov %62000.z 32 %62007 = pack_32_2x16_split %62006, %62005 64 %62008 = pack_64_2x32_split %62004, %62007 64 %76 = iadd %100, %79 @store_global (%62008, %76) // brw_nir_optimize loops here nir_copy_prop 16x4 %77 = @load_global (%80) 32 %62004 = pack_32_2x16_split %77.x, %77.y 32 %62007 = pack_32_2x16_split %77.z, %77.w 64 %62008 = pack_64_2x32_split %62004, %62007 64 %76 = iadd %100, %79 @store_global (%62008, %76) llvmpipe has a similar issue inside lp_build_opt_nir Fixes: b1bc691b0ff ("nir/algebraic: add and improve pack/unpack patterns") Acked-by: Adam Jackson Reviewed-by: Alyssa Rosenzweig Reviewed-by: Ian Romanick Part-of: --- src/gallium/drivers/llvmpipe/lp_screen.c | 1 + src/intel/compiler/brw_compiler.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index eb2e0337280..1b2ca7d2fe0 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -446,6 +446,7 @@ static const struct nir_shader_compiler_options gallivm_nir_options = { .lower_pack_unorm_2x16 = true, .lower_pack_unorm_4x8 = true, .lower_pack_half_2x16 = true, + .lower_pack_64_4x16 = true, .lower_pack_split = true, .lower_unpack_snorm_2x16 = true, .lower_unpack_snorm_4x8 = true, diff --git a/src/intel/compiler/brw_compiler.c b/src/intel/compiler/brw_compiler.c index fe44a6b09f1..2c73fe97905 100644 --- a/src/intel/compiler/brw_compiler.c +++ b/src/intel/compiler/brw_compiler.c @@ -62,6 +62,7 @@ const struct nir_shader_compiler_options brw_scalar_nir_options = { .lower_pack_snorm_4x8 = true, .lower_pack_unorm_2x16 = true, .lower_pack_unorm_4x8 = true, + .lower_pack_64_4x16 = true, .lower_scmp = true, .lower_to_scalar = true, .lower_uadd_carry = true,