diff --git a/src/intel/compiler/brw_fs_cmod_propagation.cpp b/src/intel/compiler/brw_fs_cmod_propagation.cpp index 9ae1097cb98..17ef890dca4 100644 --- a/src/intel/compiler/brw_fs_cmod_propagation.cpp +++ b/src/intel/compiler/brw_fs_cmod_propagation.cpp @@ -59,7 +59,8 @@ cmod_propagate_cmp_to_add(const intel_device_info *devinfo, bblock_t *block, foreach_inst_in_block_reverse_starting_from(fs_inst, scan_inst, inst) { if (scan_inst->opcode == BRW_OPCODE_ADD && - !scan_inst->is_partial_write() && + !scan_inst->predicate && + scan_inst->dst.is_contiguous() && scan_inst->exec_size == inst->exec_size) { bool negate; @@ -184,7 +185,8 @@ cmod_propagate_not(const intel_device_info *devinfo, bblock_t *block, scan_inst->opcode != BRW_OPCODE_AND) break; - if (scan_inst->is_partial_write() || + if (scan_inst->predicate || + !scan_inst->dst.is_contiguous() || scan_inst->dst.offset != inst->src[0].offset || scan_inst->exec_size != inst->exec_size) break; @@ -298,7 +300,8 @@ opt_cmod_propagation_local(const intel_device_info *devinfo, bblock_t *block) scan_inst->flags_written(devinfo) != flags_written) break; - if (scan_inst->is_partial_write() || + if (scan_inst->predicate || + !scan_inst->dst.is_contiguous() || scan_inst->dst.offset != inst->src[0].offset || scan_inst->exec_size != inst->exec_size) break; diff --git a/src/intel/compiler/test_fs_cmod_propagation.cpp b/src/intel/compiler/test_fs_cmod_propagation.cpp index 2aa9070b2b3..6d5b495563e 100644 --- a/src/intel/compiler/test_fs_cmod_propagation.cpp +++ b/src/intel/compiler/test_fs_cmod_propagation.cpp @@ -3136,3 +3136,33 @@ TEST_F(cmod_propagation_test, prop_across_sel) EXPECT_EQ(BRW_CONDITIONAL_GE, instruction(block0, 1)->conditional_mod); } +TEST_F(cmod_propagation_test, Boolean_size_conversion) +{ + brw_reg dest1 = bld.vgrf(BRW_TYPE_W); + brw_reg src0 = bld.vgrf(BRW_TYPE_W); + brw_reg zero(brw_imm_w(0)); + + bld.CMP(dest1, src0, zero, BRW_CONDITIONAL_NZ); + set_condmod(BRW_CONDITIONAL_NZ, bld.MOV(bld.null_reg_d(), dest1)); + + /* = Before = + * 0: cmp.nz.f0 dest1:W src0:W 0W + * 1: mov.nz.f0 null:D dest1:W + * + * = After = + * 0: cmp.nz.f0 dest1:W src0:W 0W + */ + + brw_calculate_cfg(*v); + bblock_t *block0 = v->cfg->blocks[0]; + + EXPECT_EQ(0, block0->start_ip); + EXPECT_EQ(1, block0->end_ip); + + EXPECT_TRUE(cmod_propagation(v)); + EXPECT_EQ(0, block0->start_ip); + EXPECT_EQ(0, block0->end_ip); + + EXPECT_EQ(BRW_OPCODE_CMP, instruction(block0, 0)->opcode); + EXPECT_EQ(BRW_CONDITIONAL_NZ, instruction(block0, 0)->conditional_mod); +}