diff --git a/src/compiler/nir/nir_opt_move.c b/src/compiler/nir/nir_opt_move.c index efdf344697b..9a3cb95b96d 100644 --- a/src/compiler/nir/nir_opt_move.c +++ b/src/compiler/nir/nir_opt_move.c @@ -71,8 +71,18 @@ nir_opt_move_block(nir_block *block, nir_move_options options) instr->index = index++; /* Check if this instruction can be moved downwards */ - if (!nir_can_move_instr(instr, options)) + if (!nir_can_move_instr(instr, options)) { + if (instr->type == nir_instr_type_intrinsic) { + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); + if (intrin->intrinsic == nir_intrinsic_export_amd || + intrin->intrinsic == nir_intrinsic_export_row_amd || + intrin->intrinsic == nir_intrinsic_begin_invocation_interlock) { + /* Moving past these increases a critical section. */ + last_instr = instr; + } + } continue; + } /* Check all users in this block which is the first */ const nir_def *def = nir_instr_def(instr);