diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp index de24174d0ed..2f23cee5d7a 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir_legalize_image_load_store.cpp @@ -10,6 +10,10 @@ #include "nir_intrinsics_indices.h" #include "sfn_nir.h" +enum legalize_image_load_store_pass_flags { + FLAG_LEGALIZE_DONE = BITFIELD_BIT(7), +}; + static nir_def * r600_legalize_image_load_store_impl(nir_builder *b, nir_instr *instr, @@ -113,6 +117,7 @@ r600_legalize_image_load_store_impl(nir_builder *b, auto new_load_ir = nir_instr_as_intrinsic(new_load); nir_builder_instr_insert(b, new_load); + new_load_ir->instr.pass_flags |= FLAG_LEGALIZE_DONE; if (load_value) result = &new_load_ir->def; @@ -137,10 +142,12 @@ r600_legalize_image_load_store_impl(nir_builder *b, if (load_value) result = nir_if_phi(b, result, default_value); - if (load_value) - b->cursor = nir_after_instr(result->parent_instr); - else + { + nir_cf_list cf_list; + nir_cf_extract(&cf_list, nir_before_instr(instr), nir_after_instr(instr)); + nir_cf_reinsert(&cf_list, nir_before_block(nir_if_first_then_block(if_exists))); b->cursor = nir_after_cf_node(&else_exists->cf_node); + } return result; } @@ -158,7 +165,7 @@ r600_legalize_image_load_store_filter(const nir_instr *instr, UNUSED const void case nir_intrinsic_image_atomic: case nir_intrinsic_image_atomic_swap: case nir_intrinsic_image_size: - return true; + return (instr->pass_flags & FLAG_LEGALIZE_DONE) ? false : true; default: return false; }