diff --git a/src/amd/compiler/tests/helpers.cpp b/src/amd/compiler/tests/helpers.cpp index 024116a6b61..ed15e35eb75 100644 --- a/src/amd/compiler/tests/helpers.cpp +++ b/src/amd/compiler/tests/helpers.cpp @@ -169,7 +169,7 @@ void finish_opt_test() aco_print_program(program.get(), output); } -void finish_ra_test(ra_test_policy policy) +void finish_ra_test(ra_test_policy policy, bool lower) { finish_program(program.get()); if (!aco::validate_ir(program.get())) { @@ -186,6 +186,11 @@ void finish_ra_test(ra_test_policy policy) return; } + if (lower) { + aco::ssa_elimination(program.get()); + aco::lower_to_hw_instr(program.get()); + } + aco_print_program(program.get(), output); } diff --git a/src/amd/compiler/tests/helpers.h b/src/amd/compiler/tests/helpers.h index ee3e68da389..7299939f327 100644 --- a/src/amd/compiler/tests/helpers.h +++ b/src/amd/compiler/tests/helpers.h @@ -79,7 +79,7 @@ bool setup_cs(const char *input_spec, enum chip_class chip_class, void finish_program(aco::Program *program); void finish_validator_test(); void finish_opt_test(); -void finish_ra_test(aco::ra_test_policy); +void finish_ra_test(aco::ra_test_policy, bool lower=false); void finish_optimizer_postRA_test(); void finish_to_hw_instr_test(); void finish_insert_nops_test(); diff --git a/src/amd/compiler/tests/test_regalloc.cpp b/src/amd/compiler/tests/test_regalloc.cpp index 4fa58ff0048..4793bb08994 100644 --- a/src/amd/compiler/tests/test_regalloc.cpp +++ b/src/amd/compiler/tests/test_regalloc.cpp @@ -147,3 +147,40 @@ BEGIN_TEST(regalloc.precolor.vector.collect) finish_ra_test(ra_test_policy()); END_TEST + +BEGIN_TEST(regalloc.scratch_sgpr.create_vector) + if (!setup_cs("v1 s1", GFX7)) + return; + + Temp tmp = bld.pseudo(aco_opcode::p_extract_vector, bld.def(v1b), inputs[0], Operand::zero()); + + //>> v3b: %0:v[0][0:24] = v_and_b32 0xffffff, %0:v[0][0:24] + //! s1: %0:s[1] = s_mov_b32 0x1000001 + //! v1: %0:v[0] = v_mul_lo_u32 %0:s[1], %_:v[0][0:8] + bld.pseudo(aco_opcode::p_create_vector, bld.def(v1), Operand(v3b), Operand(tmp)); + + //! p_unit_test %_:s[0] + //! s_endpgm + bld.pseudo(aco_opcode::p_unit_test, inputs[1]); + + finish_ra_test(ra_test_policy(), true); +END_TEST + +BEGIN_TEST(regalloc.scratch_sgpr.create_vector_sgpr_operand) + if (!setup_cs("v2 s1", GFX7)) + return; + + Temp tmp = bld.pseudo(aco_opcode::p_extract_vector, bld.def(v1b), inputs[0], Operand::c32(4u)); + + //>> v1: %0:v[0] = v_mov_b32 %_:s[0] + //! v3b: %0:v[1][0:24] = v_and_b32 0xffffff, %0:v[1][0:24] + //! s1: %0:s[1] = s_mov_b32 0x1000001 + //! v1: %0:v[1] = v_mul_lo_u32 %0:s[1], %_:v[1][0:8] + bld.pseudo(aco_opcode::p_create_vector, bld.def(v2), inputs[1], Operand(v3b), Operand(tmp)); + + //! p_unit_test %_:s[0] + //! s_endpgm + bld.pseudo(aco_opcode::p_unit_test, inputs[1]); + + finish_ra_test(ra_test_policy(), true); +END_TEST