From 093209dac0a9953d8462be94e1f36e55884feee0 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 09:05:32 -0500 Subject: [PATCH 01/22] nir/lower_double_ops: Rework the if (progress) tree Reviewed-by: Dave Airlie --- src/compiler/nir/nir_lower_double_ops.c | 30 ++++++++++++------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c index 4ddd91f9054e..f66252e40153 100644 --- a/src/compiler/nir/nir_lower_double_ops.c +++ b/src/compiler/nir/nir_lower_double_ops.c @@ -697,22 +697,20 @@ nir_lower_doubles_impl(nir_function_impl *impl, } } - if (progress) { - if (options & nir_lower_fp64_full_software) { - /* SSA and register indices are completely messed up now */ - nir_index_ssa_defs(impl); - nir_index_local_regs(impl); - - nir_metadata_preserve(impl, nir_metadata_none); - - /* And we have deref casts we need to clean up thanks to function - * inlining. - */ - nir_opt_deref_impl(impl); - } else { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + if (progress && (options & nir_lower_fp64_full_software)) { + /* SSA and register indices are completely messed up now */ + nir_index_ssa_defs(impl); + nir_index_local_regs(impl); + + nir_metadata_preserve(impl, nir_metadata_none); + + /* And we have deref casts we need to clean up thanks to function + * inlining. + */ + nir_opt_deref_impl(impl); + } else if (progress) { + nir_metadata_preserve(impl, nir_metadata_block_index | + nir_metadata_dominance); } else { #ifndef NDEBUG impl->valid_metadata &= ~nir_metadata_not_properly_reset; -- GitLab From 77ed57818b9ff29bb7212b8a61a584452f33f07e Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 23:29:15 -0500 Subject: [PATCH 02/22] nir/opt_deref: Report progress if we remove a deref Reviewed-by: Dave Airlie --- src/compiler/nir/nir_deref.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c index cdb9105a751f..20829734ccf0 100644 --- a/src/compiler/nir/nir_deref.c +++ b/src/compiler/nir/nir_deref.c @@ -845,7 +845,9 @@ opt_deref_cast(nir_builder *b, nir_deref_instr *cast) /* If uses would be a bit crazy */ assert(list_empty(&cast->dest.ssa.if_uses)); - nir_deref_instr_remove_if_unused(cast); + if (nir_deref_instr_remove_if_unused(cast)) + progress = true; + return progress; } -- GitLab From 8b4fb3685347ab1ce915838de4d15d0a64c62005 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 28 May 2019 14:40:35 -0500 Subject: [PATCH 03/22] nir/copy_prop_vars: Record progress in more places Fixes: 96c32d7776 "nir/copy_prop_vars: handle load/store of vector..." Reviewed-by: Dave Airlie --- src/compiler/nir/nir_opt_copy_prop_vars.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c index 0fd96b7bee86..7e4cb3ea29ad 100644 --- a/src/compiler/nir/nir_opt_copy_prop_vars.c +++ b/src/compiler/nir/nir_opt_copy_prop_vars.c @@ -829,6 +829,7 @@ copy_prop_vars_block(struct copy_prop_var_state *state, b->cursor = nir_instr_remove(instr); nir_ssa_def *u = nir_ssa_undef(b, 1, intrin->dest.ssa.bit_size); nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_src_for_ssa(u)); + state->progress = true; break; } } @@ -909,6 +910,7 @@ copy_prop_vars_block(struct copy_prop_var_state *state, /* Storing to an invalid index is a no-op. */ if (vec_index >= vec_comps) { nir_instr_remove(instr); + state->progress = true; break; } } @@ -920,6 +922,7 @@ copy_prop_vars_block(struct copy_prop_var_state *state, * store is redundant so remove it. */ nir_instr_remove(instr); + state->progress = true; } else { struct value value = {0}; value_set_ssa_components(&value, intrin->src[1].ssa, -- GitLab From 142b4c6ea662aa039068ad593a10df1931fcdb3c Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 7 Jun 2019 09:42:54 -0500 Subject: [PATCH 04/22] nir/lower_two_sided_color: Only allow the pass in the fragment stage This pass doesn't make sense to run on anything except fragments shaders so we should just assert that the stage is MESA_SHADER_FRAGMENT. The one caller of this on non-fragment shaders is ir3 and the fix is trivial. --- src/compiler/nir/nir_lower_two_sided_color.c | 5 ++--- src/freedreno/ir3/ir3_nir.c | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/compiler/nir/nir_lower_two_sided_color.c b/src/compiler/nir/nir_lower_two_sided_color.c index d1eb32a18876..c7fb3c77b490 100644 --- a/src/compiler/nir/nir_lower_two_sided_color.c +++ b/src/compiler/nir/nir_lower_two_sided_color.c @@ -192,13 +192,12 @@ nir_lower_two_sided_color_impl(nir_function_impl *impl, void nir_lower_two_sided_color(nir_shader *shader) { + assert(shader->info.stage == MESA_SHADER_FRAGMENT); + lower_2side_state state = { .shader = shader, }; - if (shader->info.stage != MESA_SHADER_FRAGMENT) - return; - if (setup_inputs(&state) != 0) return; diff --git a/src/freedreno/ir3/ir3_nir.c b/src/freedreno/ir3/ir3_nir.c index 23dabee1fb02..068959781a27 100644 --- a/src/freedreno/ir3/ir3_nir.c +++ b/src/freedreno/ir3/ir3_nir.c @@ -227,9 +227,8 @@ ir3_optimize_nir(struct ir3_shader *shader, nir_shader *s, OPT_V(s, nir_lower_clip_fs, key->ucp_enables); if (key->fclamp_color) OPT_V(s, nir_lower_clamp_color_outputs); - } - if (key->color_two_side) { - OPT_V(s, nir_lower_two_sided_color); + if (key->color_two_side) + OPT_V(s, nir_lower_two_sided_color); } } else { /* only want to do this the first time (when key is null) -- GitLab From 6d3d0593ed151c95264dd37b2ee94fe2924944c1 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 13:30:38 -0500 Subject: [PATCH 05/22] nir: Add nir_metadata_preserve calls to a few passes Cc: mesa-stable@lists.freedesktop.org --- src/compiler/glsl/gl_nir_lower_bindless_images.c | 10 +++++++++- src/compiler/glsl/gl_nir_lower_samplers.c | 5 +++++ src/compiler/glsl/gl_nir_lower_samplers_as_deref.c | 5 +++++ src/compiler/nir/nir_opt_conditional_discard.c | 11 ++++++++++- src/compiler/nir/nir_split_per_member_structs.c | 4 ++++ 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/compiler/glsl/gl_nir_lower_bindless_images.c b/src/compiler/glsl/gl_nir_lower_bindless_images.c index 4c76977195b9..1f5667fa863b 100644 --- a/src/compiler/glsl/gl_nir_lower_bindless_images.c +++ b/src/compiler/glsl/gl_nir_lower_bindless_images.c @@ -87,9 +87,17 @@ gl_nir_lower_bindless_images(nir_shader *shader) nir_builder b; nir_builder_init(&b, function->impl); + bool impl_progress = false; nir_foreach_block(block, function->impl) nir_foreach_instr(instr, block) - progress |= lower_impl(&b, instr); + impl_progress |= lower_impl(&b, instr); + + if (impl_progress) { + nir_metadata_preserve(function->impl, + nir_metadata_block_index | + nir_metadata_dominance); + progress = true; + } } } diff --git a/src/compiler/glsl/gl_nir_lower_samplers.c b/src/compiler/glsl/gl_nir_lower_samplers.c index 85535c074dcc..4e7e79f83917 100644 --- a/src/compiler/glsl/gl_nir_lower_samplers.c +++ b/src/compiler/glsl/gl_nir_lower_samplers.c @@ -141,6 +141,11 @@ lower_impl(nir_function_impl *impl) } } + if (progress) { + nir_metadata_preserve(impl, nir_metadata_block_index | + nir_metadata_dominance); + } + return progress; } diff --git a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c index 5907abfd9a98..61a05d1117da 100644 --- a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c +++ b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c @@ -311,6 +311,11 @@ lower_impl(nir_function_impl *impl, struct lower_samplers_as_deref_state *state) } } + if (progress) { + nir_metadata_preserve(impl, nir_metadata_block_index | + nir_metadata_dominance); + } + return progress; } diff --git a/src/compiler/nir/nir_opt_conditional_discard.c b/src/compiler/nir/nir_opt_conditional_discard.c index 3605eaf272f9..06f4eb80694d 100644 --- a/src/compiler/nir/nir_opt_conditional_discard.c +++ b/src/compiler/nir/nir_opt_conditional_discard.c @@ -115,8 +115,17 @@ nir_opt_conditional_discard(nir_shader *shader) nir_foreach_function(function, shader) { if (function->impl) { nir_builder_init(&builder, function->impl); + + bool impl_progress = false; nir_foreach_block_safe(block, function->impl) { - progress |= nir_opt_conditional_discard_block(&builder, block); + impl_progress |= nir_opt_conditional_discard_block(&builder, block); + } + + if (impl_progress) { + nir_metadata_preserve(function->impl, + nir_metadata_block_index | + nir_metadata_dominance); + progress = true; } } } diff --git a/src/compiler/nir/nir_split_per_member_structs.c b/src/compiler/nir/nir_split_per_member_structs.c index 592225ba6446..c6afef235bcd 100644 --- a/src/compiler/nir/nir_split_per_member_structs.c +++ b/src/compiler/nir/nir_split_per_member_structs.c @@ -202,6 +202,10 @@ nir_split_per_member_structs(nir_shader *shader) } } } + + nir_metadata_preserve(function->impl, + nir_metadata_block_index | + nir_metadata_dominance); } ralloc_free(dead_ctx); -- GitLab From fedda8a8f7fc473e8b81c96176dc0e97f549844e Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 22 May 2019 16:56:23 -0500 Subject: [PATCH 06/22] nir/metadata_preserve: Take an impl_altered parameter Instead of only calling nir_meatadata_preserve if a pass has made progress, we now call it regardless of progress and pass the progress Boolean into it. This lets us manage metadata a bit better internally. --- .../vulkan/radv_nir_lower_ycbcr_textures.c | 9 ++++---- .../compiler/v3d_nir_lower_image_load_store.c | 2 +- src/broadcom/compiler/v3d_nir_lower_io.c | 2 +- src/broadcom/compiler/v3d_nir_lower_scratch.c | 2 +- src/broadcom/compiler/v3d_nir_lower_txf_ms.c | 2 +- src/compiler/glsl/gl_nir_lower_atomics.c | 9 ++++---- .../glsl/gl_nir_lower_bindless_images.c | 10 ++++----- src/compiler/glsl/gl_nir_lower_buffers.c | 7 +++---- src/compiler/glsl/gl_nir_lower_samplers.c | 7 +++---- .../glsl/gl_nir_lower_samplers_as_deref.c | 7 +++---- src/compiler/nir/nir.h | 3 ++- src/compiler/nir/nir_algebraic.py | 11 +++------- src/compiler/nir/nir_control_flow.c | 6 +++--- src/compiler/nir/nir_deref.c | 17 ++++++--------- src/compiler/nir/nir_from_ssa.c | 10 +++++---- src/compiler/nir/nir_inline_functions.c | 8 ++----- src/compiler/nir/nir_lower_alpha_test.c | 3 ++- src/compiler/nir/nir_lower_alu.c | 8 +++---- src/compiler/nir/nir_lower_alu_to_scalar.c | 5 +++-- .../nir/nir_lower_array_deref_of_vec.c | 7 +++---- src/compiler/nir/nir_lower_atomics_to_ssbo.c | 5 +++-- src/compiler/nir/nir_lower_bit_size.c | 7 +++---- src/compiler/nir/nir_lower_bitmap.c | 5 +++-- src/compiler/nir/nir_lower_bool_to_float.c | 7 +++---- src/compiler/nir/nir_lower_bool_to_int32.c | 7 +++---- .../nir/nir_lower_clamp_color_outputs.c | 5 +++-- src/compiler/nir/nir_lower_clip.c | 4 ++-- .../nir/nir_lower_clip_cull_distance_arrays.c | 21 ++++++++++--------- .../nir/nir_lower_constant_initializers.c | 15 +++++-------- src/compiler/nir/nir_lower_double_ops.c | 15 ++++++------- src/compiler/nir/nir_lower_drawpixels.c | 5 +++-- src/compiler/nir/nir_lower_fb_read.c | 5 +++-- src/compiler/nir/nir_lower_flrp.c | 5 +++-- src/compiler/nir/nir_lower_fragcoord_wtrans.c | 3 ++- src/compiler/nir/nir_lower_frexp.c | 7 +++---- .../nir/nir_lower_global_vars_to_local.c | 10 ++++----- src/compiler/nir/nir_lower_gs_intrinsics.c | 2 +- src/compiler/nir/nir_lower_idiv.c | 5 +++-- src/compiler/nir/nir_lower_indirect_derefs.c | 3 +-- src/compiler/nir/nir_lower_int64.c | 8 +------ src/compiler/nir/nir_lower_int_to_float.c | 7 +++---- src/compiler/nir/nir_lower_io.c | 12 +++++------ .../nir/nir_lower_io_to_temporaries.c | 5 +++-- src/compiler/nir/nir_lower_io_to_vector.c | 7 +++---- .../nir/nir_lower_load_const_to_scalar.c | 11 +++------- src/compiler/nir/nir_lower_locals_to_regs.c | 5 +++-- .../nir/nir_lower_non_uniform_access.c | 3 +-- src/compiler/nir/nir_lower_packing.c | 6 ++++-- .../nir/nir_lower_passthrough_edgeflags.c | 5 +++-- src/compiler/nir/nir_lower_patch_vertices.c | 7 +++---- src/compiler/nir/nir_lower_phis_to_scalar.c | 5 +++-- src/compiler/nir/nir_lower_regs_to_ssa.c | 11 +++++++--- src/compiler/nir/nir_lower_returns.c | 9 ++------ src/compiler/nir/nir_lower_scratch.c | 9 ++++---- src/compiler/nir/nir_lower_sincos.c | 7 +++---- src/compiler/nir/nir_lower_subgroups.c | 9 ++++---- src/compiler/nir/nir_lower_system_values.c | 6 ++++-- src/compiler/nir/nir_lower_tex.c | 5 +++-- src/compiler/nir/nir_lower_to_source_mods.c | 6 +++--- src/compiler/nir/nir_lower_two_sided_color.c | 5 +++-- src/compiler/nir/nir_lower_uniforms_to_ubo.c | 5 +++-- src/compiler/nir/nir_lower_var_copies.c | 11 +++------- src/compiler/nir/nir_lower_vars_to_ssa.c | 5 +++-- src/compiler/nir/nir_lower_vec_to_movs.c | 7 +++---- .../nir/nir_lower_viewport_transform.c | 3 ++- src/compiler/nir/nir_lower_wpos_center.c | 5 +++-- src/compiler/nir/nir_lower_wpos_ytransform.c | 5 +++-- src/compiler/nir/nir_metadata.c | 10 +++++++-- src/compiler/nir/nir_move_load_const.c | 5 +++-- .../nir/nir_move_vec_src_uses_to_dest.c | 5 +++-- .../nir/nir_normalize_cubemap_coords.c | 5 +++-- src/compiler/nir/nir_opt_combine_stores.c | 7 +++---- src/compiler/nir/nir_opt_comparison_pre.c | 6 +++--- .../nir/nir_opt_conditional_discard.c | 10 ++++----- src/compiler/nir/nir_opt_constant_folding.c | 11 +++------- src/compiler/nir/nir_opt_copy_prop_vars.c | 11 +++------- src/compiler/nir/nir_opt_copy_propagate.c | 11 +++------- src/compiler/nir/nir_opt_cse.c | 11 +++------- src/compiler/nir/nir_opt_dce.c | 11 +++------- src/compiler/nir/nir_opt_dead_cf.c | 8 +------ src/compiler/nir/nir_opt_dead_write_vars.c | 7 +++---- src/compiler/nir/nir_opt_find_array_copies.c | 7 +++---- src/compiler/nir/nir_opt_gcm.c | 5 +++-- src/compiler/nir/nir_opt_idiv_const.c | 7 +++---- src/compiler/nir/nir_opt_if.c | 14 ++++++------- src/compiler/nir/nir_opt_intrinsics.c | 9 ++++---- src/compiler/nir/nir_opt_large_constants.c | 8 +++++-- src/compiler/nir/nir_opt_loop_unroll.c | 1 + src/compiler/nir/nir_opt_move_comparisons.c | 11 +++++----- src/compiler/nir/nir_opt_move_load_ubo.c | 15 +++++++------ src/compiler/nir/nir_opt_peephole_select.c | 8 +------ .../nir/nir_opt_rematerialize_compares.c | 7 +++---- src/compiler/nir/nir_opt_remove_phis.c | 11 +++------- src/compiler/nir/nir_opt_shrink_load.c | 5 +++-- src/compiler/nir/nir_opt_trivial_continues.c | 4 +++- src/compiler/nir/nir_opt_undef.c | 12 +++-------- src/compiler/nir/nir_propagate_invariant.c | 9 ++++---- src/compiler/nir/nir_remove_dead_variables.c | 12 +++++------ src/compiler/nir/nir_repair_ssa.c | 6 +++--- .../nir/nir_split_per_member_structs.c | 2 +- src/compiler/nir/nir_split_var_copies.c | 11 +++------- src/compiler/nir/nir_split_vars.c | 21 +++++++++++-------- src/compiler/nir/nir_sweep.c | 2 +- .../ir3/ir3_nir_analyze_ubo_ranges.c | 5 +++-- src/freedreno/ir3/ir3_nir_lower_io_offsets.c | 7 +++---- ...ir3_nir_lower_load_barycentric_at_offset.c | 7 +++---- ...ir3_nir_lower_load_barycentric_at_sample.c | 7 +++---- src/freedreno/ir3/ir3_nir_lower_tg4_to_tex.c | 6 +++--- .../ir3/ir3_nir_move_varying_inputs.c | 7 +++---- .../freedreno/a2xx/ir2_nir_lower_scalar.c | 5 +++-- .../panfrost/midgard/midgard_compile.c | 4 +++- .../panfrost/midgard/nir_lower_blend.c | 3 ++- src/gallium/drivers/vc4/vc4_nir_lower_blend.c | 2 +- src/gallium/drivers/vc4/vc4_nir_lower_io.c | 3 ++- .../drivers/vc4/vc4_nir_lower_txf_ms.c | 2 +- src/intel/compiler/brw_fs.cpp | 12 +++++++---- .../compiler/brw_nir_attribute_workarounds.c | 9 ++++---- .../compiler/brw_nir_lower_conversions.c | 7 +++---- .../compiler/brw_nir_lower_cs_intrinsics.c | 2 +- .../compiler/brw_nir_lower_image_load_store.c | 14 +++++++------ .../brw_nir_lower_mem_access_bit_sizes.c | 7 +++---- .../compiler/brw_nir_opt_peephole_ffma.c | 6 +++--- src/intel/compiler/brw_nir_tcs_workarounds.c | 2 +- .../vulkan/anv_nir_add_base_work_group_id.c | 9 +++++--- .../vulkan/anv_nir_apply_pipeline_layout.c | 5 +++-- src/intel/vulkan/anv_nir_lower_multiview.c | 7 +++---- .../vulkan/anv_nir_lower_ycbcr_textures.c | 8 +++---- src/mesa/state_tracker/st_nir_lower_builtin.c | 5 +++-- .../st_nir_lower_tex_src_plane.c | 5 +++-- 129 files changed, 431 insertions(+), 490 deletions(-) diff --git a/src/amd/vulkan/radv_nir_lower_ycbcr_textures.c b/src/amd/vulkan/radv_nir_lower_ycbcr_textures.c index 5d771c2fc2ec..935c5fdcebbd 100644 --- a/src/amd/vulkan/radv_nir_lower_ycbcr_textures.c +++ b/src/amd/vulkan/radv_nir_lower_ycbcr_textures.c @@ -439,11 +439,10 @@ radv_nir_lower_ycbcr_textures(nir_shader *shader, } } - if (function_progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, + function_progress, + nir_metadata_block_index | + nir_metadata_dominance); progress |= function_progress; } diff --git a/src/broadcom/compiler/v3d_nir_lower_image_load_store.c b/src/broadcom/compiler/v3d_nir_lower_image_load_store.c index 2aa3cbad4956..a5a75c9a7d5c 100644 --- a/src/broadcom/compiler/v3d_nir_lower_image_load_store.c +++ b/src/broadcom/compiler/v3d_nir_lower_image_load_store.c @@ -383,7 +383,7 @@ v3d_nir_lower_image_load_store(nir_shader *s) } } - nir_metadata_preserve(function->impl, + nir_metadata_preserve(function->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/broadcom/compiler/v3d_nir_lower_io.c b/src/broadcom/compiler/v3d_nir_lower_io.c index 2a68efb7b6b9..9f0303fe9f02 100644 --- a/src/broadcom/compiler/v3d_nir_lower_io.c +++ b/src/broadcom/compiler/v3d_nir_lower_io.c @@ -339,7 +339,7 @@ v3d_nir_lower_io(nir_shader *s, struct v3d_compile *c) if (s->info.stage == MESA_SHADER_VERTEX) v3d_nir_emit_ff_vpm_outputs(c, &b, &state); - nir_metadata_preserve(function->impl, + nir_metadata_preserve(function->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/broadcom/compiler/v3d_nir_lower_scratch.c b/src/broadcom/compiler/v3d_nir_lower_scratch.c index d23b8be838f7..661d1d1e2ce4 100644 --- a/src/broadcom/compiler/v3d_nir_lower_scratch.c +++ b/src/broadcom/compiler/v3d_nir_lower_scratch.c @@ -146,7 +146,7 @@ v3d_nir_lower_scratch(nir_shader *s) } } - nir_metadata_preserve(function->impl, + nir_metadata_preserve(function->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/broadcom/compiler/v3d_nir_lower_txf_ms.c b/src/broadcom/compiler/v3d_nir_lower_txf_ms.c index 68591529d36e..902617c4a2d2 100644 --- a/src/broadcom/compiler/v3d_nir_lower_txf_ms.c +++ b/src/broadcom/compiler/v3d_nir_lower_txf_ms.c @@ -88,7 +88,7 @@ v3d_nir_lower_txf_ms(nir_shader *s, struct v3d_compile *c) } } - nir_metadata_preserve(function->impl, + nir_metadata_preserve(function->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/compiler/glsl/gl_nir_lower_atomics.c b/src/compiler/glsl/gl_nir_lower_atomics.c index 60642e7130a6..33a425adfac4 100644 --- a/src/compiler/glsl/gl_nir_lower_atomics.c +++ b/src/compiler/glsl/gl_nir_lower_atomics.c @@ -167,11 +167,10 @@ gl_nir_lower_atomics(nir_shader *shader, } } - if (impl_progress) { - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - progress = true; - } + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); + progress = progress || impl_progress; } return progress; diff --git a/src/compiler/glsl/gl_nir_lower_bindless_images.c b/src/compiler/glsl/gl_nir_lower_bindless_images.c index 1f5667fa863b..47e6f26355a4 100644 --- a/src/compiler/glsl/gl_nir_lower_bindless_images.c +++ b/src/compiler/glsl/gl_nir_lower_bindless_images.c @@ -92,12 +92,10 @@ gl_nir_lower_bindless_images(nir_shader *shader) nir_foreach_instr(instr, block) impl_progress |= lower_impl(&b, instr); - if (impl_progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - progress = true; - } + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); + progress = progress || impl_progress; } } diff --git a/src/compiler/glsl/gl_nir_lower_buffers.c b/src/compiler/glsl/gl_nir_lower_buffers.c index b9195329f4ab..8786bd07d480 100644 --- a/src/compiler/glsl/gl_nir_lower_buffers.c +++ b/src/compiler/glsl/gl_nir_lower_buffers.c @@ -263,10 +263,9 @@ lower_buffer_interface_derefs_impl(nir_function_impl *impl, } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/glsl/gl_nir_lower_samplers.c b/src/compiler/glsl/gl_nir_lower_samplers.c index 4e7e79f83917..52c2b6e27dfd 100644 --- a/src/compiler/glsl/gl_nir_lower_samplers.c +++ b/src/compiler/glsl/gl_nir_lower_samplers.c @@ -141,10 +141,9 @@ lower_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c index 61a05d1117da..f161196c0380 100644 --- a/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c +++ b/src/compiler/glsl/gl_nir_lower_samplers_as_deref.c @@ -311,10 +311,9 @@ lower_impl(nir_function_impl *impl, struct lower_samplers_as_deref_state *state) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index e179481b8ea0..066b990e9115 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2512,7 +2512,8 @@ nir_function_impl *nir_cf_node_get_function(nir_cf_node *node); /** requests that the given pieces of metadata be generated */ void nir_metadata_require(nir_function_impl *impl, nir_metadata required, ...); /** dirties all but the preserved metadata */ -void nir_metadata_preserve(nir_function_impl *impl, nir_metadata preserved); +void nir_metadata_preserve(nir_function_impl *impl, bool impl_altered, + nir_metadata preserved); /** creates an instruction with default swizzle/writemask/etc. with NULL registers */ nir_alu_instr *nir_alu_instr_create(nir_shader *shader, nir_op op); diff --git a/src/compiler/nir/nir_algebraic.py b/src/compiler/nir/nir_algebraic.py index aa4e9778a434..534080d76be9 100644 --- a/src/compiler/nir/nir_algebraic.py +++ b/src/compiler/nir/nir_algebraic.py @@ -1125,14 +1125,9 @@ ${pass_name}_impl(nir_function_impl *impl, const bool *condition_flags) free(states); - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_control_flow.c b/src/compiler/nir/nir_control_flow.c index 252aaf335ad3..c5b30ad7e02e 100644 --- a/src/compiler/nir/nir_control_flow.c +++ b/src/compiler/nir/nir_control_flow.c @@ -469,7 +469,7 @@ nir_handle_add_jump(nir_block *block) unlink_block_successors(block); nir_function_impl *impl = nir_cf_node_get_function(&block->cf_node); - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, true, nir_metadata_none); if (jump_instr->type == nir_jump_break || jump_instr->type == nir_jump_continue) { @@ -512,7 +512,7 @@ nir_handle_remove_jump(nir_block *block, nir_jump_type type) unlink_jump(block, type, true); nir_function_impl *impl = nir_cf_node_get_function(&block->cf_node); - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, true, nir_metadata_none); } static void @@ -680,7 +680,7 @@ nir_cf_extract(nir_cf_list *extracted, nir_cursor begin, nir_cursor end) exec_list_make_empty(&extracted->list); /* Dominance and other block-related information is toast. */ - nir_metadata_preserve(extracted->impl, nir_metadata_none); + nir_metadata_preserve(extracted->impl, true, nir_metadata_none); nir_cf_node *cf_node = &block_begin->cf_node; nir_cf_node *cf_node_end = &block_end->cf_node; diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c index 20829734ccf0..b99d84ec7857 100644 --- a/src/compiler/nir/nir_deref.c +++ b/src/compiler/nir/nir_deref.c @@ -316,9 +316,9 @@ nir_remove_dead_derefs_impl(nir_function_impl *impl) } } - if (progress) - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } @@ -930,14 +930,9 @@ nir_opt_deref_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_from_ssa.c b/src/compiler/nir/nir_from_ssa.c index 2ac67b2b9977..745276d3db77 100644 --- a/src/compiler/nir/nir_from_ssa.c +++ b/src/compiler/nir/nir_from_ssa.c @@ -780,8 +780,9 @@ nir_convert_from_ssa_impl(nir_function_impl *impl, bool phi_webs_only) } /* Mark metadata as dirty before we ask for liveness analysis */ - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); nir_metadata_require(impl, nir_metadata_live_ssa_defs | nir_metadata_dominance); @@ -802,8 +803,9 @@ nir_convert_from_ssa_impl(nir_function_impl *impl, bool phi_webs_only) resolve_parallel_copies_block(block, &state); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); /* Clean up dead instructions and the hash tables */ _mesa_hash_table_destroy(state.merge_node_table, NULL); diff --git a/src/compiler/nir/nir_inline_functions.c b/src/compiler/nir/nir_inline_functions.c index 8226d50b44b1..91a54c944263 100644 --- a/src/compiler/nir/nir_inline_functions.c +++ b/src/compiler/nir/nir_inline_functions.c @@ -140,14 +140,10 @@ inline_function_impl(nir_function_impl *impl, struct set *inlined) /* SSA and register indices are completely messed up now */ nir_index_ssa_defs(impl); nir_index_local_regs(impl); - - nir_metadata_preserve(impl, nir_metadata_none); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif } + nir_metadata_preserve(impl, progress, nir_metadata_none); + _mesa_set_add(inlined, impl); return progress; diff --git a/src/compiler/nir/nir_lower_alpha_test.c b/src/compiler/nir/nir_lower_alpha_test.c index ddd815765bdd..87d8286159e7 100644 --- a/src/compiler/nir/nir_lower_alpha_test.c +++ b/src/compiler/nir/nir_lower_alpha_test.c @@ -108,7 +108,8 @@ nir_lower_alpha_test(nir_shader *shader, enum compare_func func, } } - nir_metadata_preserve(impl, nir_metadata_block_index | + nir_metadata_preserve(impl, true, + nir_metadata_block_index | nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_alu.c b/src/compiler/nir/nir_lower_alu.c index 8d1a1d374672..4fc9fe6e60bc 100644 --- a/src/compiler/nir/nir_lower_alu.c +++ b/src/compiler/nir/nir_lower_alu.c @@ -234,11 +234,9 @@ nir_lower_alu(nir_shader *shader) } } - if (progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_alu_to_scalar.c b/src/compiler/nir/nir_lower_alu_to_scalar.c index 71389c2f0c38..bd2d08bd0da4 100644 --- a/src/compiler/nir/nir_lower_alu_to_scalar.c +++ b/src/compiler/nir/nir_lower_alu_to_scalar.c @@ -273,8 +273,9 @@ nir_lower_alu_to_scalar_impl(nir_function_impl *impl, BITSET_WORD *lower_set) } } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_array_deref_of_vec.c b/src/compiler/nir/nir_lower_array_deref_of_vec.c index 2a70dd1ddbc8..33dc991a762f 100644 --- a/src/compiler/nir/nir_lower_array_deref_of_vec.c +++ b/src/compiler/nir/nir_lower_array_deref_of_vec.c @@ -158,10 +158,9 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl, } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_atomics_to_ssbo.c b/src/compiler/nir/nir_lower_atomics_to_ssbo.c index 66040c5f7f88..24558a9eca44 100644 --- a/src/compiler/nir/nir_lower_atomics_to_ssbo.c +++ b/src/compiler/nir/nir_lower_atomics_to_ssbo.c @@ -200,8 +200,9 @@ nir_lower_atomics_to_ssbo(nir_shader *shader, unsigned ssbo_offset) } } - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_bit_size.c b/src/compiler/nir/nir_lower_bit_size.c index 531e6aa5289f..ddd3c3010d54 100644 --- a/src/compiler/nir/nir_lower_bit_size.c +++ b/src/compiler/nir/nir_lower_bit_size.c @@ -102,10 +102,9 @@ lower_impl(nir_function_impl *impl, } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_bitmap.c b/src/compiler/nir/nir_lower_bitmap.c index 880053d31fee..a6843c72046b 100644 --- a/src/compiler/nir/nir_lower_bitmap.c +++ b/src/compiler/nir/nir_lower_bitmap.c @@ -138,8 +138,9 @@ lower_bitmap_impl(nir_function_impl *impl, lower_bitmap(impl->function->shader, &b, options); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } void diff --git a/src/compiler/nir/nir_lower_bool_to_float.c b/src/compiler/nir/nir_lower_bool_to_float.c index c07121f6d882..5ca9f8e628b9 100644 --- a/src/compiler/nir/nir_lower_bool_to_float.c +++ b/src/compiler/nir/nir_lower_bool_to_float.c @@ -162,10 +162,9 @@ nir_lower_bool_to_float_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_bool_to_int32.c b/src/compiler/nir/nir_lower_bool_to_int32.c index e331de488a36..c3bb7de65197 100644 --- a/src/compiler/nir/nir_lower_bool_to_int32.c +++ b/src/compiler/nir/nir_lower_bool_to_int32.c @@ -140,10 +140,9 @@ nir_lower_bool_to_int32_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_clamp_color_outputs.c b/src/compiler/nir/nir_lower_clamp_color_outputs.c index 32f855624276..21e8c57901e9 100644 --- a/src/compiler/nir/nir_lower_clamp_color_outputs.c +++ b/src/compiler/nir/nir_lower_clamp_color_outputs.c @@ -116,8 +116,9 @@ lower_impl(lower_state *state, nir_function_impl *impl) nir_foreach_block(block, impl) { progress |= lower_block(state, block); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_clip.c b/src/compiler/nir/nir_lower_clip.c index 474854d047b0..2ff27ae07a3d 100644 --- a/src/compiler/nir/nir_lower_clip.c +++ b/src/compiler/nir/nir_lower_clip.c @@ -256,7 +256,7 @@ nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables, bool use_vars) store_clipdist_output(&b, out[1], &clipdist[4]); } - nir_metadata_preserve(impl, nir_metadata_dominance); + nir_metadata_preserve(impl, true, nir_metadata_dominance); return true; } @@ -296,7 +296,7 @@ lower_clip_fs(nir_function_impl *impl, unsigned ucp_enables, } } - nir_metadata_preserve(impl, nir_metadata_dominance); + nir_metadata_preserve(impl, true, nir_metadata_dominance); } /* insert conditional kill based on interpolated CLIPDIST diff --git a/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c b/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c index 70578d6f3fd3..d7ce035c10e8 100644 --- a/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c +++ b/src/compiler/nir/nir_lower_clip_cull_distance_arrays.c @@ -107,16 +107,6 @@ combine_clip_cull(nir_shader *nir, cull->data.location_frac = clip_array_size % 4; } - nir_foreach_function(function, nir) { - if (function->impl) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance | - nir_metadata_live_ssa_defs | - nir_metadata_loop_analysis); - } - } - return true; } @@ -131,5 +121,16 @@ nir_lower_clip_cull_distance_arrays(nir_shader *nir) if (nir->info.stage > MESA_SHADER_VERTEX) progress |= combine_clip_cull(nir, &nir->inputs, false); + + nir_foreach_function(function, nir) { + if (function->impl) { + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs | + nir_metadata_loop_analysis); + } + } + return progress; } diff --git a/src/compiler/nir/nir_lower_constant_initializers.c b/src/compiler/nir/nir_lower_constant_initializers.c index abcd762d1692..aadaca56934d 100644 --- a/src/compiler/nir/nir_lower_constant_initializers.c +++ b/src/compiler/nir/nir_lower_constant_initializers.c @@ -112,16 +112,11 @@ nir_lower_constant_initializers(nir_shader *shader, nir_variable_mode modes) if (modes & nir_var_function_temp) impl_progress |= lower_const_initializer(&builder, &function->impl->locals); - if (impl_progress) { - progress = true; - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance | - nir_metadata_live_ssa_defs); - } else { -#ifndef NDEBUG - function->impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); + progress = progress || impl_progress; } return progress; diff --git a/src/compiler/nir/nir_lower_double_ops.c b/src/compiler/nir/nir_lower_double_ops.c index f66252e40153..977fa442ed6b 100644 --- a/src/compiler/nir/nir_lower_double_ops.c +++ b/src/compiler/nir/nir_lower_double_ops.c @@ -702,20 +702,17 @@ nir_lower_doubles_impl(nir_function_impl *impl, nir_index_ssa_defs(impl); nir_index_local_regs(impl); - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, true, nir_metadata_none); /* And we have deref casts we need to clean up thanks to function * inlining. */ nir_opt_deref_impl(impl); - } else if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + } else { + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); + } return progress; } diff --git a/src/compiler/nir/nir_lower_drawpixels.c b/src/compiler/nir/nir_lower_drawpixels.c index c4c0c508757e..cb8b53806f69 100644 --- a/src/compiler/nir/nir_lower_drawpixels.c +++ b/src/compiler/nir/nir_lower_drawpixels.c @@ -267,8 +267,9 @@ lower_drawpixels_impl(lower_drawpixels_state *state, nir_function_impl *impl) nir_foreach_block(block, impl) { lower_drawpixels_block(state, block); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } void diff --git a/src/compiler/nir/nir_lower_fb_read.c b/src/compiler/nir/nir_lower_fb_read.c index 07bff1ad2f63..d26dad19a23d 100644 --- a/src/compiler/nir/nir_lower_fb_read.c +++ b/src/compiler/nir/nir_lower_fb_read.c @@ -112,8 +112,9 @@ nir_lower_fb_read(nir_shader *shader) } } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } diff --git a/src/compiler/nir/nir_lower_flrp.c b/src/compiler/nir/nir_lower_flrp.c index bc5d71db1b00..f859087718cc 100644 --- a/src/compiler/nir/nir_lower_flrp.c +++ b/src/compiler/nir/nir_lower_flrp.c @@ -606,8 +606,9 @@ lower_flrp_impl(nir_function_impl *impl, } } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } /** diff --git a/src/compiler/nir/nir_lower_fragcoord_wtrans.c b/src/compiler/nir/nir_lower_fragcoord_wtrans.c index b8c0b0b24e5b..8265aee4a06b 100644 --- a/src/compiler/nir/nir_lower_fragcoord_wtrans.c +++ b/src/compiler/nir/nir_lower_fragcoord_wtrans.c @@ -75,7 +75,8 @@ nir_lower_fragcoord_wtrans(nir_shader *shader) lower_fragcoord_wtrans(&b, intr); } } - nir_metadata_preserve(func->impl, nir_metadata_block_index | + nir_metadata_preserve(func->impl, true, + nir_metadata_block_index | nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_frexp.c b/src/compiler/nir/nir_lower_frexp.c index 3b956615c340..fb99711a4088 100644 --- a/src/compiler/nir/nir_lower_frexp.c +++ b/src/compiler/nir/nir_lower_frexp.c @@ -186,10 +186,9 @@ lower_frexp_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_global_vars_to_local.c b/src/compiler/nir/nir_lower_global_vars_to_local.c index 4df87aba366f..e8209bfa1ea8 100644 --- a/src/compiler/nir/nir_lower_global_vars_to_local.c +++ b/src/compiler/nir/nir_lower_global_vars_to_local.c @@ -93,9 +93,6 @@ nir_lower_global_vars_to_local(nir_shader *shader) exec_node_remove(&var->node); var->data.mode = nir_var_function_temp; exec_list_push_tail(&impl->locals, &var->node); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance | - nir_metadata_live_ssa_defs); progress = true; } } @@ -105,13 +102,14 @@ nir_lower_global_vars_to_local(nir_shader *shader) if (progress) nir_fixup_deref_modes(shader); -#ifndef NDEBUG nir_foreach_function(function, shader) { if (function->impl) { - function->impl->valid_metadata &= ~nir_metadata_not_properly_reset; + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); } } -#endif return progress; } diff --git a/src/compiler/nir/nir_lower_gs_intrinsics.c b/src/compiler/nir/nir_lower_gs_intrinsics.c index 78c12e054750..fefcb35eac48 100644 --- a/src/compiler/nir/nir_lower_gs_intrinsics.c +++ b/src/compiler/nir/nir_lower_gs_intrinsics.c @@ -205,7 +205,7 @@ nir_lower_gs_intrinsics(nir_shader *shader) /* This only works because we have a single main() function. */ append_set_vertex_count(impl->end_block, &state); - nir_metadata_preserve(impl, 0); + nir_metadata_preserve(impl, true, nir_metadata_none); return state.progress; } diff --git a/src/compiler/nir/nir_lower_idiv.c b/src/compiler/nir/nir_lower_idiv.c index 4e7e2408ae8c..388eb451ddbe 100644 --- a/src/compiler/nir/nir_lower_idiv.c +++ b/src/compiler/nir/nir_lower_idiv.c @@ -132,8 +132,9 @@ convert_impl(nir_function_impl *impl) } } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_indirect_derefs.c b/src/compiler/nir/nir_lower_indirect_derefs.c index 58365628885f..8701cd999465 100644 --- a/src/compiler/nir/nir_lower_indirect_derefs.c +++ b/src/compiler/nir/nir_lower_indirect_derefs.c @@ -188,8 +188,7 @@ lower_indirects_impl(nir_function_impl *impl, nir_variable_mode modes) progress |= lower_indirect_derefs_block(block, &builder, modes); } - if (progress) - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, progress, nir_metadata_none); return progress; } diff --git a/src/compiler/nir/nir_lower_int64.c b/src/compiler/nir/nir_lower_int64.c index b3b78c6649a1..dd662c724385 100644 --- a/src/compiler/nir/nir_lower_int64.c +++ b/src/compiler/nir/nir_lower_int64.c @@ -846,13 +846,7 @@ lower_int64_impl(nir_function_impl *impl, nir_lower_int64_options options) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_none); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, nir_metadata_none); return progress; } diff --git a/src/compiler/nir/nir_lower_int_to_float.c b/src/compiler/nir/nir_lower_int_to_float.c index f082b6633022..0b6bd51204e0 100644 --- a/src/compiler/nir/nir_lower_int_to_float.c +++ b/src/compiler/nir/nir_lower_int_to_float.c @@ -158,10 +158,9 @@ nir_lower_int_to_float_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); free(float_types); free(int_types); diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index c54303b271ef..6e50d3821472 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -572,8 +572,9 @@ nir_lower_io_impl(nir_function_impl *impl, ralloc_free(state.dead_ctx); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } @@ -1167,10 +1168,9 @@ nir_lower_explicit_io_impl(nir_function_impl *impl, nir_variable_mode modes, } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_io_to_temporaries.c b/src/compiler/nir/nir_lower_io_to_temporaries.c index d2b069d3d68a..5bd76d2447d9 100644 --- a/src/compiler/nir/nir_lower_io_to_temporaries.c +++ b/src/compiler/nir/nir_lower_io_to_temporaries.c @@ -189,8 +189,9 @@ nir_lower_io_to_temporaries(nir_shader *shader, nir_function_impl *entrypoint, if (outputs) emit_output_copies_impl(&state, function->impl); - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } exec_list_append(&shader->globals, &state.old_inputs); diff --git a/src/compiler/nir/nir_lower_io_to_vector.c b/src/compiler/nir/nir_lower_io_to_vector.c index abc89fb2f497..895718f53428 100644 --- a/src/compiler/nir/nir_lower_io_to_vector.c +++ b/src/compiler/nir/nir_lower_io_to_vector.c @@ -365,10 +365,9 @@ nir_lower_io_to_vector_impl(nir_function_impl *impl, nir_variable_mode modes) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_load_const_to_scalar.c b/src/compiler/nir/nir_lower_load_const_to_scalar.c index a65dcb06d0ca..d0d72de10814 100644 --- a/src/compiler/nir/nir_lower_load_const_to_scalar.c +++ b/src/compiler/nir/nir_lower_load_const_to_scalar.c @@ -77,14 +77,9 @@ nir_lower_load_const_to_scalar_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_locals_to_regs.c b/src/compiler/nir/nir_lower_locals_to_regs.c index 37e17d5b9804..e38918e0971e 100644 --- a/src/compiler/nir/nir_lower_locals_to_regs.c +++ b/src/compiler/nir/nir_lower_locals_to_regs.c @@ -267,8 +267,9 @@ nir_lower_locals_to_regs_impl(nir_function_impl *impl) lower_locals_to_regs_block(block, &state); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, state.progress, + nir_metadata_block_index | + nir_metadata_dominance); _mesa_hash_table_destroy(state.regs_table, NULL); diff --git a/src/compiler/nir/nir_lower_non_uniform_access.c b/src/compiler/nir/nir_lower_non_uniform_access.c index 0ab32100ef2c..16e45d134ee0 100644 --- a/src/compiler/nir/nir_lower_non_uniform_access.c +++ b/src/compiler/nir/nir_lower_non_uniform_access.c @@ -221,8 +221,7 @@ nir_lower_non_uniform_access_impl(nir_function_impl *impl, } } - if (progress) - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, progress, nir_metadata_none); return progress; } diff --git a/src/compiler/nir/nir_lower_packing.c b/src/compiler/nir/nir_lower_packing.c index ba9f4bc040a8..5ae084e1ca74 100644 --- a/src/compiler/nir/nir_lower_packing.c +++ b/src/compiler/nir/nir_lower_packing.c @@ -138,12 +138,14 @@ lower_pack_impl(nir_function_impl *impl) nir_ssa_def_rewrite_uses(&alu_instr->dest.dest.ssa, nir_src_for_ssa(dest)); nir_instr_remove(&alu_instr->instr); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); progress = true; } } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); + return progress; } diff --git a/src/compiler/nir/nir_lower_passthrough_edgeflags.c b/src/compiler/nir/nir_lower_passthrough_edgeflags.c index f34078c89999..9a133bcfcaf4 100644 --- a/src/compiler/nir/nir_lower_passthrough_edgeflags.c +++ b/src/compiler/nir/nir_lower_passthrough_edgeflags.c @@ -46,8 +46,9 @@ lower_impl(nir_function_impl *impl) def = nir_load_var(&b, in); nir_store_var(&b, out, def, 0xf); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } void nir_lower_passthrough_edgeflags(nir_shader *shader) diff --git a/src/compiler/nir/nir_lower_patch_vertices.c b/src/compiler/nir/nir_lower_patch_vertices.c index 8e89268ca41b..136df90f03ad 100644 --- a/src/compiler/nir/nir_lower_patch_vertices.c +++ b/src/compiler/nir/nir_lower_patch_vertices.c @@ -98,10 +98,9 @@ nir_lower_patch_vertices(nir_shader *nir, } } - if (progress) { - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_phis_to_scalar.c b/src/compiler/nir/nir_lower_phis_to_scalar.c index bea9dc407534..febd63be3599 100644 --- a/src/compiler/nir/nir_lower_phis_to_scalar.c +++ b/src/compiler/nir/nir_lower_phis_to_scalar.c @@ -295,8 +295,9 @@ lower_phis_to_scalar_impl(nir_function_impl *impl) progress = lower_phis_to_scalar_block(block, &state) || progress; } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); ralloc_free(state.dead_ctx); return progress; diff --git a/src/compiler/nir/nir_lower_regs_to_ssa.c b/src/compiler/nir/nir_lower_regs_to_ssa.c index 0db11ff1d1cd..88c0d8c7fa45 100644 --- a/src/compiler/nir/nir_lower_regs_to_ssa.c +++ b/src/compiler/nir/nir_lower_regs_to_ssa.c @@ -213,8 +213,12 @@ rewrite_alu_instr(nir_alu_instr *alu, struct regs_to_ssa_state *state) bool nir_lower_regs_to_ssa_impl(nir_function_impl *impl) { - if (exec_list_is_empty(&impl->registers)) + if (exec_list_is_empty(&impl->registers)) { + nir_metadata_preserve(impl, false, + nir_metadata_block_index | + nir_metadata_dominance); return false; + } nir_metadata_require(impl, nir_metadata_block_index | nir_metadata_dominance); @@ -277,8 +281,9 @@ nir_lower_regs_to_ssa_impl(nir_function_impl *impl) free(state.values); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); return true; } diff --git a/src/compiler/nir/nir_lower_returns.c b/src/compiler/nir/nir_lower_returns.c index e166a7cc32a5..dee4330db4e2 100644 --- a/src/compiler/nir/nir_lower_returns.c +++ b/src/compiler/nir/nir_lower_returns.c @@ -271,14 +271,9 @@ nir_lower_returns_impl(nir_function_impl *impl) bool progress = lower_returns_in_cf_list(&impl->body, &state); progress = progress || state.removed_unreachable_code; - if (progress) { - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, progress, nir_metadata_none); + if (progress) nir_repair_ssa_impl(impl); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } return progress; } diff --git a/src/compiler/nir/nir_lower_scratch.c b/src/compiler/nir/nir_lower_scratch.c index df0d3f43124a..9cc1854bdf27 100644 --- a/src/compiler/nir/nir_lower_scratch.c +++ b/src/compiler/nir/nir_lower_scratch.c @@ -184,11 +184,10 @@ nir_lower_vars_to_scratch(nir_shader *shader, } } - if (impl_progress) { - progress = true; - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); + progress = progress || impl_progress; } return progress; diff --git a/src/compiler/nir/nir_lower_sincos.c b/src/compiler/nir/nir_lower_sincos.c index 37aa97b1e96c..8fea4e4df29d 100644 --- a/src/compiler/nir/nir_lower_sincos.c +++ b/src/compiler/nir/nir_lower_sincos.c @@ -116,10 +116,9 @@ lower_sincos_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_subgroups.c b/src/compiler/nir/nir_lower_subgroups.c index 70d736b040f0..f1867ee83722 100644 --- a/src/compiler/nir/nir_lower_subgroups.c +++ b/src/compiler/nir/nir_lower_subgroups.c @@ -505,6 +505,10 @@ lower_subgroups_impl(nir_function_impl *impl, } } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); + return progress; } @@ -518,11 +522,8 @@ nir_lower_subgroups(nir_shader *shader, if (!function->impl) continue; - if (lower_subgroups_impl(function->impl, options)) { + if (lower_subgroups_impl(function->impl, options)) progress = true; - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - } } return progress; diff --git a/src/compiler/nir/nir_lower_system_values.c b/src/compiler/nir/nir_lower_system_values.c index 07434dc933a4..224b591b625c 100644 --- a/src/compiler/nir/nir_lower_system_values.c +++ b/src/compiler/nir/nir_lower_system_values.c @@ -321,8 +321,10 @@ convert_impl(nir_function_impl *impl) progress |= convert_block(block, &builder); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); + return progress; } diff --git a/src/compiler/nir/nir_lower_tex.c b/src/compiler/nir/nir_lower_tex.c index 53719017a87f..964f85ce777a 100644 --- a/src/compiler/nir/nir_lower_tex.c +++ b/src/compiler/nir/nir_lower_tex.c @@ -1158,8 +1158,9 @@ nir_lower_tex_impl(nir_function_impl *impl, progress |= nir_lower_tex_block(block, &builder, options); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_to_source_mods.c b/src/compiler/nir/nir_lower_to_source_mods.c index c4ba604b32e0..54ddd1c81d0f 100644 --- a/src/compiler/nir/nir_lower_to_source_mods.c +++ b/src/compiler/nir/nir_lower_to_source_mods.c @@ -201,9 +201,9 @@ nir_lower_to_source_mods_impl(nir_function_impl *impl, progress |= nir_lower_to_source_mods_block(block, options); } - if (progress) - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_two_sided_color.c b/src/compiler/nir/nir_lower_two_sided_color.c index c7fb3c77b490..533c5bb9a1d6 100644 --- a/src/compiler/nir/nir_lower_two_sided_color.c +++ b/src/compiler/nir/nir_lower_two_sided_color.c @@ -185,8 +185,9 @@ nir_lower_two_sided_color_impl(nir_function_impl *impl, nir_lower_two_sided_color_block(block, state); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } void diff --git a/src/compiler/nir/nir_lower_uniforms_to_ubo.c b/src/compiler/nir/nir_lower_uniforms_to_ubo.c index 2f6b23a248f1..2d1b6d0d1175 100644 --- a/src/compiler/nir/nir_lower_uniforms_to_ubo.c +++ b/src/compiler/nir/nir_lower_uniforms_to_ubo.c @@ -94,8 +94,9 @@ nir_lower_uniforms_to_ubo(nir_shader *shader, int multiplier) } } - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_var_copies.c b/src/compiler/nir/nir_lower_var_copies.c index 0ba398698f0d..42c70a1510fb 100644 --- a/src/compiler/nir/nir_lower_var_copies.c +++ b/src/compiler/nir/nir_lower_var_copies.c @@ -140,14 +140,9 @@ lower_var_copies_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_vars_to_ssa.c b/src/compiler/nir/nir_lower_vars_to_ssa.c index 4375f93dc3ca..cf1ccbe0b2ba 100644 --- a/src/compiler/nir/nir_lower_vars_to_ssa.c +++ b/src/compiler/nir/nir_lower_vars_to_ssa.c @@ -798,8 +798,9 @@ nir_lower_vars_to_ssa_impl(nir_function_impl *impl) nir_phi_builder_finish(state.phi_builder); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); ralloc_free(state.dead_ctx); diff --git a/src/compiler/nir/nir_lower_vec_to_movs.c b/src/compiler/nir/nir_lower_vec_to_movs.c index 8c286117d55e..22c0692449d8 100644 --- a/src/compiler/nir/nir_lower_vec_to_movs.c +++ b/src/compiler/nir/nir_lower_vec_to_movs.c @@ -292,10 +292,9 @@ nir_lower_vec_to_movs_impl(nir_function_impl *impl) progress |= lower_vec_to_movs_block(block, impl); } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_lower_viewport_transform.c b/src/compiler/nir/nir_lower_viewport_transform.c index 94b54524ab7a..2b7b7a08b19f 100644 --- a/src/compiler/nir/nir_lower_viewport_transform.c +++ b/src/compiler/nir/nir_lower_viewport_transform.c @@ -96,7 +96,8 @@ nir_lower_viewport_transform(nir_shader *shader) } } - nir_metadata_preserve(func->impl, nir_metadata_block_index | + nir_metadata_preserve(func->impl, true, + nir_metadata_block_index | nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_wpos_center.c b/src/compiler/nir/nir_lower_wpos_center.c index 3c114936f7e8..4ade90c768c6 100644 --- a/src/compiler/nir/nir_lower_wpos_center.c +++ b/src/compiler/nir/nir_lower_wpos_center.c @@ -116,8 +116,9 @@ nir_lower_wpos_center(nir_shader *shader, const bool for_sample_shading) progress = lower_wpos_center_block(&b, block, for_sample_shading) || progress; } - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_lower_wpos_ytransform.c b/src/compiler/nir/nir_lower_wpos_ytransform.c index d0a694f889b9..c79ac2aeddcb 100644 --- a/src/compiler/nir/nir_lower_wpos_ytransform.c +++ b/src/compiler/nir/nir_lower_wpos_ytransform.c @@ -366,8 +366,9 @@ lower_wpos_ytransform_impl(lower_wpos_ytransform_state *state, nir_function_impl nir_foreach_block(block, impl) { lower_wpos_ytransform_block(state, block); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } bool diff --git a/src/compiler/nir/nir_metadata.c b/src/compiler/nir/nir_metadata.c index e681ba34f755..85b9d6657a15 100644 --- a/src/compiler/nir/nir_metadata.c +++ b/src/compiler/nir/nir_metadata.c @@ -54,9 +54,15 @@ nir_metadata_require(nir_function_impl *impl, nir_metadata required, ...) } void -nir_metadata_preserve(nir_function_impl *impl, nir_metadata preserved) +nir_metadata_preserve(nir_function_impl *impl, bool impl_altered, + nir_metadata preserved) { - impl->valid_metadata &= preserved; + assert(!(preserved & nir_metadata_not_properly_reset)); + + if (impl_altered) + impl->valid_metadata &= preserved; + else + impl->valid_metadata &= ~nir_metadata_not_properly_reset; } #ifndef NDEBUG diff --git a/src/compiler/nir/nir_move_load_const.c b/src/compiler/nir/nir_move_load_const.c index abc53fdce6aa..378762945c4e 100644 --- a/src/compiler/nir/nir_move_load_const.c +++ b/src/compiler/nir/nir_move_load_const.c @@ -133,8 +133,9 @@ nir_move_load_const(nir_shader *shader) } } - nir_metadata_preserve(function->impl, - nir_metadata_block_index | nir_metadata_dominance); + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } return progress; diff --git a/src/compiler/nir/nir_move_vec_src_uses_to_dest.c b/src/compiler/nir/nir_move_vec_src_uses_to_dest.c index 6acd679a0ad2..8334ea820e9b 100644 --- a/src/compiler/nir/nir_move_vec_src_uses_to_dest.c +++ b/src/compiler/nir/nir_move_vec_src_uses_to_dest.c @@ -191,8 +191,9 @@ nir_move_vec_src_uses_to_dest_impl(nir_shader *shader, nir_function_impl *impl) progress |= move_vec_src_uses_to_dest_block(block); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_normalize_cubemap_coords.c b/src/compiler/nir/nir_normalize_cubemap_coords.c index cb25e311d769..ecfcdaffe4a1 100644 --- a/src/compiler/nir/nir_normalize_cubemap_coords.c +++ b/src/compiler/nir/nir_normalize_cubemap_coords.c @@ -96,8 +96,9 @@ normalize_cubemap_coords_impl(nir_function_impl *impl) progress |= normalize_cubemap_coords_block(block, &b); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_combine_stores.c b/src/compiler/nir/nir_opt_combine_stores.c index 48b9cfa15012..b38591727270 100644 --- a/src/compiler/nir/nir_opt_combine_stores.c +++ b/src/compiler/nir/nir_opt_combine_stores.c @@ -368,10 +368,9 @@ combine_stores_impl(struct combine_stores_state *state, nir_function_impl *impl) nir_foreach_block(block, impl) combine_stores_block(state, block); - if (state->progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, state->progress, + nir_metadata_block_index | + nir_metadata_dominance); return state->progress; } diff --git a/src/compiler/nir/nir_opt_comparison_pre.c b/src/compiler/nir/nir_opt_comparison_pre.c index 221379b3a23d..4fa1ddd13676 100644 --- a/src/compiler/nir/nir_opt_comparison_pre.c +++ b/src/compiler/nir/nir_opt_comparison_pre.c @@ -362,9 +362,9 @@ nir_opt_comparison_pre_impl(nir_function_impl *impl) block_queue_finish(&bq); - if (progress) - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_conditional_discard.c b/src/compiler/nir/nir_opt_conditional_discard.c index 06f4eb80694d..81031d3f456e 100644 --- a/src/compiler/nir/nir_opt_conditional_discard.c +++ b/src/compiler/nir/nir_opt_conditional_discard.c @@ -121,12 +121,10 @@ nir_opt_conditional_discard(nir_shader *shader) impl_progress |= nir_opt_conditional_discard_block(&builder, block); } - if (impl_progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - progress = true; - } + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); + progress = progress || impl_progress; } } return progress; diff --git a/src/compiler/nir/nir_opt_constant_folding.c b/src/compiler/nir/nir_opt_constant_folding.c index 84dbce5ac303..3ec9781cca09 100644 --- a/src/compiler/nir/nir_opt_constant_folding.c +++ b/src/compiler/nir/nir_opt_constant_folding.c @@ -179,14 +179,9 @@ nir_opt_constant_folding_impl(nir_function_impl *impl) progress |= constant_fold_block(block, mem_ctx); } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c index 7e4cb3ea29ad..7711e340d1fa 100644 --- a/src/compiler/nir/nir_opt_copy_prop_vars.c +++ b/src/compiler/nir/nir_opt_copy_prop_vars.c @@ -1122,14 +1122,9 @@ nir_copy_prop_vars_impl(nir_function_impl *impl) copy_prop_vars_cf_node(&state, NULL, &impl->cf_node); - if (state.progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, state.progress, + nir_metadata_block_index | + nir_metadata_dominance); ralloc_free(mem_ctx); return state.progress; diff --git a/src/compiler/nir/nir_opt_copy_propagate.c b/src/compiler/nir/nir_opt_copy_propagate.c index 0961d6bbf291..64376db0735e 100644 --- a/src/compiler/nir/nir_opt_copy_propagate.c +++ b/src/compiler/nir/nir_opt_copy_propagate.c @@ -271,14 +271,9 @@ nir_copy_prop_impl(nir_function_impl *impl) progress = true; } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_cse.c b/src/compiler/nir/nir_opt_cse.c index 3c3617d852a7..49e6b8d8e08d 100644 --- a/src/compiler/nir/nir_opt_cse.c +++ b/src/compiler/nir/nir_opt_cse.c @@ -70,14 +70,9 @@ nir_opt_cse_impl(nir_function_impl *impl) bool progress = cse_block(nir_start_block(impl), instr_set); - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); nir_instr_set_destroy(instr_set); return progress; diff --git a/src/compiler/nir/nir_opt_dce.c b/src/compiler/nir/nir_opt_dce.c index 724cf3f20349..b7d959c350e1 100644 --- a/src/compiler/nir/nir_opt_dce.c +++ b/src/compiler/nir/nir_opt_dce.c @@ -145,14 +145,9 @@ nir_opt_dce_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_dead_cf.c b/src/compiler/nir/nir_opt_dead_cf.c index 33f3565c564c..2863cf22f143 100644 --- a/src/compiler/nir/nir_opt_dead_cf.c +++ b/src/compiler/nir/nir_opt_dead_cf.c @@ -353,13 +353,7 @@ opt_dead_cf_impl(nir_function_impl *impl) bool dummy; bool progress = dead_cf_list(&impl->body, &dummy); - if (progress) { - nir_metadata_preserve(impl, nir_metadata_none); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, nir_metadata_none); return progress; } diff --git a/src/compiler/nir/nir_opt_dead_write_vars.c b/src/compiler/nir/nir_opt_dead_write_vars.c index d2062a01ac03..4045f5f6123e 100644 --- a/src/compiler/nir/nir_opt_dead_write_vars.c +++ b/src/compiler/nir/nir_opt_dead_write_vars.c @@ -197,10 +197,9 @@ remove_dead_write_vars_impl(void *mem_ctx, nir_function_impl *impl) nir_foreach_block(block, impl) progress |= remove_dead_write_vars_local(mem_ctx, block); - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_find_array_copies.c b/src/compiler/nir/nir_opt_find_array_copies.c index 1573cce83748..6c41a69673fb 100644 --- a/src/compiler/nir/nir_opt_find_array_copies.c +++ b/src/compiler/nir/nir_opt_find_array_copies.c @@ -372,10 +372,9 @@ opt_find_array_copies_impl(nir_function_impl *impl) ralloc_free(mem_ctx); - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_gcm.c b/src/compiler/nir/nir_opt_gcm.c index e7d3f8ec424f..1a373778b360 100644 --- a/src/compiler/nir/nir_opt_gcm.c +++ b/src/compiler/nir/nir_opt_gcm.c @@ -502,8 +502,9 @@ opt_gcm_impl(nir_function_impl *impl, bool value_number) ralloc_free(state.blocks); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_idiv_const.c b/src/compiler/nir/nir_opt_idiv_const.c index 688186779e6b..393902f876d5 100644 --- a/src/compiler/nir/nir_opt_idiv_const.c +++ b/src/compiler/nir/nir_opt_idiv_const.c @@ -195,10 +195,9 @@ nir_opt_idiv_const_impl(nir_function_impl *impl, unsigned min_bit_size) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c index 6d488bd76a38..2a0d4cd34a86 100644 --- a/src/compiler/nir/nir_opt_if.c +++ b/src/compiler/nir/nir_opt_if.c @@ -1427,15 +1427,19 @@ nir_opt_if(nir_shader *shader, bool aggressive_last_continue) nir_builder b; nir_builder_init(&b, function->impl); - nir_metadata_require(function->impl, nir_metadata_block_index | + nir_metadata_require(function->impl, + nir_metadata_block_index | nir_metadata_dominance); + progress = opt_if_safe_cf_list(&b, &function->impl->body); - nir_metadata_preserve(function->impl, nir_metadata_block_index | + + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | nir_metadata_dominance); if (opt_if_cf_list(&b, &function->impl->body, aggressive_last_continue)) { - nir_metadata_preserve(function->impl, nir_metadata_none); + nir_metadata_preserve(function->impl, true, nir_metadata_none); /* If that made progress, we're no longer really in SSA form. We * need to convert registers back into SSA defs and clean up SSA defs @@ -1444,10 +1448,6 @@ nir_opt_if(nir_shader *shader, bool aggressive_last_continue) nir_lower_regs_to_ssa_impl(function->impl); progress = true; - } else { - #ifndef NDEBUG - function->impl->valid_metadata &= ~nir_metadata_not_properly_reset; - #endif } } diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c index e185602bf9e0..1fd4654cb7b3 100644 --- a/src/compiler/nir/nir_opt_intrinsics.c +++ b/src/compiler/nir/nir_opt_intrinsics.c @@ -105,6 +105,10 @@ opt_intrinsics_impl(nir_function_impl *impl, } } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); + return progress; } @@ -117,11 +121,8 @@ nir_opt_intrinsics(nir_shader *shader) if (!function->impl) continue; - if (opt_intrinsics_impl(function->impl, shader->options)) { + if (opt_intrinsics_impl(function->impl, shader->options)) progress = true; - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - } } return progress; diff --git a/src/compiler/nir/nir_opt_large_constants.c b/src/compiler/nir/nir_opt_large_constants.c index d234196e8fdb..123bae0332da 100644 --- a/src/compiler/nir/nir_opt_large_constants.c +++ b/src/compiler/nir/nir_opt_large_constants.c @@ -240,6 +240,9 @@ nir_opt_large_constants(nir_shader *shader, if (shader->constant_data_size == 0) { free(var_infos); + nir_metadata_preserve(impl, false, + nir_metadata_block_index | + nir_metadata_dominance); return false; } @@ -321,7 +324,8 @@ nir_opt_large_constants(nir_shader *shader, free(var_infos); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); return true; } diff --git a/src/compiler/nir/nir_opt_loop_unroll.c b/src/compiler/nir/nir_opt_loop_unroll.c index c01983907495..efa860989d8a 100644 --- a/src/compiler/nir/nir_opt_loop_unroll.c +++ b/src/compiler/nir/nir_opt_loop_unroll.c @@ -929,6 +929,7 @@ nir_opt_loop_unroll_impl(nir_function_impl *impl, &has_nested_loop); } + nir_metadata_preserve(impl, progress, nir_metadata_none); if (progress) nir_lower_regs_to_ssa_impl(impl); diff --git a/src/compiler/nir/nir_opt_move_comparisons.c b/src/compiler/nir/nir_opt_move_comparisons.c index 5da57dc9213b..200577d48021 100644 --- a/src/compiler/nir/nir_opt_move_comparisons.c +++ b/src/compiler/nir/nir_opt_move_comparisons.c @@ -148,13 +148,14 @@ nir_opt_move_comparisons(nir_shader *shader) continue; nir_foreach_block(block, func->impl) { - if (move_comparisons(block)) { - nir_metadata_preserve(func->impl, nir_metadata_block_index | - nir_metadata_dominance | - nir_metadata_live_ssa_defs); + if (move_comparisons(block)) progress = true; - } } + + nir_metadata_preserve(func->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); } return progress; diff --git a/src/compiler/nir/nir_opt_move_load_ubo.c b/src/compiler/nir/nir_opt_move_load_ubo.c index f36a62a5308b..175e838e80d9 100644 --- a/src/compiler/nir/nir_opt_move_load_ubo.c +++ b/src/compiler/nir/nir_opt_move_load_ubo.c @@ -103,14 +103,17 @@ nir_opt_move_load_ubo(nir_shader *shader) if (!func->impl) continue; + bool impl_progress = false; nir_foreach_block(block, func->impl) { - if (move_load_ubo(block)) { - nir_metadata_preserve(func->impl, nir_metadata_block_index | - nir_metadata_dominance | - nir_metadata_live_ssa_defs); - progress = true; - } + if (move_load_ubo(block)) + impl_progress = true; } + + nir_metadata_preserve(func->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); + progress = progress || impl_progress; } return progress; diff --git a/src/compiler/nir/nir_opt_peephole_select.c b/src/compiler/nir/nir_opt_peephole_select.c index 09ae3d5632f9..99334e2dbb24 100644 --- a/src/compiler/nir/nir_opt_peephole_select.c +++ b/src/compiler/nir/nir_opt_peephole_select.c @@ -291,13 +291,7 @@ nir_opt_peephole_select_impl(nir_function_impl *impl, unsigned limit, expensive_alu_ok); } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_none); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, nir_metadata_none); return progress; } diff --git a/src/compiler/nir/nir_opt_rematerialize_compares.c b/src/compiler/nir/nir_opt_rematerialize_compares.c index 806dbd2f29ad..16f47ecddc83 100644 --- a/src/compiler/nir/nir_opt_rematerialize_compares.c +++ b/src/compiler/nir/nir_opt_rematerialize_compares.c @@ -156,10 +156,9 @@ nir_opt_rematerialize_compares_impl(nir_shader *shader, nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_remove_phis.c b/src/compiler/nir/nir_opt_remove_phis.c index dd557396ec14..0a6a4eac55a9 100644 --- a/src/compiler/nir/nir_opt_remove_phis.c +++ b/src/compiler/nir/nir_opt_remove_phis.c @@ -148,14 +148,9 @@ nir_opt_remove_phis_impl(nir_function_impl *impl) progress |= remove_phis_block(block, &bld); } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_opt_shrink_load.c b/src/compiler/nir/nir_opt_shrink_load.c index f97b7f9b67f0..c7a670846b77 100644 --- a/src/compiler/nir/nir_opt_shrink_load.c +++ b/src/compiler/nir/nir_opt_shrink_load.c @@ -59,8 +59,9 @@ nir_opt_shrink_load(nir_shader *shader) } } - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } return progress; diff --git a/src/compiler/nir/nir_opt_trivial_continues.c b/src/compiler/nir/nir_opt_trivial_continues.c index 54d2245bccb0..3e2409ae836e 100644 --- a/src/compiler/nir/nir_opt_trivial_continues.c +++ b/src/compiler/nir/nir_opt_trivial_continues.c @@ -125,11 +125,13 @@ nir_opt_trivial_continues(nir_shader *shader) /* First we run the simple pass to get rid of pesky continues */ if (lower_trivial_continues_list(&function->impl->body, false, NULL)) { - nir_metadata_preserve(function->impl, nir_metadata_none); + nir_metadata_preserve(function->impl, true, nir_metadata_none); /* If that made progress, we're no longer really in SSA form. */ nir_lower_regs_to_ssa_impl(function->impl); progress = true; + } else { + nir_metadata_preserve(function->impl, false, nir_metadata_none); } } diff --git a/src/compiler/nir/nir_opt_undef.c b/src/compiler/nir/nir_opt_undef.c index 1f939e82c68e..7408dad929e9 100644 --- a/src/compiler/nir/nir_opt_undef.c +++ b/src/compiler/nir/nir_opt_undef.c @@ -153,15 +153,9 @@ nir_opt_undef(nir_shader *shader) } } - if (progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - function->impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_propagate_invariant.c b/src/compiler/nir/nir_propagate_invariant.c index a0cfde67891c..578851aae22b 100644 --- a/src/compiler/nir/nir_propagate_invariant.c +++ b/src/compiler/nir/nir_propagate_invariant.c @@ -178,11 +178,10 @@ propagate_invariant_impl(nir_function_impl *impl, struct set *invariants) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance | - nir_metadata_live_ssa_defs); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); return progress; } diff --git a/src/compiler/nir/nir_remove_dead_variables.c b/src/compiler/nir/nir_remove_dead_variables.c index cfdd17962994..dd114c5278f1 100644 --- a/src/compiler/nir/nir_remove_dead_variables.c +++ b/src/compiler/nir/nir_remove_dead_variables.c @@ -195,14 +195,14 @@ nir_remove_dead_variables(nir_shader *shader, nir_variable_mode modes) } } - if (progress) { + if (progress) remove_dead_var_writes(shader, live); - nir_foreach_function(function, shader) { - if (function->impl) { - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_foreach_function(function, shader) { + if (function->impl) { + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/compiler/nir/nir_repair_ssa.c b/src/compiler/nir/nir_repair_ssa.c index f182818374d7..e096c6edb827 100644 --- a/src/compiler/nir/nir_repair_ssa.c +++ b/src/compiler/nir/nir_repair_ssa.c @@ -137,9 +137,9 @@ nir_repair_ssa_impl(nir_function_impl *impl) } } - if (state.progress) - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, state.progress, + nir_metadata_block_index | + nir_metadata_dominance); if (state.phi_builder) { nir_phi_builder_finish(state.phi_builder); diff --git a/src/compiler/nir/nir_split_per_member_structs.c b/src/compiler/nir/nir_split_per_member_structs.c index c6afef235bcd..4522d0b54516 100644 --- a/src/compiler/nir/nir_split_per_member_structs.c +++ b/src/compiler/nir/nir_split_per_member_structs.c @@ -203,7 +203,7 @@ nir_split_per_member_structs(nir_shader *shader) } } - nir_metadata_preserve(function->impl, + nir_metadata_preserve(function->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/compiler/nir/nir_split_var_copies.c b/src/compiler/nir/nir_split_var_copies.c index 355a4e56d013..3b593a641526 100644 --- a/src/compiler/nir/nir_split_var_copies.c +++ b/src/compiler/nir/nir_split_var_copies.c @@ -111,14 +111,9 @@ split_var_copies_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } else { -#ifndef NDEBUG - impl->valid_metadata &= ~nir_metadata_not_properly_reset; -#endif - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/compiler/nir/nir_split_vars.c b/src/compiler/nir/nir_split_vars.c index 3d98b5c8805f..f252a2692b0b 100644 --- a/src/compiler/nir/nir_split_vars.c +++ b/src/compiler/nir/nir_split_vars.c @@ -327,11 +327,12 @@ nir_split_struct_vars(nir_shader *shader, nir_variable_mode modes) if (has_global_splits || has_local_splits) { split_struct_derefs_impl(function->impl, var_field_map, modes, mem_ctx); - - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); progress = true; } + nir_metadata_preserve(function->impl, + has_global_splits || has_local_splits, + nir_metadata_block_index | + nir_metadata_dominance); } ralloc_free(mem_ctx); @@ -907,11 +908,12 @@ nir_split_array_vars(nir_shader *shader, nir_variable_mode modes) if (has_global_splits || has_local_splits) { split_array_copies_impl(function->impl, var_info_map, modes, mem_ctx); split_array_access_impl(function->impl, var_info_map, modes, mem_ctx); - - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); progress = true; } + nir_metadata_preserve(function->impl, + has_global_splits || has_local_splits, + nir_metadata_block_index | + nir_metadata_dominance); } ralloc_free(mem_ctx); @@ -1649,11 +1651,12 @@ nir_shrink_vec_array_vars(nir_shader *shader, nir_variable_mode modes) if (globals_shrunk || locals_shrunk) { shrink_vec_var_access_impl(function->impl, var_usage_map, modes); - - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); progress = true; } + nir_metadata_preserve(function->impl, + globals_shrunk || locals_shrunk, + nir_metadata_block_index | + nir_metadata_dominance); } ralloc_free(mem_ctx); diff --git a/src/compiler/nir/nir_sweep.c b/src/compiler/nir/nir_sweep.c index 56b7a267f64a..7d765b631793 100644 --- a/src/compiler/nir/nir_sweep.c +++ b/src/compiler/nir/nir_sweep.c @@ -137,7 +137,7 @@ sweep_impl(nir_shader *nir, nir_function_impl *impl) sweep_block(nir, impl->end_block); /* Wipe out all the metadata, if any. */ - nir_metadata_preserve(impl, nir_metadata_none); + nir_metadata_preserve(impl, true, nir_metadata_none); } static void diff --git a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c index 312c06446234..240938e5fd41 100644 --- a/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c +++ b/src/freedreno/ir3/ir3_nir_analyze_ubo_ranges.c @@ -181,8 +181,9 @@ ir3_nir_analyze_ubo_ranges(nir_shader *nir, struct ir3_shader *shader) } } - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/freedreno/ir3/ir3_nir_lower_io_offsets.c b/src/freedreno/ir3/ir3_nir_lower_io_offsets.c index f0b4218fcb47..cb83398b0f01 100644 --- a/src/freedreno/ir3/ir3_nir_lower_io_offsets.c +++ b/src/freedreno/ir3/ir3_nir_lower_io_offsets.c @@ -282,10 +282,9 @@ lower_io_offsets_func(nir_function_impl *impl) progress |= lower_io_offsets_block(block, &b, mem_ctx); } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_offset.c b/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_offset.c index 0277e2b3851a..4e89d1968b50 100644 --- a/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_offset.c +++ b/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_offset.c @@ -114,10 +114,9 @@ ir3_nir_lower_load_barycentric_at_offset(nir_shader *shader) } } - if (progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } return progress; diff --git a/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_sample.c b/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_sample.c index e27f4822e2c2..320f73793130 100644 --- a/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_sample.c +++ b/src/freedreno/ir3/ir3_nir_lower_load_barycentric_at_sample.c @@ -120,10 +120,9 @@ ir3_nir_lower_load_barycentric_at_sample(nir_shader *shader) } } - if (progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } return progress; diff --git a/src/freedreno/ir3/ir3_nir_lower_tg4_to_tex.c b/src/freedreno/ir3/ir3_nir_lower_tg4_to_tex.c index 37a3dcb26f80..102480d97b7e 100644 --- a/src/freedreno/ir3/ir3_nir_lower_tg4_to_tex.c +++ b/src/freedreno/ir3/ir3_nir_lower_tg4_to_tex.c @@ -117,9 +117,9 @@ lower_tg4_func(nir_function_impl *impl) progress |= lower_tg4(block, &b, mem_ctx); } - if (progress) - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/freedreno/ir3/ir3_nir_move_varying_inputs.c b/src/freedreno/ir3/ir3_nir_move_varying_inputs.c index ede8743dd897..f36c8332f074 100644 --- a/src/freedreno/ir3/ir3_nir_move_varying_inputs.c +++ b/src/freedreno/ir3/ir3_nir_move_varying_inputs.c @@ -133,10 +133,9 @@ ir3_nir_move_varying_inputs(nir_shader *shader) progress |= move_varying_inputs_block(&state, block); } - if (progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } return progress; diff --git a/src/gallium/drivers/freedreno/a2xx/ir2_nir_lower_scalar.c b/src/gallium/drivers/freedreno/a2xx/ir2_nir_lower_scalar.c index 2b72a86b3e16..ab7dbc786ee0 100644 --- a/src/gallium/drivers/freedreno/a2xx/ir2_nir_lower_scalar.c +++ b/src/gallium/drivers/freedreno/a2xx/ir2_nir_lower_scalar.c @@ -155,8 +155,9 @@ static bool lower_scalar_impl(nir_function_impl * impl) } } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/gallium/drivers/panfrost/midgard/midgard_compile.c b/src/gallium/drivers/panfrost/midgard/midgard_compile.c index dd86e8bceeeb..d0bf49961d80 100644 --- a/src/gallium/drivers/panfrost/midgard/midgard_compile.c +++ b/src/gallium/drivers/panfrost/midgard/midgard_compile.c @@ -333,7 +333,9 @@ midgard_nir_lower_fdot2(nir_shader *shader) } } - nir_metadata_preserve(function->impl, nir_metadata_block_index | nir_metadata_dominance); + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } diff --git a/src/gallium/drivers/panfrost/midgard/nir_lower_blend.c b/src/gallium/drivers/panfrost/midgard/nir_lower_blend.c index 7a7f0ebabd7f..b185a8cf15cd 100644 --- a/src/gallium/drivers/panfrost/midgard/nir_lower_blend.c +++ b/src/gallium/drivers/panfrost/midgard/nir_lower_blend.c @@ -241,7 +241,8 @@ nir_lower_blend(nir_shader *shader, nir_lower_blend_options options) } } - nir_metadata_preserve(func->impl, nir_metadata_block_index | + nir_metadata_preserve(func->impl, true, + nir_metadata_block_index | nir_metadata_dominance); } } diff --git a/src/gallium/drivers/vc4/vc4_nir_lower_blend.c b/src/gallium/drivers/vc4/vc4_nir_lower_blend.c index ff6268f478a3..6db558fdb124 100644 --- a/src/gallium/drivers/vc4/vc4_nir_lower_blend.c +++ b/src/gallium/drivers/vc4/vc4_nir_lower_blend.c @@ -634,7 +634,7 @@ vc4_nir_lower_blend(nir_shader *s, struct vc4_compile *c) vc4_nir_lower_blend_block(block, c); } - nir_metadata_preserve(function->impl, + nir_metadata_preserve(function->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/gallium/drivers/vc4/vc4_nir_lower_io.c b/src/gallium/drivers/vc4/vc4_nir_lower_io.c index 5dbc2c8e324c..4e90953fb3d8 100644 --- a/src/gallium/drivers/vc4/vc4_nir_lower_io.c +++ b/src/gallium/drivers/vc4/vc4_nir_lower_io.c @@ -395,7 +395,8 @@ vc4_nir_lower_io_impl(struct vc4_compile *c, nir_function_impl *impl) vc4_nir_lower_io_instr(c, &b, instr); } - nir_metadata_preserve(impl, nir_metadata_block_index | + nir_metadata_preserve(impl, true, + nir_metadata_block_index | nir_metadata_dominance); return true; diff --git a/src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c b/src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c index 92b9e8918c6b..d981c838dd84 100644 --- a/src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c +++ b/src/gallium/drivers/vc4/vc4_nir_lower_txf_ms.c @@ -143,7 +143,7 @@ vc4_nir_lower_txf_ms_impl(struct vc4_compile *c, nir_function_impl *impl) } } - nir_metadata_preserve(impl, + nir_metadata_preserve(impl, true, nir_metadata_block_index | nir_metadata_dominance); diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 4151ed7485e7..5f889d4adb28 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -7860,6 +7860,7 @@ move_interpolation_to_top(nir_shader *nir) nir_block *top = nir_start_block(f->impl); exec_node *cursor_node = NULL; + bool impl_progress = false; nir_foreach_block(block, f->impl) { if (block == top) continue; @@ -7896,14 +7897,15 @@ move_interpolation_to_top(nir_shader *nir) exec_list_push_head(&top->instr_list, &move[i]->node); } cursor_node = &move[i]->node; - progress = true; + impl_progress = true; } } } } - nir_metadata_preserve(f->impl, (nir_metadata) + nir_metadata_preserve(f->impl, impl_progress, (nir_metadata) ((unsigned) nir_metadata_block_index | (unsigned) nir_metadata_dominance)); + progress = progress || impl_progress; } return progress; @@ -7926,6 +7928,7 @@ demote_sample_qualifiers(nir_shader *nir) nir_builder b; nir_builder_init(&b, f->impl); + bool impl_progress = false; nir_foreach_block(block, f->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -7943,13 +7946,14 @@ demote_sample_qualifiers(nir_shader *nir) nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_src_for_ssa(centroid)); nir_instr_remove(instr); - progress = true; + impl_progress = true; } } - nir_metadata_preserve(f->impl, (nir_metadata) + nir_metadata_preserve(f->impl, impl_progress, (nir_metadata) ((unsigned) nir_metadata_block_index | (unsigned) nir_metadata_dominance)); + progress = progress || impl_progress; } return progress; diff --git a/src/intel/compiler/brw_nir_attribute_workarounds.c b/src/intel/compiler/brw_nir_attribute_workarounds.c index ecd0f0752b0a..ee11251085aa 100644 --- a/src/intel/compiler/brw_nir_attribute_workarounds.c +++ b/src/intel/compiler/brw_nir_attribute_workarounds.c @@ -150,11 +150,10 @@ brw_nir_apply_attribute_workarounds(nir_shader *shader, apply_attr_wa_block(block, &state); } - if (state.impl_progress) { - nir_metadata_preserve(func->impl, nir_metadata_block_index | - nir_metadata_dominance); - progress = true; - } + nir_metadata_preserve(func->impl, state.impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); + progress = progress || state.impl_progress; } return progress; diff --git a/src/intel/compiler/brw_nir_lower_conversions.c b/src/intel/compiler/brw_nir_lower_conversions.c index 9aff30b568b4..3f8ff5f15b03 100644 --- a/src/intel/compiler/brw_nir_lower_conversions.c +++ b/src/intel/compiler/brw_nir_lower_conversions.c @@ -147,10 +147,9 @@ lower_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/intel/compiler/brw_nir_lower_cs_intrinsics.c b/src/intel/compiler/brw_nir_lower_cs_intrinsics.c index 434ad0052811..7bf816f1965d 100644 --- a/src/intel/compiler/brw_nir_lower_cs_intrinsics.c +++ b/src/intel/compiler/brw_nir_lower_cs_intrinsics.c @@ -183,7 +183,7 @@ lower_cs_intrinsics_convert_impl(struct lower_intrinsics_state *state) lower_cs_intrinsics_convert_block(state, block); } - nir_metadata_preserve(state->impl, + nir_metadata_preserve(state->impl, true, nir_metadata_block_index | nir_metadata_dominance); } diff --git a/src/intel/compiler/brw_nir_lower_image_load_store.c b/src/intel/compiler/brw_nir_lower_image_load_store.c index c23f64fb3387..c69e4a1f1a6f 100644 --- a/src/intel/compiler/brw_nir_lower_image_load_store.c +++ b/src/intel/compiler/brw_nir_lower_image_load_store.c @@ -742,6 +742,7 @@ brw_nir_lower_image_load_store(nir_shader *shader, if (function->impl == NULL) continue; + bool impl_progress = false; nir_foreach_block_safe(block, function->impl) { nir_builder b; nir_builder_init(&b, function->impl); @@ -754,12 +755,12 @@ brw_nir_lower_image_load_store(nir_shader *shader, switch (intrin->intrinsic) { case nir_intrinsic_image_deref_load: if (lower_image_load_instr(&b, devinfo, intrin)) - progress = true; + impl_progress = true; break; case nir_intrinsic_image_deref_store: if (lower_image_store_instr(&b, devinfo, intrin)) - progress = true; + impl_progress = true; break; case nir_intrinsic_image_deref_atomic_add: @@ -771,12 +772,12 @@ brw_nir_lower_image_load_store(nir_shader *shader, case nir_intrinsic_image_deref_atomic_exchange: case nir_intrinsic_image_deref_atomic_comp_swap: if (lower_image_atomic_instr(&b, devinfo, intrin)) - progress = true; + impl_progress = true; break; case nir_intrinsic_image_deref_size: if (lower_image_size_instr(&b, devinfo, intrin)) - progress = true; + impl_progress = true; break; default: @@ -786,8 +787,9 @@ brw_nir_lower_image_load_store(nir_shader *shader, } } - if (progress) - nir_metadata_preserve(function->impl, nir_metadata_none); + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_none); + progress = progress || impl_progress; } return progress; diff --git a/src/intel/compiler/brw_nir_lower_mem_access_bit_sizes.c b/src/intel/compiler/brw_nir_lower_mem_access_bit_sizes.c index 5eff6639e518..6eb76aceabcb 100644 --- a/src/intel/compiler/brw_nir_lower_mem_access_bit_sizes.c +++ b/src/intel/compiler/brw_nir_lower_mem_access_bit_sizes.c @@ -281,10 +281,9 @@ lower_mem_access_bit_sizes_impl(nir_function_impl *impl) } } - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/intel/compiler/brw_nir_opt_peephole_ffma.c b/src/intel/compiler/brw_nir_opt_peephole_ffma.c index 58fabb179239..d294268a8a42 100644 --- a/src/intel/compiler/brw_nir_opt_peephole_ffma.c +++ b/src/intel/compiler/brw_nir_opt_peephole_ffma.c @@ -277,9 +277,9 @@ brw_nir_opt_peephole_ffma_impl(nir_function_impl *impl) progress |= brw_nir_opt_peephole_ffma_block(&builder, block); } - if (progress) - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/intel/compiler/brw_nir_tcs_workarounds.c b/src/intel/compiler/brw_nir_tcs_workarounds.c index 174cf6eec881..739a3d707b11 100644 --- a/src/intel/compiler/brw_nir_tcs_workarounds.c +++ b/src/intel/compiler/brw_nir_tcs_workarounds.c @@ -147,5 +147,5 @@ brw_nir_apply_tcs_quads_workaround(nir_shader *nir) emit_quads_workaround(&b, end_preds[i]); } - nir_metadata_preserve(impl, 0); + nir_metadata_preserve(impl, true, nir_metadata_none); } diff --git a/src/intel/vulkan/anv_nir_add_base_work_group_id.c b/src/intel/vulkan/anv_nir_add_base_work_group_id.c index a7c290bb52fd..1ef6fb99b211 100644 --- a/src/intel/vulkan/anv_nir_add_base_work_group_id.c +++ b/src/intel/vulkan/anv_nir_add_base_work_group_id.c @@ -40,6 +40,7 @@ anv_nir_add_base_work_group_id(nir_shader *shader, nir_builder_init(&b, function->impl); + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -81,12 +82,14 @@ anv_nir_add_base_work_group_id(nir_shader *shader, nir_ssa_def_rewrite_uses_after(&load_id->dest.ssa, nir_src_for_ssa(id), id->parent_instr); - progress = true; + impl_progress = true; } } - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); + progress = progress || impl_progress; } return progress; diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index 94ec56252ba2..ca32922d9d3a 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -1354,8 +1354,9 @@ anv_nir_apply_pipeline_layout(const struct anv_physical_device *pdevice, nir_builder_init(&state.builder, function->impl); nir_foreach_block(block, function->impl) apply_pipeline_layout_block(block, &state); - nir_metadata_preserve(function->impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(function->impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } ralloc_free(mem_ctx); diff --git a/src/intel/vulkan/anv_nir_lower_multiview.c b/src/intel/vulkan/anv_nir_lower_multiview.c index ffe9e7bb9724..7ae67cb56d70 100644 --- a/src/intel/vulkan/anv_nir_lower_multiview.c +++ b/src/intel/vulkan/anv_nir_lower_multiview.c @@ -223,10 +223,9 @@ anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask) progress = true; } - if (progress) { - nir_metadata_preserve(entrypoint, nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(entrypoint, progress, + nir_metadata_block_index | + nir_metadata_dominance); return progress; } diff --git a/src/intel/vulkan/anv_nir_lower_ycbcr_textures.c b/src/intel/vulkan/anv_nir_lower_ycbcr_textures.c index 799749d5db0d..330b60c79bcf 100644 --- a/src/intel/vulkan/anv_nir_lower_ycbcr_textures.c +++ b/src/intel/vulkan/anv_nir_lower_ycbcr_textures.c @@ -470,11 +470,9 @@ anv_nir_lower_ycbcr_textures(nir_shader *shader, } } - if (function_progress) { - nir_metadata_preserve(function->impl, - nir_metadata_block_index | - nir_metadata_dominance); - } + nir_metadata_preserve(function->impl, function_progress, + nir_metadata_block_index | + nir_metadata_dominance); progress |= function_progress; } diff --git a/src/mesa/state_tracker/st_nir_lower_builtin.c b/src/mesa/state_tracker/st_nir_lower_builtin.c index f6f9bf15278c..47d4e91f33e7 100644 --- a/src/mesa/state_tracker/st_nir_lower_builtin.c +++ b/src/mesa/state_tracker/st_nir_lower_builtin.c @@ -242,8 +242,9 @@ lower_builtin_impl(lower_builtin_state *state, nir_function_impl *impl) if (progress) nir_remove_dead_derefs_impl(impl); - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } void diff --git a/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c b/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c index 609a9aa4bc73..7755c1024571 100644 --- a/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c +++ b/src/mesa/state_tracker/st_nir_lower_tex_src_plane.c @@ -102,8 +102,9 @@ lower_tex_src_plane_impl(lower_tex_src_state *state, nir_function_impl *impl) lower_tex_src_plane_block(state, block); } - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); + nir_metadata_preserve(impl, true, + nir_metadata_block_index | + nir_metadata_dominance); } void -- GitLab From d60bd39999ac04146746301c4dd428cf9887ba5c Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:25:59 -0500 Subject: [PATCH 07/22] nir/metadata: Add two new preserve helpers --- src/compiler/nir/nir.h | 2 ++ src/compiler/nir/nir_metadata.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 066b990e9115..0cc681e2393c 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2514,6 +2514,8 @@ void nir_metadata_require(nir_function_impl *impl, nir_metadata required, ...); /** dirties all but the preserved metadata */ void nir_metadata_preserve(nir_function_impl *impl, bool impl_altered, nir_metadata preserved); +void nir_metadata_preserve_all(nir_function_impl *impl); +void nir_shader_preserve_all_metadata(nir_shader *shader); /** creates an instruction with default swizzle/writemask/etc. with NULL registers */ nir_alu_instr *nir_alu_instr_create(nir_shader *shader, nir_op op); diff --git a/src/compiler/nir/nir_metadata.c b/src/compiler/nir/nir_metadata.c index 85b9d6657a15..4988b6b0328d 100644 --- a/src/compiler/nir/nir_metadata.c +++ b/src/compiler/nir/nir_metadata.c @@ -65,6 +65,21 @@ nir_metadata_preserve(nir_function_impl *impl, bool impl_altered, impl->valid_metadata &= ~nir_metadata_not_properly_reset; } +void +nir_metadata_preserve_all(nir_function_impl *impl) +{ + nir_metadata_preserve(impl, false, 0); +} + +void +nir_shader_preserve_all_metadata(nir_shader *shader) +{ + nir_foreach_function(function, shader) { + if (function->impl) + nir_metadata_preserve_all(function->impl); + } +} + #ifndef NDEBUG /** * Make sure passes properly invalidate metadata (part 1). -- GitLab From 3171162ef149238b89c04561929721bb3e21e2eb Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:29:30 -0500 Subject: [PATCH 08/22] nir: Preserve metadata in more passes These are all passes which have early exits which didn't preserve metadata. --- src/compiler/nir/nir_lower_alu.c | 4 +++- src/compiler/nir/nir_lower_clip.c | 8 ++++++-- src/compiler/nir/nir_lower_io_to_temporaries.c | 4 +++- src/compiler/nir/nir_lower_io_to_vector.c | 4 +++- src/compiler/nir/nir_lower_two_sided_color.c | 4 +++- src/compiler/nir/nir_split_per_member_structs.c | 1 + src/compiler/nir/nir_split_vars.c | 2 ++ 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/compiler/nir/nir_lower_alu.c b/src/compiler/nir/nir_lower_alu.c index 4fc9fe6e60bc..1541c1e41f24 100644 --- a/src/compiler/nir/nir_lower_alu.c +++ b/src/compiler/nir/nir_lower_alu.c @@ -217,8 +217,10 @@ nir_lower_alu(nir_shader *shader) bool progress = false; if (!shader->options->lower_bitfield_reverse && - !shader->options->lower_mul_high) + !shader->options->lower_mul_high) { + nir_shader_preserve_all_metadata(shader); return false; + } nir_foreach_function(function, shader) { if (function->impl) { diff --git a/src/compiler/nir/nir_lower_clip.c b/src/compiler/nir/nir_lower_clip.c index 2ff27ae07a3d..5fb8eab86d0f 100644 --- a/src/compiler/nir/nir_lower_clip.c +++ b/src/compiler/nir/nir_lower_clip.c @@ -168,8 +168,10 @@ nir_lower_clip_vs(nir_shader *shader, unsigned ucp_enables, bool use_vars) nir_ssa_def *cv; nir_variable *out[2] = { NULL }; - if (!ucp_enables) + if (!ucp_enables) { + nir_shader_preserve_all_metadata(shader); return false; + } nir_builder_init(&b, impl); @@ -307,8 +309,10 @@ nir_lower_clip_fs(nir_shader *shader, unsigned ucp_enables) nir_variable *in[2]; int maxloc = -1; - if (!ucp_enables) + if (!ucp_enables) { + nir_shader_preserve_all_metadata(shader); return false; + } nir_foreach_variable(var, &shader->inputs) { int loc = var->data.driver_location; diff --git a/src/compiler/nir/nir_lower_io_to_temporaries.c b/src/compiler/nir/nir_lower_io_to_temporaries.c index 5bd76d2447d9..377f016454be 100644 --- a/src/compiler/nir/nir_lower_io_to_temporaries.c +++ b/src/compiler/nir/nir_lower_io_to_temporaries.c @@ -149,8 +149,10 @@ nir_lower_io_to_temporaries(nir_shader *shader, nir_function_impl *entrypoint, { struct lower_io_state state; - if (shader->info.stage == MESA_SHADER_TESS_CTRL) + if (shader->info.stage == MESA_SHADER_TESS_CTRL) { + nir_shader_preserve_all_metadata(shader); return; + } state.shader = shader; state.entrypoint = entrypoint; diff --git a/src/compiler/nir/nir_lower_io_to_vector.c b/src/compiler/nir/nir_lower_io_to_vector.c index 895718f53428..cecb8c6717b0 100644 --- a/src/compiler/nir/nir_lower_io_to_vector.c +++ b/src/compiler/nir/nir_lower_io_to_vector.c @@ -228,8 +228,10 @@ nir_lower_io_to_vector_impl(nir_function_impl *impl, nir_variable_mode modes) modes &= ~nir_var_shader_out; } - if (!modes) + if (!modes) { + nir_shader_preserve_all_metadata(shader); return false; + } bool progress = false; diff --git a/src/compiler/nir/nir_lower_two_sided_color.c b/src/compiler/nir/nir_lower_two_sided_color.c index 533c5bb9a1d6..467e04d1437c 100644 --- a/src/compiler/nir/nir_lower_two_sided_color.c +++ b/src/compiler/nir/nir_lower_two_sided_color.c @@ -199,8 +199,10 @@ nir_lower_two_sided_color(nir_shader *shader) .shader = shader, }; - if (setup_inputs(&state) != 0) + if (setup_inputs(&state) != 0) { + nir_shader_preserve_all_metadata(shader); return; + } nir_foreach_function(function, shader) { if (function->impl) diff --git a/src/compiler/nir/nir_split_per_member_structs.c b/src/compiler/nir/nir_split_per_member_structs.c index 4522d0b54516..b8bb559b0334 100644 --- a/src/compiler/nir/nir_split_per_member_structs.c +++ b/src/compiler/nir/nir_split_per_member_structs.c @@ -185,6 +185,7 @@ nir_split_per_member_structs(nir_shader *shader) var_to_member_map, dead_ctx); if (!progress) { ralloc_free(dead_ctx); + nir_shader_preserve_all_metadata(shader); return false; } diff --git a/src/compiler/nir/nir_split_vars.c b/src/compiler/nir/nir_split_vars.c index f252a2692b0b..d61474ddfd43 100644 --- a/src/compiler/nir/nir_split_vars.c +++ b/src/compiler/nir/nir_split_vars.c @@ -883,6 +883,7 @@ nir_split_array_vars(nir_shader *shader, nir_variable_mode modes) /* If we failed to find any arrays of arrays, bail early. */ if (!has_any_array) { ralloc_free(mem_ctx); + nir_shader_preserve_all_metadata(shader); return false; } @@ -1631,6 +1632,7 @@ nir_shrink_vec_array_vars(nir_shader *shader, nir_variable_mode modes) } if (!has_vars_to_shrink) { ralloc_free(mem_ctx); + nir_shader_preserve_all_metadata(shader); return false; } -- GitLab From c8263eddc37ecc726eae2c35ecc8e858bd183234 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:29:57 -0500 Subject: [PATCH 09/22] intel/nir: Call nir_metadata_preserve more places --- .../drivers/dri/i965/brw_nir_uniforms.cpp | 7 ++++++ src/mesa/drivers/dri/i965/brw_program.c | 22 ++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp index e5f97b647afc..1d36354525d7 100644 --- a/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp +++ b/src/mesa/drivers/dri/i965/brw_nir_uniforms.cpp @@ -323,6 +323,7 @@ brw_nir_lower_gl_images(nir_shader *shader, nir_builder b; nir_builder_init(&b, impl); + bool progress = true; nir_foreach_block(block, impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -356,6 +357,7 @@ brw_nir_lower_gl_images(nir_shader *shader, nir_ssa_def *index = nir_iadd(&b, nir_imm_int(&b, image_var_idx), get_aoa_deref_offset(&b, deref, 1)); nir_rewrite_image_intrinsic(intrin, index, false); + progress = true; break; } @@ -386,6 +388,7 @@ brw_nir_lower_gl_images(nir_shader *shader, nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_src_for_ssa(&load->dest.ssa)); + progress = true; break; } @@ -394,4 +397,8 @@ brw_nir_lower_gl_images(nir_shader *shader, } } } + + nir_metadata_preserve(impl, progress, + (nir_metadata)(nir_metadata_block_index | + nir_metadata_dominance)); } diff --git a/src/mesa/drivers/dri/i965/brw_program.c b/src/mesa/drivers/dri/i965/brw_program.c index 87d6bbadb28b..ff77c57c1393 100644 --- a/src/mesa/drivers/dri/i965/brw_program.c +++ b/src/mesa/drivers/dri/i965/brw_program.c @@ -62,15 +62,21 @@ static bool brw_nir_lower_uniforms(nir_shader *nir, bool is_scalar) { - if (is_scalar) { - nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms, - type_size_scalar_bytes); - return nir_lower_io(nir, nir_var_uniform, type_size_scalar_bytes, 0); - } else { - nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms, - type_size_vec4_bytes); - return nir_lower_io(nir, nir_var_uniform, type_size_vec4_bytes, 0); + int (*type_size)(const struct glsl_type *, bool) = + is_scalar ? type_size_scalar_bytes : type_size_vec4_bytes; + + nir_assign_var_locations(&nir->uniforms, &nir->num_uniforms, type_size); + + nir_foreach_function(function, nir) { + if (function->impl) { + nir_metadata_preserve(function->impl, nir->num_uniforms > 0, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); + } } + + return nir_lower_io(nir, nir_var_uniform, type_size, 0); } static struct gl_program *brwNewProgram(struct gl_context *ctx, GLenum target, -- GitLab From d3052355d9e214f75632b3bb847a754f48458769 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 12:16:59 -0500 Subject: [PATCH 10/22] anv/nir: Call nir_metadata_preserve more places --- src/intel/vulkan/anv_nir_lower_input_attachments.c | 14 +++++++++++--- src/intel/vulkan/anv_nir_lower_multiview.c | 4 +++- src/intel/vulkan/anv_nir_lower_push_constants.c | 7 +++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/intel/vulkan/anv_nir_lower_input_attachments.c b/src/intel/vulkan/anv_nir_lower_input_attachments.c index 9c6f9f434d75..c2b471761555 100644 --- a/src/intel/vulkan/anv_nir_lower_input_attachments.c +++ b/src/intel/vulkan/anv_nir_lower_input_attachments.c @@ -47,7 +47,7 @@ load_frag_coord(nir_builder *b) return nir_load_var(b, pos); } -static void +static bool try_lower_input_load(nir_function_impl *impl, nir_intrinsic_instr *load) { nir_deref_instr *deref = nir_src_as_deref(load->src[0]); @@ -56,7 +56,7 @@ try_lower_input_load(nir_function_impl *impl, nir_intrinsic_instr *load) enum glsl_sampler_dim image_dim = glsl_get_sampler_dim(deref->type); if (image_dim != GLSL_SAMPLER_DIM_SUBPASS && image_dim != GLSL_SAMPLER_DIM_SUBPASS_MS) - return; + return false; const bool multisampled = (image_dim == GLSL_SAMPLER_DIM_SUBPASS_MS); @@ -116,6 +116,8 @@ try_lower_input_load(nir_function_impl *impl, nir_intrinsic_instr *load) nir_ssa_def_rewrite_uses(&load->dest.ssa, nir_src_for_ssa(&tex->dest.ssa)); + + return true; } void @@ -127,6 +129,7 @@ anv_nir_lower_input_attachments(nir_shader *shader) if (!function->impl) continue; + bool progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -137,8 +140,13 @@ anv_nir_lower_input_attachments(nir_shader *shader) if (load->intrinsic != nir_intrinsic_image_deref_load) continue; - try_lower_input_load(function->impl, load); + if (try_lower_input_load(function->impl, load)) + progress = true; } } + + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } } diff --git a/src/intel/vulkan/anv_nir_lower_multiview.c b/src/intel/vulkan/anv_nir_lower_multiview.c index 7ae67cb56d70..b3e55b3b8a73 100644 --- a/src/intel/vulkan/anv_nir_lower_multiview.c +++ b/src/intel/vulkan/anv_nir_lower_multiview.c @@ -151,8 +151,10 @@ anv_nir_lower_multiview(nir_shader *shader, uint32_t view_mask) assert(shader->info.stage != MESA_SHADER_COMPUTE); /* If multiview isn't enabled, we have nothing to do. */ - if (view_mask == 0) + if (view_mask == 0) { + nir_shader_preserve_all_metadata(shader); return false; + } struct lower_multiview_state state = { .view_mask = view_mask, diff --git a/src/intel/vulkan/anv_nir_lower_push_constants.c b/src/intel/vulkan/anv_nir_lower_push_constants.c index ad60d0c824e9..f74e630a918b 100644 --- a/src/intel/vulkan/anv_nir_lower_push_constants.c +++ b/src/intel/vulkan/anv_nir_lower_push_constants.c @@ -30,6 +30,7 @@ anv_nir_lower_push_constants(nir_shader *shader) if (!function->impl) continue; + bool progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -43,7 +44,13 @@ anv_nir_lower_push_constants(nir_shader *shader) /* We just turn them into uniform loads */ intrin->intrinsic = nir_intrinsic_load_uniform; + progress = true; } } + + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); } } -- GitLab From 46aab8cccb6bdbe9407e11f5cb169880d246a863 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:17:15 -0500 Subject: [PATCH 11/22] nir: Require nir_metadata_preserve to be called --- src/compiler/nir/nir.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 0cc681e2393c..9e8bde3a87b7 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2989,7 +2989,9 @@ static inline bool should_print_nir(void) { return false; } printf("skipping %s\n", #pass); \ break; \ } \ + nir_metadata_set_validation_flag(nir); \ do_pass \ + nir_metadata_check_validation_flag(nir); \ nir_validate_shader(nir, "after " #pass); \ if (should_clone_nir()) { \ nir_shader *clone = nir_shader_clone(ralloc_parent(nir), nir); \ @@ -3001,14 +3003,12 @@ static inline bool should_print_nir(void) { return false; } } while (0) #define NIR_PASS(progress, nir, pass, ...) _PASS(pass, nir, \ - nir_metadata_set_validation_flag(nir); \ if (should_print_nir()) \ printf("%s\n", #pass); \ if (pass(nir, ##__VA_ARGS__)) { \ progress = true; \ if (should_print_nir()) \ nir_print_shader(nir, stdout); \ - nir_metadata_check_validation_flag(nir); \ } \ ) -- GitLab From 5a4b8671e9e4cc52a718c9db452d2a8c5addf7f6 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:34:22 -0500 Subject: [PATCH 12/22] nir/opt_undef: Track progress at the function granularity --- src/compiler/nir/nir_opt_undef.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/nir/nir_opt_undef.c b/src/compiler/nir/nir_opt_undef.c index 7408dad929e9..4cd4c7c7a95f 100644 --- a/src/compiler/nir/nir_opt_undef.c +++ b/src/compiler/nir/nir_opt_undef.c @@ -139,23 +139,26 @@ nir_opt_undef(nir_shader *shader) nir_foreach_function(function, shader) { if (function->impl) { nir_builder_init(&b, function->impl); + + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type == nir_instr_type_alu) { nir_alu_instr *alu = nir_instr_as_alu(instr); - progress = opt_undef_csel(alu) || progress; - progress = opt_undef_vecN(&b, alu) || progress; + impl_progress = opt_undef_csel(alu) || impl_progress; + impl_progress = opt_undef_vecN(&b, alu) || impl_progress; } else if (instr->type == nir_instr_type_intrinsic) { nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); - progress = opt_undef_store(intrin) || progress; + impl_progress = opt_undef_store(intrin) || impl_progress; } } } - nir_metadata_preserve(function->impl, progress, + nir_metadata_preserve(function->impl, impl_progress, nir_metadata_block_index | nir_metadata_dominance); + progress = progress || impl_progress; } } -- GitLab From 9d1b5be308ee60283ad490445901b6de8690ec90 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:35:18 -0500 Subject: [PATCH 13/22] nir/opt_move_comparisons: Track progress at the function granularity --- src/compiler/nir/nir_opt_move_comparisons.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir_opt_move_comparisons.c b/src/compiler/nir/nir_opt_move_comparisons.c index 200577d48021..93d26aca67a6 100644 --- a/src/compiler/nir/nir_opt_move_comparisons.c +++ b/src/compiler/nir/nir_opt_move_comparisons.c @@ -147,15 +147,17 @@ nir_opt_move_comparisons(nir_shader *shader) if (!func->impl) continue; + bool impl_progress = true; nir_foreach_block(block, func->impl) { if (move_comparisons(block)) - progress = true; + impl_progress = true; } - nir_metadata_preserve(func->impl, progress, + nir_metadata_preserve(func->impl, impl_progress, nir_metadata_block_index | nir_metadata_dominance | nir_metadata_live_ssa_defs); + progress = progress || impl_progress; } return progress; -- GitLab From cd68b1e3d37641bebf030964d10e5a0ee776affa Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:36:44 -0500 Subject: [PATCH 14/22] nir/opt_move_load_const: Track progress at the function granularity --- src/compiler/nir/nir_move_load_const.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir_move_load_const.c b/src/compiler/nir/nir_move_load_const.c index 378762945c4e..a68e978ac845 100644 --- a/src/compiler/nir/nir_move_load_const.c +++ b/src/compiler/nir/nir_move_load_const.c @@ -104,6 +104,7 @@ nir_move_load_const(nir_shader *shader) if (!function->impl) continue; + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_metadata_require(function->impl, nir_metadata_block_index | nir_metadata_dominance); @@ -129,13 +130,14 @@ nir_move_load_const(nir_shader *shader) load->instr.block = use_block; - progress = true; + impl_progress = true; } } - nir_metadata_preserve(function->impl, progress, + nir_metadata_preserve(function->impl, impl_progress, nir_metadata_block_index | nir_metadata_dominance); + progress = progress || impl_progress; } return progress; -- GitLab From 3e8f0f5eab78442578277a256bd2300a77848924 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:36:57 -0500 Subject: [PATCH 15/22] nir/opt_shrink_load: Track progress at the function granularity --- src/compiler/nir/nir_opt_shrink_load.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir_opt_shrink_load.c b/src/compiler/nir/nir_opt_shrink_load.c index c7a670846b77..301349620f41 100644 --- a/src/compiler/nir/nir_opt_shrink_load.c +++ b/src/compiler/nir/nir_opt_shrink_load.c @@ -50,18 +50,20 @@ nir_opt_shrink_load(nir_shader *shader) if (!function->impl) continue; + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr(instr, block) { if (instr->type != nir_instr_type_intrinsic) continue; - progress |= opt_shrink_load(nir_instr_as_intrinsic(instr)); + impl_progress |= opt_shrink_load(nir_instr_as_intrinsic(instr)); } } - nir_metadata_preserve(function->impl, progress, + nir_metadata_preserve(function->impl, impl_progress, nir_metadata_block_index | nir_metadata_dominance); + progress = progress || impl_progress; } return progress; -- GitLab From b9ed252ebb871ca83cc3735df27769a9f9311196 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 10:38:20 -0500 Subject: [PATCH 16/22] nir/uniforms_to_ubo: Track progress at the function granularity --- src/compiler/nir/nir_lower_uniforms_to_ubo.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/compiler/nir/nir_lower_uniforms_to_ubo.c b/src/compiler/nir/nir_lower_uniforms_to_ubo.c index 2d1b6d0d1175..f0522e883c1a 100644 --- a/src/compiler/nir/nir_lower_uniforms_to_ubo.c +++ b/src/compiler/nir/nir_lower_uniforms_to_ubo.c @@ -85,18 +85,21 @@ nir_lower_uniforms_to_ubo(nir_shader *shader, int multiplier) if (function->impl) { nir_builder builder; nir_builder_init(&builder, function->impl); + + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { - if (instr->type == nir_instr_type_intrinsic) - progress |= lower_instr(nir_instr_as_intrinsic(instr), - &builder, - multiplier); + if (instr->type == nir_instr_type_intrinsic && + lower_instr(nir_instr_as_intrinsic(instr), + &builder, multiplier)) + impl_progress = true; } } - nir_metadata_preserve(function->impl, progress, + nir_metadata_preserve(function->impl, impl_progress, nir_metadata_block_index | nir_metadata_dominance); + progress = progress || impl_progress; } } -- GitLab From 50500b76870fffd6345b4f988be6f4b295e13158 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 11:19:09 -0500 Subject: [PATCH 17/22] nir: Add infrastructure to validate pass progress --- src/compiler/nir/nir.h | 42 ++++++++++++++++++++++++++------ src/compiler/nir/nir_metadata.c | 27 +++++++++++++++++--- src/compiler/nir/nir_serialize.c | 20 +++++++++++++++ 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 9e8bde3a87b7..b04fa17eaa69 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2041,8 +2041,13 @@ typedef enum { nir_metadata_block_index = 0x1, nir_metadata_dominance = 0x2, nir_metadata_live_ssa_defs = 0x4, - nir_metadata_not_properly_reset = 0x8, - nir_metadata_loop_analysis = 0x10, + nir_metadata_loop_analysis = 0x8, + + /* These two metadata bits are for internal metadata tracking only and must + * not be passed into nir_metadata_require or nir_metadata_preserve. + */ + nir_metadata_not_properly_reset = 0x10, + nir_metadata_no_changes = 0x20, } nir_metadata; typedef struct { @@ -2516,6 +2521,7 @@ void nir_metadata_preserve(nir_function_impl *impl, bool impl_altered, nir_metadata preserved); void nir_metadata_preserve_all(nir_function_impl *impl); void nir_shader_preserve_all_metadata(nir_shader *shader); +bool nir_shader_metadata_claims_no_changes(nir_shader *shader); /** creates an instruction with default swizzle/writemask/etc. with NULL registers */ nir_alu_instr *nir_alu_instr_create(nir_shader *shader, nir_op op); @@ -2922,11 +2928,12 @@ nir_variable *nir_variable_clone(const nir_variable *c, nir_shader *shader); void nir_shader_replace(nir_shader *dest, nir_shader *src); void nir_shader_serialize_deserialize(nir_shader *s); +bool nir_shaders_are_identical(const nir_shader *a, const nir_shader *b); #ifndef NDEBUG void nir_validate_shader(nir_shader *shader, const char *when); -void nir_metadata_set_validation_flag(nir_shader *shader); -void nir_metadata_check_validation_flag(nir_shader *shader); +void nir_metadata_set_validation_flags(nir_shader *shader); +void nir_metadata_check_validation_flags(nir_shader *shader); static inline bool should_skip_nir(const char *name) @@ -2965,6 +2972,16 @@ should_serialize_deserialize_nir(void) return test_serialize; } +static inline bool +should_verify_no_progress_nir(void) +{ + static int test_progress = -1; + if (test_progress < 0) + test_progress = env_var_as_boolean("NIR_TEST_PROGRESS", false); + + return test_progress; +} + static inline bool should_print_nir(void) { @@ -2976,11 +2993,12 @@ should_print_nir(void) } #else static inline void nir_validate_shader(nir_shader *shader, const char *when) { (void) shader; (void)when; } -static inline void nir_metadata_set_validation_flag(nir_shader *shader) { (void) shader; } -static inline void nir_metadata_check_validation_flag(nir_shader *shader) { (void) shader; } +static inline void nir_metadata_set_validation_flags(nir_shader *shader) { (void) shader; } +static inline void nir_metadata_check_validation_flags(nir_shader *shader) { (void) shader; } static inline bool should_skip_nir(UNUSED const char *pass_name) { return false; } static inline bool should_clone_nir(void) { return false; } static inline bool should_serialize_deserialize_nir(void) { return false; } +static inline bool should_verify_no_progress_nir(void) { return false; } static inline bool should_print_nir(void) { return false; } #endif /* NDEBUG */ @@ -2989,9 +3007,17 @@ static inline bool should_print_nir(void) { return false; } printf("skipping %s\n", #pass); \ break; \ } \ - nir_metadata_set_validation_flag(nir); \ + nir_metadata_set_validation_flags(nir); \ + nir_shader *old_nir_clone = NULL; \ + if (should_verify_no_progress_nir()) \ + old_nir_clone = nir_shader_clone(ralloc_parent(nir), nir); \ do_pass \ - nir_metadata_check_validation_flag(nir); \ + if (should_verify_no_progress_nir() && \ + nir_shader_metadata_claims_no_changes(nir)) { \ + assert(nir_shaders_are_identical(nir, old_nir_clone)); \ + ralloc_free(old_nir_clone); \ + } \ + nir_metadata_check_validation_flags(nir); \ nir_validate_shader(nir, "after " #pass); \ if (should_clone_nir()) { \ nir_shader *clone = nir_shader_clone(ralloc_parent(nir), nir); \ diff --git a/src/compiler/nir/nir_metadata.c b/src/compiler/nir/nir_metadata.c index 4988b6b0328d..45529bb7ac90 100644 --- a/src/compiler/nir/nir_metadata.c +++ b/src/compiler/nir/nir_metadata.c @@ -33,6 +33,9 @@ void nir_metadata_require(nir_function_impl *impl, nir_metadata required, ...) { + assert(!(required & (nir_metadata_not_properly_reset | + nir_metadata_no_changes))); + #define NEEDS_UPDATE(X) ((required & ~impl->valid_metadata) & (X)) if (NEEDS_UPDATE(nir_metadata_block_index)) @@ -57,7 +60,8 @@ void nir_metadata_preserve(nir_function_impl *impl, bool impl_altered, nir_metadata preserved) { - assert(!(preserved & nir_metadata_not_properly_reset)); + assert(!(preserved & (nir_metadata_not_properly_reset | + nir_metadata_no_changes))); if (impl_altered) impl->valid_metadata &= preserved; @@ -80,6 +84,20 @@ nir_shader_preserve_all_metadata(nir_shader *shader) } } +bool +nir_shader_metadata_claims_no_changes(nir_shader *shader) +{ + nir_foreach_function(function, shader) { + if (!function->impl) + continue; + + if (!(function->impl->valid_metadata & nir_metadata_no_changes)) + return false; + } + + return true; +} + #ifndef NDEBUG /** * Make sure passes properly invalidate metadata (part 1). @@ -88,11 +106,12 @@ nir_shader_preserve_all_metadata(nir_shader *shader) * only be preserved if the pass forgets to call nir_metadata_preserve(). */ void -nir_metadata_set_validation_flag(nir_shader *shader) +nir_metadata_set_validation_flags(nir_shader *shader) { nir_foreach_function(function, shader) { if (function->impl) { - function->impl->valid_metadata |= nir_metadata_not_properly_reset; + function->impl->valid_metadata |= nir_metadata_not_properly_reset | + nir_metadata_no_changes; } } } @@ -105,7 +124,7 @@ nir_metadata_set_validation_flag(nir_shader *shader) * nir_metadata_preserve() if they don't actually make any changes at all. */ void -nir_metadata_check_validation_flag(nir_shader *shader) +nir_metadata_check_validation_flags(nir_shader *shader) { nir_foreach_function(function, shader) { if (function->impl) { diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c index 43a39ac1a5a9..ca5a6f59a66d 100644 --- a/src/compiler/nir/nir_serialize.c +++ b/src/compiler/nir/nir_serialize.c @@ -1227,3 +1227,23 @@ nir_shader_serialize_deserialize(nir_shader *shader) nir_shader_replace(shader, copy); ralloc_free(dead_ctx); } + +bool +nir_shaders_are_identical(const nir_shader *a, const nir_shader *b) +{ + struct blob blob_a; + blob_init(&blob_a); + nir_serialize(&blob_a, a); + + struct blob blob_b; + blob_init(&blob_b); + nir_serialize(&blob_b, b); + + bool identical = (blob_a.size == blob_b.size) && + (memcmp(blob_a.data, blob_b.data, blob_a.size) == 0); + + blob_finish(&blob_a); + blob_finish(&blob_b); + + return identical; +} -- GitLab From 1210e7bb881253a5eea2abee36e4f76a2d873b6b Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 15:14:11 -0500 Subject: [PATCH 18/22] iris: Call nir_metadata_preserve in lower_storage_image_derefs --- src/gallium/drivers/iris/iris_program.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c index 2712eb295910..a5d3b465d235 100644 --- a/src/gallium/drivers/iris/iris_program.c +++ b/src/gallium/drivers/iris/iris_program.c @@ -142,6 +142,7 @@ iris_lower_storage_image_derefs(nir_shader *nir) nir_builder b; nir_builder_init(&b, impl); + bool progress = false; nir_foreach_block(block, impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -171,6 +172,7 @@ iris_lower_storage_image_derefs(nir_shader *nir) nir_iadd(&b, nir_imm_int(&b, var->data.driver_location), get_aoa_deref_offset(&b, deref, 1)); nir_rewrite_image_intrinsic(intrin, index, false); + progress = true; break; } @@ -179,6 +181,10 @@ iris_lower_storage_image_derefs(nir_shader *nir) } } } + + nir_metadata_preserve(impl, progress, + nir_metadata_block_index | + nir_metadata_dominance); } // XXX: need unify_interfaces() at link time... -- GitLab From 702bf8688d875d6b42b062f5d751992dd5d8935c Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 15:15:08 -0500 Subject: [PATCH 19/22] st/nir: Preserve metadata in lower_wpos_ytransform --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index b40cb9223dfc..83b3bb9ae05f 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -755,8 +755,10 @@ st_nir_lower_wpos_ytransform(struct nir_shader *nir, struct gl_program *prog, struct pipe_screen *pscreen) { - if (nir->info.stage != MESA_SHADER_FRAGMENT) + if (nir->info.stage != MESA_SHADER_FRAGMENT) { + nir_shader_preserve_all_metadata(nir); return; + } static const gl_state_index16 wposTransformState[STATE_LENGTH] = { STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM -- GitLab From d2f2a87b71a01f2b76c2dfc85142d1406649f45a Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 15:21:06 -0500 Subject: [PATCH 20/22] st/nir: Use NIR_PASS_V for assign_varying_locations and lower_samplers We should treat these as real passes which pretty much just means re-ordering the arguments and making them flag metadata. --- src/mesa/state_tracker/st_glsl_to_nir.cpp | 23 ++++++++++++++++------- src/mesa/state_tracker/st_nir.h | 6 +++--- src/mesa/state_tracker/st_nir_builtins.c | 5 ++--- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 83b3bb9ae05f..f5056fe0d22a 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -903,13 +903,13 @@ st_link_nir(struct gl_context *ctx, } void -st_nir_assign_varying_locations(struct st_context *st, nir_shader *nir) +st_nir_assign_varying_locations(nir_shader *nir, struct st_context *st) { if (nir->info.stage == MESA_SHADER_VERTEX) { /* Needs special handling so drvloc matches the vbo state: */ st_nir_assign_vs_in_locations(nir); /* Re-lower global vars, to deal with any dead VS inputs. */ - NIR_PASS_V(nir, nir_lower_global_vars_to_local); + nir_lower_global_vars_to_local(nir); sort_varyings(&nir->outputs); st_nir_assign_var_locations(&nir->outputs, @@ -944,17 +944,26 @@ st_nir_assign_varying_locations(struct st_context *st, nir_shader *nir) } else { unreachable("invalid shader type"); } + + nir_foreach_function(function, nir) { + if (function->impl) { + nir_metadata_preserve(function->impl, true, + (nir_metadata)(nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs)); + } + } } void -st_nir_lower_samplers(struct pipe_screen *screen, nir_shader *nir, +st_nir_lower_samplers(nir_shader *nir, struct pipe_screen *screen, struct gl_shader_program *shader_program, struct gl_program *prog) { if (screen->get_param(screen, PIPE_CAP_NIR_SAMPLERS_AS_DEREF)) - NIR_PASS_V(nir, gl_nir_lower_samplers_as_deref, shader_program); + gl_nir_lower_samplers_as_deref(nir, shader_program); else - NIR_PASS_V(nir, gl_nir_lower_samplers, shader_program); + gl_nir_lower_samplers(nir, shader_program); if (prog) { prog->info.textures_used = nir->info.textures_used; @@ -984,7 +993,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, true); } - st_nir_assign_varying_locations(st, nir); + NIR_PASS_V(nir, st_nir_assign_varying_locations, st); NIR_PASS_V(nir, nir_lower_atomics_to_ssbo, st->ctx->Const.Program[nir->info.stage].MaxAtomicBuffers); @@ -1004,7 +1013,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, (nir_lower_io_options)0); } - st_nir_lower_samplers(screen, nir, shader_program, prog); + NIR_PASS_V(nir, st_nir_lower_samplers, screen, shader_program, prog); } } /* extern "C" */ diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index 94eae84402e2..2715456db4e9 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -51,10 +51,10 @@ bool st_link_nir(struct gl_context *ctx, struct gl_shader_program *shader_program); -void st_nir_assign_varying_locations(struct st_context *st, - struct nir_shader *nir); +void st_nir_assign_varying_locations(struct nir_shader *nir, + struct st_context *st); -void st_nir_lower_samplers(struct pipe_screen *screen, struct nir_shader *nir, +void st_nir_lower_samplers(struct nir_shader *nir, struct pipe_screen *screen, struct gl_shader_program *shader_program, struct gl_program *prog); diff --git a/src/mesa/state_tracker/st_nir_builtins.c b/src/mesa/state_tracker/st_nir_builtins.c index 01663b702ac2..0af44699e4b5 100644 --- a/src/mesa/state_tracker/st_nir_builtins.c +++ b/src/mesa/state_tracker/st_nir_builtins.c @@ -59,9 +59,8 @@ st_nir_finish_builtin_shader(struct st_context *st, nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir)); - st_nir_assign_varying_locations(st, nir); - - st_nir_lower_samplers(screen, nir, NULL, NULL); + NIR_PASS_V(nir, st_nir_assign_varying_locations, st); + NIR_PASS_V(nir, st_nir_lower_samplers, screen, NULL, NULL); if (st->ctx->Const.PackedDriverUniformStorage) { NIR_PASS_V(nir, nir_lower_io, nir_var_uniform, st_glsl_type_dword_size, -- GitLab From 9662c2b2bc904a8ec09f681ddce1d1e4d1c88160 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Fri, 24 May 2019 11:21:40 -0500 Subject: [PATCH 21/22] HACK: NIR_TEST_PROGRESS=true --- src/compiler/nir/nir.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index b04fa17eaa69..f7f266c45920 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2977,7 +2977,7 @@ should_verify_no_progress_nir(void) { static int test_progress = -1; if (test_progress < 0) - test_progress = env_var_as_boolean("NIR_TEST_PROGRESS", false); + test_progress = env_var_as_boolean("NIR_TEST_PROGRESS", true); return test_progress; } -- GitLab From a4ee07139f57832843adc35325497522ac8658b7 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 30 May 2019 21:59:29 -0500 Subject: [PATCH 22/22] preserve more metadata --- src/compiler/nir/nir_linking_helpers.c | 9 ++++++++ .../nir/nir_lower_io_arrays_to_elements.c | 13 ++++++++++-- src/compiler/nir/nir_lower_io_to_scalar.c | 21 +++++++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/compiler/nir/nir_linking_helpers.c b/src/compiler/nir/nir_linking_helpers.c index faf8a1eaced1..756bc4794952 100644 --- a/src/compiler/nir/nir_linking_helpers.c +++ b/src/compiler/nir/nir_linking_helpers.c @@ -159,6 +159,15 @@ nir_remove_unused_io_vars(nir_shader *shader, struct exec_list *var_list, if (progress) nir_fixup_deref_modes(shader); + nir_foreach_function(function, shader) { + if (function->impl) { + nir_metadata_preserve(function->impl, progress, + nir_metadata_block_index | + nir_metadata_dominance | + nir_metadata_live_ssa_defs); + } + } + return progress; } diff --git a/src/compiler/nir/nir_lower_io_arrays_to_elements.c b/src/compiler/nir/nir_lower_io_arrays_to_elements.c index 7f548c8b6544..efcdf25199d3 100644 --- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c +++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c @@ -271,6 +271,7 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask, nir_builder b; nir_builder_init(&b, function->impl); + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -339,15 +340,23 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask, case nir_intrinsic_interp_deref_at_offset: case nir_intrinsic_load_deref: case nir_intrinsic_store_deref: - if ((mask & nir_var_shader_in && mode == nir_var_shader_in) || - (mask & nir_var_shader_out && mode == nir_var_shader_out)) + if ((mask & nir_var_shader_in && + mode == nir_var_shader_in) || + (mask & nir_var_shader_out && + mode == nir_var_shader_out)) { lower_array(&b, intr, var, varyings); + impl_progress = true; + } break; default: break; } } } + + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); } } } diff --git a/src/compiler/nir/nir_lower_io_to_scalar.c b/src/compiler/nir/nir_lower_io_to_scalar.c index 1277a8a73734..fb0965707d49 100644 --- a/src/compiler/nir/nir_lower_io_to_scalar.c +++ b/src/compiler/nir/nir_lower_io_to_scalar.c @@ -103,6 +103,7 @@ nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask) nir_builder b; nir_builder_init(&b, function->impl); + bool impl_progress = false; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { if (instr->type != nir_instr_type_intrinsic) @@ -115,18 +116,26 @@ nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask) switch (intr->intrinsic) { case nir_intrinsic_load_input: - if (mask & nir_var_shader_in) + if (mask & nir_var_shader_in) { lower_load_input_to_scalar(&b, intr); + impl_progress = true; + } break; case nir_intrinsic_store_output: - if (mask & nir_var_shader_out) + if (mask & nir_var_shader_out) { lower_store_output_to_scalar(&b, intr); + impl_progress = true; + } break; default: break; } } } + + nir_metadata_preserve(function->impl, impl_progress, + nir_metadata_block_index | + nir_metadata_dominance); } } } @@ -386,6 +395,14 @@ nir_lower_io_to_scalar_early(nir_shader *shader, nir_variable_mode mask) free(entry->data); } + nir_foreach_function(function, shader) { + if (function->impl) { + nir_metadata_preserve(function->impl, true, + nir_metadata_block_index | + nir_metadata_dominance); + } + } + _mesa_hash_table_destroy(split_inputs, NULL); _mesa_hash_table_destroy(split_outputs, NULL); -- GitLab