diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 49bbc90a4f7..24e7de586cc 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -9341,6 +9341,15 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) break; } case nir_intrinsic_cmat_muladd_amd: visit_cmat_muladd(ctx, instr); break; + case nir_intrinsic_unit_test_amd: + bld.pseudo(aco_opcode::p_unit_test, Operand::c32(nir_intrinsic_base(instr)), + get_ssa_temp(ctx, instr->src[0].ssa)); + break; + case nir_intrinsic_unit_test_uniform_amd: + case nir_intrinsic_unit_test_divergent_amd: + bld.pseudo(aco_opcode::p_unit_test, Definition(get_ssa_temp(ctx, &instr->def)), + Operand::c32(nir_intrinsic_base(instr))); + break; default: isel_err(&instr->instr, "Unimplemented intrinsic instr"); abort(); diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp index c8f1ecdd304..ba45464d063 100644 --- a/src/amd/compiler/aco_instruction_selection_setup.cpp +++ b/src/amd/compiler/aco_instruction_selection_setup.cpp @@ -461,7 +461,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_load_scalar_arg_amd: case nir_intrinsic_load_lds_ngg_scratch_base_amd: case nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd: - case nir_intrinsic_load_smem_amd: type = RegType::sgpr; break; + case nir_intrinsic_load_smem_amd: + case nir_intrinsic_unit_test_uniform_amd: type = RegType::sgpr; break; case nir_intrinsic_load_sample_id: case nir_intrinsic_load_input: case nir_intrinsic_load_output: @@ -507,7 +508,8 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_load_vector_arg_amd: case nir_intrinsic_load_rt_dynamic_callable_stack_base_amd: case nir_intrinsic_ordered_xfb_counter_add_gfx11_amd: - case nir_intrinsic_cmat_muladd_amd: type = RegType::vgpr; break; + case nir_intrinsic_cmat_muladd_amd: + case nir_intrinsic_unit_test_divergent_amd: type = RegType::vgpr; break; case nir_intrinsic_load_shared: case nir_intrinsic_load_shared2_amd: /* When the result of these loads is only used by cross-lane instructions, diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 870ae307fba..a9be926d7cc 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -231,6 +231,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_barycentric_optimize_amd: case nir_intrinsic_load_poly_line_smooth_enabled: case nir_intrinsic_load_rasterization_primitive_amd: + case nir_intrinsic_unit_test_uniform_amd: case nir_intrinsic_load_global_constant_uniform_block_intel: case nir_intrinsic_load_debug_log_desc_amd: case nir_intrinsic_cmat_length: @@ -637,6 +638,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_scratch_base_ptr: case nir_intrinsic_ordered_xfb_counter_add_gfx11_amd: case nir_intrinsic_xfb_counter_sub_gfx11_amd: + case nir_intrinsic_unit_test_divergent_amd: case nir_intrinsic_load_stack: case nir_intrinsic_load_ray_launch_id: case nir_intrinsic_load_ray_instance_custom_index: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 5e4e1a6a219..1317baafd5d 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1457,6 +1457,11 @@ store("tf_r600", []) intrinsic("optimization_barrier_vgpr_amd", dest_comp=0, src_comp=[0], flags=[CAN_ELIMINATE]) +# These are no-op intrinsics used as a simple source and user of SSA defs for testing. +intrinsic("unit_test_amd", src_comp=[0], indices=[BASE]) +intrinsic("unit_test_uniform_amd", dest_comp=0, indices=[BASE]) +intrinsic("unit_test_divergent_amd", dest_comp=0, indices=[BASE]) + # Untyped buffer load/store instructions of arbitrary length. # src[] = { descriptor, vector byte offset, scalar byte offset, index offset } # The index offset is multiplied by the stride in the descriptor.