intel/fs: Refactor some cmod propagation tests

This will simplify some later changes to these tests.

v2: Combine test_positive_saturate_prop and test_negative_saturate_prop
into a single function.  Suggested by Marcin.

Reviewed-by: Marcin Ślusarz <marcin.slusarz@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12045>
This commit is contained in:
Ian Romanick 2021-07-21 13:56:34 -07:00
parent 66fa676e8d
commit 3afefb0818

View file

@ -40,15 +40,12 @@ public:
struct gl_shader_program *shader_prog;
fs_visitor *v;
void test_positive_float_saturate_prop(enum brw_conditional_mod before,
enum brw_conditional_mod after,
enum opcode op);
void test_negative_float_saturate_prop(enum brw_conditional_mod before,
enum opcode op);
void test_negative_int_saturate_prop(enum brw_conditional_mod before,
enum opcode op);
void test_saturate_prop(enum brw_conditional_mod before,
enum brw_conditional_mod after,
enum opcode op,
enum brw_reg_type add_type,
enum brw_reg_type op_type,
bool expected_cmod_prop_progress);
};
class cmod_propagation_fs_visitor : public fs_visitor
@ -1504,22 +1501,31 @@ TEST_F(cmod_propagation_test, signed_unsigned_comparison_mismatch)
}
void
cmod_propagation_test::test_positive_float_saturate_prop(enum brw_conditional_mod before,
enum brw_conditional_mod after,
enum opcode op)
cmod_propagation_test::test_saturate_prop(enum brw_conditional_mod before,
enum brw_conditional_mod after,
enum opcode op,
enum brw_reg_type add_type,
enum brw_reg_type op_type,
bool expected_cmod_prop_progress)
{
const fs_builder &bld = v->bld;
fs_reg dest = v->vgrf(glsl_type::float_type);
fs_reg src0 = v->vgrf(glsl_type::float_type);
fs_reg src1 = v->vgrf(glsl_type::float_type);
fs_reg zero(brw_imm_f(0.0f));
fs_reg dest = bld.vgrf(add_type);
fs_reg src0 = bld.vgrf(add_type);
fs_reg src1 = bld.vgrf(add_type);
fs_reg zero(brw_imm_ud(0));
bld.ADD(dest, src0, src1)->saturate = true;
assert(op == BRW_OPCODE_CMP || op == BRW_OPCODE_MOV);
if (op == BRW_OPCODE_CMP)
bld.CMP(bld.null_reg_f(), dest, zero, before);
else
bld.MOV(bld.null_reg_f(), dest)->conditional_mod = before;
if (op == BRW_OPCODE_CMP) {
bld.CMP(bld.vgrf(op_type, 0),
retype(dest, op_type),
retype(zero, op_type),
before);
} else {
bld.MOV(bld.vgrf(op_type, 0), retype(dest, op_type))
->conditional_mod = before;
}
v->calculate_cfg();
bblock_t *block0 = v->cfg->blocks[0];
@ -1527,80 +1533,31 @@ cmod_propagation_test::test_positive_float_saturate_prop(enum brw_conditional_mo
EXPECT_EQ(0, block0->start_ip);
EXPECT_EQ(1, block0->end_ip);
EXPECT_TRUE(cmod_propagation(v));
EXPECT_EQ(expected_cmod_prop_progress, cmod_propagation(v));
EXPECT_EQ(0, block0->start_ip);
EXPECT_EQ(0, block0->end_ip);
EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
EXPECT_EQ(add_type, instruction(block0, 0)->dst.type);
EXPECT_EQ(add_type, instruction(block0, 0)->src[0].type);
EXPECT_EQ(add_type, instruction(block0, 0)->src[1].type);
EXPECT_TRUE(instruction(block0, 0)->saturate);
EXPECT_EQ(after, instruction(block0, 0)->conditional_mod);
}
void
cmod_propagation_test::test_negative_float_saturate_prop(enum brw_conditional_mod before,
enum opcode op)
{
const fs_builder &bld = v->bld;
fs_reg dest = v->vgrf(glsl_type::float_type);
fs_reg src0 = v->vgrf(glsl_type::float_type);
fs_reg src1 = v->vgrf(glsl_type::float_type);
fs_reg zero(brw_imm_f(0.0f));
bld.ADD(dest, src0, src1)->saturate = true;
if (expected_cmod_prop_progress) {
EXPECT_EQ(0, block0->end_ip);
EXPECT_EQ(after, instruction(block0, 0)->conditional_mod);
} else {
EXPECT_EQ(BRW_CONDITIONAL_NONE, instruction(block0, 0)->conditional_mod);
assert(op == BRW_OPCODE_CMP || op == BRW_OPCODE_MOV);
if (op == BRW_OPCODE_CMP)
bld.CMP(bld.null_reg_f(), dest, zero, before);
else
bld.MOV(bld.null_reg_f(), dest)->conditional_mod = before;
v->calculate_cfg();
bblock_t *block0 = v->cfg->blocks[0];
EXPECT_EQ(0, block0->start_ip);
EXPECT_EQ(1, block0->end_ip);
EXPECT_FALSE(cmod_propagation(v));
EXPECT_EQ(0, block0->start_ip);
EXPECT_EQ(1, block0->end_ip);
EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
EXPECT_TRUE(instruction(block0, 0)->saturate);
EXPECT_EQ(BRW_CONDITIONAL_NONE, instruction(block0, 0)->conditional_mod);
EXPECT_EQ(op, instruction(block0, 1)->opcode);
EXPECT_FALSE(instruction(block0, 1)->saturate);
EXPECT_EQ(before, instruction(block0, 1)->conditional_mod);
}
void
cmod_propagation_test::test_negative_int_saturate_prop(enum brw_conditional_mod before,
enum opcode op)
{
const fs_builder &bld = v->bld;
fs_reg dest = v->vgrf(glsl_type::int_type);
fs_reg src0 = v->vgrf(glsl_type::int_type);
fs_reg src1 = v->vgrf(glsl_type::int_type);
fs_reg zero(brw_imm_d(0));
bld.ADD(dest, src0, src1)->saturate = true;
assert(op == BRW_OPCODE_CMP || op == BRW_OPCODE_MOV);
if (op == BRW_OPCODE_CMP)
bld.CMP(bld.null_reg_d(), dest, zero, before);
else
bld.MOV(bld.null_reg_d(), dest)->conditional_mod = before;
v->calculate_cfg();
bblock_t *block0 = v->cfg->blocks[0];
EXPECT_EQ(0, block0->start_ip);
EXPECT_EQ(1, block0->end_ip);
EXPECT_FALSE(cmod_propagation(v));
EXPECT_EQ(0, block0->start_ip);
EXPECT_EQ(1, block0->end_ip);
EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
EXPECT_TRUE(instruction(block0, 0)->saturate);
EXPECT_EQ(BRW_CONDITIONAL_NONE, instruction(block0, 0)->conditional_mod);
EXPECT_EQ(op, instruction(block0, 1)->opcode);
EXPECT_FALSE(instruction(block0, 1)->saturate);
EXPECT_EQ(before, instruction(block0, 1)->conditional_mod);
/* This is ASSERT_EQ because if end_ip is 0, the instruction(block0, 1)
* calls will not work properly, and the test will give weird results.
*/
ASSERT_EQ(1, block0->end_ip);
EXPECT_EQ(op, instruction(block0, 1)->opcode);
EXPECT_EQ(op_type, instruction(block0, 1)->dst.type);
EXPECT_EQ(op_type, instruction(block0, 1)->src[0].type);
EXPECT_FALSE(instruction(block0, 1)->saturate);
EXPECT_EQ(before, instruction(block0, 1)->conditional_mod);
}
}
TEST_F(cmod_propagation_test, float_saturate_nz_cmp)
@ -1616,8 +1573,10 @@ TEST_F(cmod_propagation_test, float_saturate_nz_cmp)
* = After =
* 0: add.sat.g.f0(8) dest src0 src1
*/
test_positive_float_saturate_prop(BRW_CONDITIONAL_NZ, BRW_CONDITIONAL_G,
BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_NZ, BRW_CONDITIONAL_G,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
}
TEST_F(cmod_propagation_test, float_saturate_nz_mov)
@ -1633,8 +1592,10 @@ TEST_F(cmod_propagation_test, float_saturate_nz_mov)
* = After =
* 0: add.sat.g.f0(8) dest src0 src1
*/
test_positive_float_saturate_prop(BRW_CONDITIONAL_NZ, BRW_CONDITIONAL_G,
BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_NZ, BRW_CONDITIONAL_G,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
}
TEST_F(cmod_propagation_test, float_saturate_z_cmp)
@ -1650,8 +1611,10 @@ TEST_F(cmod_propagation_test, float_saturate_z_cmp)
* = After =
* 0: add.sat.le.f0(8) dest src0 src1
*/
test_positive_float_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_LE,
BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_LE,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
}
TEST_F(cmod_propagation_test, float_saturate_z_mov)
@ -1669,10 +1632,15 @@ TEST_F(cmod_propagation_test, float_saturate_z_mov)
*/
#if 1
/* cmod propagation bails on every MOV except MOV.NZ. */
test_negative_float_saturate_prop(BRW_CONDITIONAL_Z, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_Z,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
#else
test_positive_float_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_LE,
BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_LE,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
#endif
}
@ -1689,8 +1657,10 @@ TEST_F(cmod_propagation_test, float_saturate_g_cmp)
* = After =
* 0: add.sat.g.f0(8) dest src0 src1
*/
test_positive_float_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
}
TEST_F(cmod_propagation_test, float_saturate_g_mov)
@ -1708,10 +1678,15 @@ TEST_F(cmod_propagation_test, float_saturate_g_mov)
*/
#if 1
/* cmod propagation bails on every MOV except MOV.NZ. */
test_negative_float_saturate_prop(BRW_CONDITIONAL_G, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
#else
test_positive_float_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
#endif
}
@ -1728,8 +1703,10 @@ TEST_F(cmod_propagation_test, float_saturate_le_cmp)
* = After =
* 0: add.sat.le.f0(8) dest src0 src1
*/
test_positive_float_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
}
TEST_F(cmod_propagation_test, float_saturate_le_mov)
@ -1747,10 +1724,15 @@ TEST_F(cmod_propagation_test, float_saturate_le_mov)
*/
#if 1
/* cmod propagation bails on every MOV except MOV.NZ. */
test_negative_float_saturate_prop(BRW_CONDITIONAL_LE, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
#else
test_positive_float_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
true);
#endif
}
@ -1767,7 +1749,10 @@ TEST_F(cmod_propagation_test, float_saturate_l_cmp)
* = After =
* No change
*/
test_negative_float_saturate_prop(BRW_CONDITIONAL_L, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_L, BRW_CONDITIONAL_L,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
}
#if 0
@ -1784,7 +1769,10 @@ TEST_F(cmod_propagation_test, float_saturate_l_mov)
* = After =
* No change
*/
test_negative_float_saturate_prop(BRW_CONDITIONAL_L, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_L, BRW_CONDITIONAL_L,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
}
#endif
@ -1801,7 +1789,10 @@ TEST_F(cmod_propagation_test, float_saturate_ge_cmp)
* = After =
* No change
*/
test_negative_float_saturate_prop(BRW_CONDITIONAL_GE, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_GE, BRW_CONDITIONAL_GE,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
}
TEST_F(cmod_propagation_test, float_saturate_ge_mov)
@ -1817,7 +1808,10 @@ TEST_F(cmod_propagation_test, float_saturate_ge_mov)
* = After =
* No change
*/
test_negative_float_saturate_prop(BRW_CONDITIONAL_GE, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_GE, BRW_CONDITIONAL_GE,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_F, BRW_REGISTER_TYPE_F,
false);
}
TEST_F(cmod_propagation_test, int_saturate_nz_cmp)
@ -1830,7 +1824,10 @@ TEST_F(cmod_propagation_test, int_saturate_nz_cmp)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_NZ, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_NZ, BRW_CONDITIONAL_NZ,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_nz_mov)
@ -1843,7 +1840,10 @@ TEST_F(cmod_propagation_test, int_saturate_nz_mov)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_NZ, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_NZ, BRW_CONDITIONAL_NZ,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_z_cmp)
@ -1856,7 +1856,10 @@ TEST_F(cmod_propagation_test, int_saturate_z_cmp)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_Z, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_Z,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_z_mov)
@ -1872,7 +1875,10 @@ TEST_F(cmod_propagation_test, int_saturate_z_mov)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_Z, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_Z, BRW_CONDITIONAL_Z,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_g_cmp)
@ -1885,7 +1891,10 @@ TEST_F(cmod_propagation_test, int_saturate_g_cmp)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_G, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_g_mov)
@ -1898,7 +1907,10 @@ TEST_F(cmod_propagation_test, int_saturate_g_mov)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_G, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_G, BRW_CONDITIONAL_G,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_le_cmp)
@ -1911,7 +1923,10 @@ TEST_F(cmod_propagation_test, int_saturate_le_cmp)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_LE, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_le_mov)
@ -1924,7 +1939,10 @@ TEST_F(cmod_propagation_test, int_saturate_le_mov)
* = After =
* No change.
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_LE, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_LE, BRW_CONDITIONAL_LE,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_l_cmp)
@ -1937,7 +1955,10 @@ TEST_F(cmod_propagation_test, int_saturate_l_cmp)
* = After =
* No change
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_L, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_L, BRW_CONDITIONAL_L,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_l_mov)
@ -1950,7 +1971,10 @@ TEST_F(cmod_propagation_test, int_saturate_l_mov)
* = After =
* No change
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_L, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_L, BRW_CONDITIONAL_L,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_ge_cmp)
@ -1963,7 +1987,10 @@ TEST_F(cmod_propagation_test, int_saturate_ge_cmp)
* = After =
* No change
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_GE, BRW_OPCODE_CMP);
test_saturate_prop(BRW_CONDITIONAL_GE, BRW_CONDITIONAL_GE,
BRW_OPCODE_CMP,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, int_saturate_ge_mov)
@ -1976,7 +2003,10 @@ TEST_F(cmod_propagation_test, int_saturate_ge_mov)
* = After =
* No change
*/
test_negative_int_saturate_prop(BRW_CONDITIONAL_GE, BRW_OPCODE_MOV);
test_saturate_prop(BRW_CONDITIONAL_GE, BRW_CONDITIONAL_GE,
BRW_OPCODE_MOV,
BRW_REGISTER_TYPE_D, BRW_REGISTER_TYPE_D,
false);
}
TEST_F(cmod_propagation_test, not_to_or)