diff --git a/src/intel/compiler/meson.build b/src/intel/compiler/meson.build index 0c9d0c215a3..32297306f19 100644 --- a/src/intel/compiler/meson.build +++ b/src/intel/compiler/meson.build @@ -218,6 +218,7 @@ if with_tests 'test_opt_combine_constants.cpp', 'test_opt_copy_propagation.cpp', 'test_opt_cse.cpp', + 'test_opt_register_coalesce.cpp', 'test_opt_saturate_propagation.cpp', 'test_simd_selection.cpp', 'test_vf_float_conversions.cpp', diff --git a/src/intel/compiler/test_opt_register_coalesce.cpp b/src/intel/compiler/test_opt_register_coalesce.cpp new file mode 100644 index 00000000000..840ef10c0ce --- /dev/null +++ b/src/intel/compiler/test_opt_register_coalesce.cpp @@ -0,0 +1,86 @@ +/* + * Copyright © 2025 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#include "test_helpers.h" +#include "brw_builder.h" + +class RegisterCoalesceTest : public brw_shader_pass_test {}; + +TEST_F(RegisterCoalesceTest, BasicMov) +{ + brw_builder bld = make_shader(); + brw_builder exp = make_shader(); + + brw_reg a = vgrf(bld, exp, BRW_TYPE_F); + brw_reg b = vgrf(bld, exp, BRW_TYPE_F); + brw_reg c = vgrf(bld, exp, BRW_TYPE_F); + brw_reg i = brw_imm_f(42.0); + + brw_reg x = vgrf(bld, exp, BRW_TYPE_F); + brw_reg y = vgrf(bld, exp, BRW_TYPE_F); + + bld.ADD(x, a, b); + bld.MOV(y, x); + bld.MUL(c, y, i); + + EXPECT_PROGRESS(brw_opt_register_coalesce, bld); + + exp.ADD(x, a, b); + exp.MUL(c, x, i); + + EXPECT_SHADERS_MATCH(bld, exp); +} + +TEST_F(RegisterCoalesceTest, RegistersInterfere) +{ + brw_builder bld = make_shader(); + + brw_reg a = vgrf(bld, BRW_TYPE_F); + brw_reg b = vgrf(bld, BRW_TYPE_F); + brw_reg c = vgrf(bld, BRW_TYPE_F); + brw_reg d = vgrf(bld, BRW_TYPE_F); + brw_reg i = brw_imm_f(42.0); + + brw_reg x = vgrf(bld, BRW_TYPE_F); + brw_reg y = vgrf(bld, BRW_TYPE_F); + + bld.ADD(x, a, b); + bld.MOV(y, x); + bld.ADD(x, x, x); + bld.MUL(c, y, i); + bld.ADD(d, y, y); + + EXPECT_NO_PROGRESS(brw_opt_register_coalesce, bld); +} + +TEST_F(RegisterCoalesceTest, InterfereButContainEachOther) +{ + brw_builder bld = make_shader(); + brw_builder exp = make_shader(); + + brw_reg a = vgrf(bld, exp, BRW_TYPE_F); + brw_reg b = vgrf(bld, exp, BRW_TYPE_F); + brw_reg c = vgrf(bld, exp, BRW_TYPE_F); + brw_reg d = vgrf(bld, exp, BRW_TYPE_F); + brw_reg e = vgrf(bld, exp, BRW_TYPE_F); + + brw_reg x = vgrf(bld, exp, BRW_TYPE_F); + brw_reg y = vgrf(bld, exp, BRW_TYPE_F); + + bld.MUL(x, a, b); + bld.ADD(c, x, x); + bld.ADD(d, x, x); + bld.MOV(y, x); + bld.ADD(e, x, y); + + EXPECT_PROGRESS(brw_opt_register_coalesce, bld); + + exp.MUL(x, a, b); + exp.ADD(c, x, x); + exp.ADD(d, x, x); + exp.ADD(e, x, x); + + EXPECT_SHADERS_MATCH(bld, exp); +}