diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index 898dbb25133..6602a405add 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -1697,6 +1697,7 @@ nir_decl_reg(nir_builder *b, unsigned num_components, unsigned bit_size, nir_intrinsic_set_num_components(decl, num_components); nir_intrinsic_set_bit_size(decl, bit_size); nir_intrinsic_set_num_array_elems(decl, num_array_elems); + nir_intrinsic_set_divergent(decl, true); nir_ssa_dest_init(&decl->instr, &decl->dest, 1, 32); nir_instr_insert(nir_before_cf_list(&b->impl->body), &decl->instr); @@ -1712,7 +1713,10 @@ nir_load_reg(nir_builder *b, nir_ssa_def *reg) unsigned num_components = nir_intrinsic_num_components(decl); unsigned bit_size = nir_intrinsic_bit_size(decl); - return nir_build_load_reg(b, num_components, bit_size, reg); + nir_ssa_def *res = nir_build_load_reg(b, num_components, bit_size, reg); + res->divergent = nir_intrinsic_divergent(decl); + + return res; } #undef nir_store_reg diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 091050dde4c..9c0f2d2de52 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -218,6 +218,15 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr) is_divergent = false; break; + case nir_intrinsic_load_reg: + case nir_intrinsic_load_reg_indirect: { + nir_intrinsic_instr *decl = nir_reg_get_decl(instr->src[0].ssa); + is_divergent = nir_intrinsic_divergent(decl); + if (instr->intrinsic == nir_intrinsic_load_reg_indirect) + is_divergent |= instr->src[1].ssa->divergent; + break; + } + /* Intrinsics with divergence depending on shader stage and hardware */ case nir_intrinsic_load_shader_record_ptr: is_divergent = !(options & nir_divergence_shader_record_ptr_uniform);