From ec331cc48a74ada4b2ece944d969bae045f48a1f Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Fri, 20 Mar 2026 09:11:54 +0100 Subject: [PATCH] nir: replace lower_ldexp with has_ldexp I can be bothered to fix all the backends that don't set lower_ldexp, and only two backends have ldexp anyway. Part-of: --- src/amd/common/nir/ac_nir.c | 3 ++- src/asahi/compiler/agx_compile.h | 1 - src/broadcom/vulkan/v3dv_pipeline.c | 1 - src/compiler/nir/nir_opt_algebraic.py | 6 +++--- src/compiler/nir/nir_shader_compiler_options.h | 5 +++-- src/compiler/spirv/vtn_opencl.c | 2 +- src/freedreno/ir3/ir3_compiler.c | 1 - src/gallium/drivers/etnaviv/etnaviv_compiler.c | 1 - src/gallium/drivers/i915/i915_screen.c | 1 - src/gallium/drivers/llvmpipe/lp_screen.c | 1 - src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp | 1 - src/gallium/drivers/r600/r600_pipe_common.c | 1 - src/gallium/drivers/svga/svga_screen.c | 1 - src/gallium/drivers/v3d/v3d_screen.c | 1 - src/gallium/drivers/vc4/vc4_program.c | 1 - src/gallium/drivers/virgl/virgl_screen.c | 1 - src/gallium/drivers/zink/zink_compiler.c | 2 +- src/imagination/pco/pco_nir.c | 1 - src/intel/compiler/brw/brw_compiler.c | 1 - src/intel/compiler/elk/elk_nir_options.c | 1 - src/mesa/state_tracker/st_program.c | 1 - src/microsoft/compiler/nir_to_dxil.c | 1 - src/nouveau/compiler/nak/api.rs | 1 - src/panfrost/compiler/bifrost/bifrost_compile.h | 1 + src/panfrost/compiler/midgard/midgard_compile.h | 1 - 25 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/amd/common/nir/ac_nir.c b/src/amd/common/nir/ac_nir.c index 2bb1b474cba..ffdbbe4b472 100644 --- a/src/amd/common/nir/ac_nir.c +++ b/src/amd/common/nir/ac_nir.c @@ -65,7 +65,8 @@ void ac_nir_set_options(const struct ac_compiler_info *info, bool use_llvm, options->lower_iadd_sat = info->gfx_level <= GFX8; options->lower_hadd = true; options->lower_mul_32x16 = true; - options->lower_bfloat16_conversions = true, + options->lower_bfloat16_conversions = true; + options->has_ldexp = true; options->has_bfe = true; options->has_bfm = true; options->has_bitfield_select = true; diff --git a/src/asahi/compiler/agx_compile.h b/src/asahi/compiler/agx_compile.h index 7dcf3325a05..feb801496f6 100644 --- a/src/asahi/compiler/agx_compile.h +++ b/src/asahi/compiler/agx_compile.h @@ -369,7 +369,6 @@ static const nir_shader_compiler_options agx_nir_options = { .lower_fminmax_signed_zero = true, .lower_fdph = true, .lower_ffract = true, - .lower_ldexp = true, .lower_pack_half_2x16 = true, .lower_pack_unorm_2x16 = true, .lower_pack_snorm_2x16 = true, diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 2653c801884..9db6f72d966 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -196,7 +196,6 @@ v3dv_pipeline_get_nir_options(const struct v3d_device_info *devinfo) .lower_fsqrt = true, .lower_ifind_msb = true, .lower_isign = true, - .lower_ldexp = true, .lower_mul_high = true, .lower_wpos_pntc = false, .lower_to_scalar = true, diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py index 091725f9d66..922a92c062c 100644 --- a/src/compiler/nir/nir_opt_algebraic.py +++ b/src/compiler/nir/nir_opt_algebraic.py @@ -3164,9 +3164,9 @@ def ldexp(f, exp, bits): return ('!fmul', ('!fmul', f, pow2_1), pow2_2) optimizations += [ - (('ldexp@16', 'x', 'exp'), ldexp('x', 'exp', 16), 'options->lower_ldexp', TestStatus.UNSUPPORTED), # All test inputs skipped. - (('ldexp@32', 'x', 'exp'), ldexp('x', 'exp', 32), 'options->lower_ldexp', TestStatus.UNSUPPORTED), # All test inputs skipped. - (('ldexp@64', 'x', 'exp'), ldexp('x', 'exp', 64), 'options->lower_ldexp', TestStatus.UNSUPPORTED), # All test inputs skipped. + (('ldexp@16', 'x', 'exp'), ldexp('x', 'exp', 16), '!options->has_ldexp', TestStatus.UNSUPPORTED), # All test inputs skipped. + (('ldexp@32', 'x', 'exp'), ldexp('x', 'exp', 32), '!options->has_ldexp', TestStatus.UNSUPPORTED), # All test inputs skipped. + (('ldexp@64', 'x', 'exp'), ldexp('x', 'exp', 64), '!options->has_ldexp', TestStatus.UNSUPPORTED), # All test inputs skipped. ] # XCOM 2 (OpenGL) open-codes bitfieldReverse() diff --git a/src/compiler/nir/nir_shader_compiler_options.h b/src/compiler/nir/nir_shader_compiler_options.h index 7060b2eea5b..8b9e1d55ff4 100644 --- a/src/compiler/nir/nir_shader_compiler_options.h +++ b/src/compiler/nir/nir_shader_compiler_options.h @@ -343,8 +343,6 @@ typedef struct nir_shader_compiler_options { */ bool lower_fround_even; - bool lower_ldexp; - bool lower_pack_half_2x16; bool lower_pack_unorm_2x16; bool lower_pack_snorm_2x16; @@ -540,6 +538,9 @@ typedef struct nir_shader_compiler_options { /* Lowers when 32x32->64 bit multiplication is not supported */ bool lower_mul_2x32_64; + /* Indicates that ldexp is supported. */ + bool has_ldexp; + /* Indicates that urol and uror are supported */ bool has_rotate8; bool has_rotate16; diff --git a/src/compiler/spirv/vtn_opencl.c b/src/compiler/spirv/vtn_opencl.c index bb9ac3c3272..4f11b69994a 100644 --- a/src/compiler/spirv/vtn_opencl.c +++ b/src/compiler/spirv/vtn_opencl.c @@ -691,7 +691,7 @@ handle_special(struct vtn_builder *b, uint32_t opcode, case OpenCLstd_Native_tan: return nir_ftan(nb, srcs[0]); case OpenCLstd_Ldexp: - if (nb->shader->options->lower_ldexp) + if (!nb->shader->options->has_ldexp) break; return nir_ldexp(nb, srcs[0], srcs[1]); case OpenCLstd_Fma: { diff --git a/src/freedreno/ir3/ir3_compiler.c b/src/freedreno/ir3/ir3_compiler.c index 726a7413b5c..3f2e4d12c0e 100644 --- a/src/freedreno/ir3/ir3_compiler.c +++ b/src/freedreno/ir3/ir3_compiler.c @@ -125,7 +125,6 @@ static const nir_shader_compiler_options ir3_base_options = { .lower_fmod = true, .lower_fdiv = true, .lower_isign = true, - .lower_ldexp = true, .lower_uadd_carry = true, .lower_usub_borrow = true, .lower_mul_high = true, diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c index 74dae270101..a83d678b0b3 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c @@ -47,7 +47,6 @@ etna_compiler_create(const char *renderer, const struct etna_core_info *info) .fuse_ffma64 = true, .lower_uadd_carry = true, .lower_usub_borrow = true, - .lower_ldexp = true, .lower_mul_high = true, .lower_bitops = true, .lower_flrp32 = true, diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c index c2a0bd3a640..17db0d34034 100644 --- a/src/gallium/drivers/i915/i915_screen.c +++ b/src/gallium/drivers/i915/i915_screen.c @@ -144,7 +144,6 @@ static const struct nir_shader_compiler_options gallivm_nir_options = { .lower_uadd_sat = true, .lower_usub_sat = true, .lower_iadd_sat = true, - .lower_ldexp = true, .lower_pack_snorm_2x16 = true, .lower_pack_snorm_4x8 = true, .lower_pack_unorm_2x16 = true, diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 81b7336bc1b..1f58bc5665c 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -498,7 +498,6 @@ static const struct nir_shader_compiler_options gallivm_nir_options = { .lower_uadd_sat = true, .lower_usub_sat = true, .lower_iadd_sat = true, - .lower_ldexp = true, .lower_pack_snorm_2x16 = true, .lower_pack_snorm_4x8 = true, .lower_pack_unorm_2x16 = true, diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp index f51a5beec87..e79eadd488f 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp @@ -3590,7 +3590,6 @@ nvir_nir_shader_compiler_options(int chipset, uint8_t shader_type) op.lower_ffract = true; op.lower_fceil = false; // TODO op.lower_ftrunc = false; - op.lower_ldexp = true; op.lower_pack_half_2x16 = true; op.lower_pack_unorm_2x16 = true; op.lower_pack_snorm_2x16 = true; diff --git a/src/gallium/drivers/r600/r600_pipe_common.c b/src/gallium/drivers/r600/r600_pipe_common.c index 04c9b277de7..7fcae1ef897 100644 --- a/src/gallium/drivers/r600/r600_pipe_common.c +++ b/src/gallium/drivers/r600/r600_pipe_common.c @@ -1104,7 +1104,6 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen, .lower_extract_word = true, .lower_insert_byte = true, .lower_insert_word = true, - .lower_ldexp = true, /* due to a bug in the shader compiler, some loops hang * if they are not unrolled, see: * https://bugs.freedesktop.org/show_bug.cgi?id=86720 diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c index 9bdce5f42f9..fdd4518492c 100644 --- a/src/gallium/drivers/svga/svga_screen.c +++ b/src/gallium/drivers/svga/svga_screen.c @@ -139,7 +139,6 @@ get_bool_cap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex cap, .lower_int64_options = nir_lower_imul_2x32_64 | nir_lower_divmod64, \ .lower_fdph = true, \ .lower_flrp64 = true, \ - .lower_ldexp = true, \ .lower_uniforms_to_ubo = true, \ .lower_cs_local_index_to_id = true, \ .max_unroll_iterations = 32 diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 14768516894..ac7b2bf707c 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -590,7 +590,6 @@ v3d_screen_get_compiler_options(struct pipe_screen *pscreen, .lower_fsqrt = true, .lower_ifind_msb = true, .lower_isign = true, - .lower_ldexp = true, .lower_hadd = true, .lower_fisnormal = true, .lower_mul_high = true, diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index 19c5433bb73..74e7cbe5784 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -2148,7 +2148,6 @@ static const nir_shader_compiler_options nir_options = { .lower_fpow = true, .lower_fsat = true, .lower_fsqrt = true, - .lower_ldexp = true, .lower_fneg = true, .lower_ineg = true, .lower_to_scalar = true, diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 6d4b84c039d..e794e97ab17 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -1068,7 +1068,6 @@ virgl_create_screen(struct virgl_winsys *vws, const struct pipe_screen_config *c screen->compiler_options.no_integers = screen->caps.caps.v1.glsl_level < 130; screen->compiler_options.lower_ffma32 = true; screen->compiler_options.fuse_ffma32 = false; - screen->compiler_options.lower_ldexp = true; screen->compiler_options.lower_image_offset_to_range_base = true; screen->compiler_options.lower_atomic_offset_to_range_base = true; screen->compiler_options.support_indirect_outputs = BITFIELD_BIT(MESA_SHADER_TESS_CTRL); diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 164c9fff18a..f74ec0af153 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1287,7 +1287,7 @@ zink_screen_init_compiler(struct zink_screen *screen) * effectively unused (no instances in shader-db), it's not worth the * effort to do so. * */ - .lower_ldexp = true, + .has_ldexp = false, .lower_mul_high = true, .lower_to_scalar = true, diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index cc8ca6f8a18..ba48ee4647c 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -54,7 +54,6 @@ static const nir_shader_compiler_options nir_options = { .lower_fsqrt = true, .lower_ftrunc = true, .lower_ifind_msb = true, - .lower_ldexp = true, .lower_layer_fs_input_to_sysval = true, .lower_uadd_carry = true, .lower_uadd_sat = true, diff --git a/src/intel/compiler/brw/brw_compiler.c b/src/intel/compiler/brw/brw_compiler.c index 4ff5dda83e9..152460e383a 100644 --- a/src/intel/compiler/brw/brw_compiler.c +++ b/src/intel/compiler/brw/brw_compiler.c @@ -46,7 +46,6 @@ const struct nir_shader_compiler_options brw_scalar_nir_options = { .lower_insert_word = true, .lower_isign = true, .lower_layer_fs_input_to_sysval = true, - .lower_ldexp = true, .lower_pack_half_2x16 = true, .lower_pack_snorm_2x16 = true, .lower_pack_snorm_4x8 = true, diff --git a/src/intel/compiler/elk/elk_nir_options.c b/src/intel/compiler/elk/elk_nir_options.c index a256d853b27..42c09d7557d 100644 --- a/src/intel/compiler/elk/elk_nir_options.c +++ b/src/intel/compiler/elk/elk_nir_options.c @@ -22,7 +22,6 @@ .lower_fisnormal = true, \ .lower_fquantize2f16 = true, \ .lower_isign = true, \ - .lower_ldexp = true, \ .lower_bitfield_extract = true, \ .lower_bitfield_insert = true, \ .lower_device_index_to_zero = true, \ diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index f40b27bc1af..d4fcaf52b02 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -629,7 +629,6 @@ static const struct nir_shader_compiler_options draw_nir_options = { .lower_uadd_sat = true, .lower_usub_sat = true, .lower_iadd_sat = true, - .lower_ldexp = true, .lower_pack_snorm_2x16 = true, .lower_pack_snorm_4x8 = true, .lower_pack_unorm_2x16 = true, diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index 58cf0946d2d..ba63c38f341 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -100,7 +100,6 @@ nir_options = { .lower_fmod = true, .lower_fpow = true, .lower_scmp = true, - .lower_ldexp = true, .lower_flrp16 = true, .lower_flrp32 = true, .lower_flrp64 = true, diff --git a/src/nouveau/compiler/nak/api.rs b/src/nouveau/compiler/nak/api.rs index 40702b4ceb6..527579c5ce5 100644 --- a/src/nouveau/compiler/nak/api.rs +++ b/src/nouveau/compiler/nak/api.rs @@ -161,7 +161,6 @@ fn nir_options(dev: &nv_device_info) -> nir_shader_compiler_options { | nir_lower_conv64) | if dev.sm < 70 { nir_lower_vote_ieq64 } else { 0 } | if dev.sm < 32 { nir_lower_shift64 } else { 0 }, - lower_ldexp: true, lower_fmod: true, lower_ffract: true, lower_fpow: true, diff --git a/src/panfrost/compiler/bifrost/bifrost_compile.h b/src/panfrost/compiler/bifrost/bifrost_compile.h index ba92f5bc322..5569301bd4f 100644 --- a/src/panfrost/compiler/bifrost/bifrost_compile.h +++ b/src/panfrost/compiler/bifrost/bifrost_compile.h @@ -148,6 +148,7 @@ valhal_writes_extended_fifo(uint64_t outputs_written, .lower_uadd_carry = true, \ .lower_usub_borrow = true, \ \ + .has_ldexp = true, \ .has_isub = true, \ .vectorize_vec2_16bit = true, \ .fuse_ffma16 = true, \ diff --git a/src/panfrost/compiler/midgard/midgard_compile.h b/src/panfrost/compiler/midgard/midgard_compile.h index c3804198fa5..af439238367 100644 --- a/src/panfrost/compiler/midgard/midgard_compile.h +++ b/src/panfrost/compiler/midgard/midgard_compile.h @@ -62,7 +62,6 @@ static const nir_shader_compiler_options midgard_nir_options = { .lower_extract_word = true, .lower_insert_byte = true, .lower_insert_word = true, - .lower_ldexp = true, .lower_pack_half_2x16 = true, .lower_pack_unorm_2x16 = true,