blob: 57aa78a4be730ea4a9892375bc2c6b1f49654894 [file] [log] [blame]
/*
* 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);
}
TEST_F(RegisterCoalesceTest, ChangingTemporaryCompoundRegisterNotChangesOriginal)
{
brw_builder bld = make_shader();
brw_reg src = vgrf(bld, BRW_TYPE_F, 2);
brw_reg tmp = vgrf(bld, BRW_TYPE_F, 2);
brw_reg dst = vgrf(bld, BRW_TYPE_F, 2);
brw_reg one = brw_imm_f(1.0);
brw_reg two = brw_imm_f(2.0);
bld.MOV(src, one);
bld.MOV(offset(src, bld, 1), two);
bld.MOV(offset(tmp, bld, 1), offset(src, bld, 1));
bld.MOV(tmp, src);
bld.ADD(offset(tmp, bld, 1), offset(tmp, bld, 1), one);
bld.ADD(dst, src, one);
bld.ADD(offset(dst, bld, 1), offset(src, bld, 1), two);
EXPECT_NO_PROGRESS(brw_opt_register_coalesce, bld);
}
TEST_F(RegisterCoalesceTest, MovWithFlagRegisterWrite)
{
brw_builder bld = make_shader(MESA_SHADER_COMPUTE, 16);
brw_builder exp = make_shader(MESA_SHADER_COMPUTE, 16);
/**
* mul.sat(16) %789:F, %787:F, %788:F
* mov.g.f0.0(16) %790:F, %789:F
* (+f0.0) sel(16) %800:UD, %790:UD, 0u
*/
brw_reg src0 = vgrf(bld, exp, BRW_TYPE_F);
brw_reg src1 = vgrf(bld, exp, BRW_TYPE_F);
brw_reg vgrf0 = vgrf(bld, exp, BRW_TYPE_F);
brw_reg vgrf1 = vgrf(bld, exp, BRW_TYPE_F);
brw_reg vgrf2 = vgrf(bld, exp, BRW_TYPE_F);
{
brw_inst *mul = bld.MUL(vgrf0, src0, src1);
mul->saturate = true;
brw_inst *mov = bld.MOV(vgrf1, vgrf0);
mov->conditional_mod = BRW_CONDITIONAL_G;
brw_inst *sel = bld.SEL(vgrf2, vgrf1, brw_imm_f(0.0));
sel->predicate = BRW_PREDICATE_NORMAL;
}
EXPECT_PROGRESS(brw_opt_register_coalesce, bld);
/**
* mul.sat(16) %789:F, %787:F, %788:F
* mov.g.f0.0(16) null:F, %789:F
* (+f0.0) sel(16) %800:UD, %789:UD, 0u
*/
{
brw_inst *mul = exp.MUL(vgrf0, src0, src1);
mul->saturate = true;
brw_inst *mov = exp.MOV(brw_null_reg(), vgrf0);
mov->conditional_mod = BRW_CONDITIONAL_G;
brw_inst *sel = exp.SEL(vgrf2, vgrf0, brw_imm_f(0.0));
sel->predicate = BRW_PREDICATE_NORMAL;
}
EXPECT_SHADERS_MATCH(bld, exp);
}