Skip to content
Snippets Groups Projects
Commit a50d2fdb authored by Lionel Landwerlin's avatar Lionel Landwerlin Committed by Marge Bot
Browse files

intel/fs: avoid cmod optimization on instruction with different write_mask


I've been running into failures with tests like :

dEQP-VK.robustness.robustness2.bind.notemplate.rgba32i.unroll.nonvolatile.uniform_buffer_dynamic.no_fmt_qual.len_4.samples_1.1d.frag

With the load_global_const_block_intel NIR intrinsic, you can load a
vec8/vec16 with a predicate. The predicate is correctly uniformized to
feed into the SEND instruction's flag register.

The problem is that a series of optimization first remove the
find_live_channel and then changes the broadcast into a simple MOV
instruction, on the assumption that the first channel is always active
if there is not control flow. This is correct.

But after that the cmod optimzation will remove this instruction :

   mov.nz.f0.0(16) null:D, vgrf16+0.0<0>:D NoMask

because it seems to be equivalent to :

   cmp.g.f0.0(16) vgrf16:D, vgrf12:D, 63d

In this case vgrf16 is the predicate to the load block SEND
instruction. Since the execution mask is different between both, some
of the channels of the SEND instruction end up not being loaded or
loaded with the wrong predication and we end up with incorrect UBO
data.

Signed-off-by: default avatarLionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: mesa-stable
Reviewed-by: default avatarMarcin Ślusarz <marcin.slusarz@intel.com>
Reviewed-by: default avatarIan Romanick <ian.d.romanick@intel.com>
Part-of: <!20852>
parent 159edf71
No related branches found
No related tags found
No related merge requests found
......@@ -303,6 +303,10 @@ opt_cmod_propagation_local(const intel_device_info *devinfo, bblock_t *block)
scan_inst->exec_size != inst->exec_size)
break;
/* If the write mask is different we can't propagate. */
if (scan_inst->force_writemask_all != inst->force_writemask_all)
break;
/* CMP's result is the same regardless of dest type. */
if (inst->conditional_mod == BRW_CONDITIONAL_NZ &&
scan_inst->opcode == BRW_OPCODE_CMP &&
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment