i965/vec4: Fix null destination register in 3-source instructions

A recent commit (see below) triggered some cases where conditional
modifier propagation and dead code elimination would cause a MAD
instruction like the following to be generated:

    mad.l.f0  null, ...

Matt pointed out that fs_visitor::fixup_3src_null_dest() fixes cases
like this in the scalar backend.  This commit basically ports that code
to the vec4 backend.

NOTE: I have sent a couple tests to the piglit list that reproduce this
bug *without* the commit mentioned below.  This commit fixes those
tests.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Tested-by: Tapani Pälli <tapani.palli@intel.com>
Cc: mesa-stable@lists.freedesktop.org
Fixes: ee63933a7 ("nir: Distribute binary operations with constants into bcsel")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105704
This commit is contained in:
Ian Romanick
2018-03-23 11:46:12 -07:00
parent 2c643fd978
commit 91225cb33f
2 changed files with 27 additions and 0 deletions

View File

@@ -1952,6 +1952,30 @@ is_align1_df(vec4_instruction *inst)
}
}
/**
* Three source instruction must have a GRF/MRF destination register.
* ARF NULL is not allowed. Fix that up by allocating a temporary GRF.
*/
void
vec4_visitor::fixup_3src_null_dest()
{
bool progress = false;
foreach_block_and_inst_safe (block, vec4_instruction, inst, cfg) {
if (inst->is_3src(devinfo) && inst->dst.is_null()) {
const unsigned size_written = type_sz(inst->dst.type);
const unsigned num_regs = DIV_ROUND_UP(size_written, REG_SIZE);
inst->dst = retype(dst_reg(VGRF, alloc.allocate(num_regs)),
inst->dst.type);
progress = true;
}
}
if (progress)
invalidate_live_intervals();
}
void
vec4_visitor::convert_to_hw_regs()
{
@@ -2703,6 +2727,8 @@ vec4_visitor::run()
OPT(scalarize_df);
}
fixup_3src_null_dest();
bool allocated_without_spills = reg_allocate();
if (!allocated_without_spills) {

View File

@@ -158,6 +158,7 @@ public:
void opt_set_dependency_control();
void opt_schedule_instructions();
void convert_to_hw_regs();
void fixup_3src_null_dest();
bool is_supported_64bit_region(vec4_instruction *inst, unsigned arg);
bool lower_simd_width();