diff --git a/src/intel/compiler/test_fs_cmod_propagation.cpp b/src/intel/compiler/test_fs_cmod_propagation.cpp index e157a92b3c3..50e4efc137e 100644 --- a/src/intel/compiler/test_fs_cmod_propagation.cpp +++ b/src/intel/compiler/test_fs_cmod_propagation.cpp @@ -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)