mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 07:08:04 +02:00
intel/compiler: implement dummy mov for Wa_18035690555
Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37804>
This commit is contained in:
parent
4bb68d7474
commit
3ab9145393
3 changed files with 57 additions and 0 deletions
|
|
@ -956,6 +956,8 @@ brw_allocate_registers(brw_shader &s, bool allow_spilling)
|
||||||
if (s.failed)
|
if (s.failed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
brw_workaround_emit_dummy_mov_mulmac(s);
|
||||||
|
|
||||||
OPT(brw_lower_scoreboard);
|
OPT(brw_lower_scoreboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -381,6 +381,7 @@ bool brw_workaround_emit_dummy_mov_instruction(brw_shader &s);
|
||||||
bool brw_workaround_memory_fence_before_eot(brw_shader &s);
|
bool brw_workaround_memory_fence_before_eot(brw_shader &s);
|
||||||
bool brw_workaround_nomask_control_flow(brw_shader &s);
|
bool brw_workaround_nomask_control_flow(brw_shader &s);
|
||||||
bool brw_workaround_source_arf_before_eot(brw_shader &s);
|
bool brw_workaround_source_arf_before_eot(brw_shader &s);
|
||||||
|
bool brw_workaround_emit_dummy_mov_mulmac(brw_shader &s);
|
||||||
|
|
||||||
/* Helpers. */
|
/* Helpers. */
|
||||||
unsigned brw_get_lowered_simd_width(const brw_shader *shader,
|
unsigned brw_get_lowered_simd_width(const brw_shader *shader,
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,60 @@ brw_workaround_emit_dummy_mov_instruction(brw_shader &s)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Wa_18035690555
|
||||||
|
*
|
||||||
|
* If we have mul <-> mac or macl <-> mach and src1 is the same in current
|
||||||
|
* and previous inst, we need to insert a dummy mov in between. We can skip
|
||||||
|
* issue 2 mentioned in wa as macl is not used by our compiler.
|
||||||
|
*
|
||||||
|
* Other conditions listed in the issue for mul <-> mac case:
|
||||||
|
* "prev instruction src1 has regioning/scalar" (not flat)
|
||||||
|
* "current instruction src1 is flat and shares the same src1 as prev"
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
brw_workaround_emit_dummy_mov_mulmac(brw_shader &s)
|
||||||
|
{
|
||||||
|
if (!intel_needs_workaround(s.devinfo, 18035690555))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#define IS_MUL_CLASS(x) \
|
||||||
|
(x->opcode == BRW_OPCODE_MUL || x->opcode == BRW_OPCODE_MAC)
|
||||||
|
#define IS_MACL_CLASS(x) \
|
||||||
|
(x->opcode == BRW_OPCODE_MACH)
|
||||||
|
|
||||||
|
#define IS_FLAT(x, i) (x->dst.subnr == x->src[i].subnr && \
|
||||||
|
x->src[i].is_contiguous())
|
||||||
|
|
||||||
|
brw_inst *prev_inst = NULL;
|
||||||
|
bool progress = false;
|
||||||
|
foreach_block_and_inst_safe (block, brw_inst, inst, s.cfg) {
|
||||||
|
if (prev_inst &&
|
||||||
|
inferred_exec_pipe(s.devinfo, inst) ==
|
||||||
|
inferred_exec_pipe(s.devinfo, prev_inst) &&
|
||||||
|
((IS_MUL_CLASS(inst) && IS_MUL_CLASS(prev_inst)) ||
|
||||||
|
(IS_MACL_CLASS(inst) && IS_MACL_CLASS(prev_inst))) &&
|
||||||
|
(phys_nr(s.devinfo, inst->src[1]) ==
|
||||||
|
phys_nr(s.devinfo, prev_inst->src[1])) &&
|
||||||
|
(IS_FLAT(inst, 1) && !IS_FLAT(prev_inst, 1))) {
|
||||||
|
/* Insert dummy mov between prev and current inst. */
|
||||||
|
const brw_builder ubld = brw_builder(prev_inst).exec_all().group(8, 0);
|
||||||
|
ubld.MOV(ubld.null_reg_ud(), brw_imm_ud(0u));
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
prev_inst = inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress) {
|
||||||
|
s.invalidate_analysis(BRW_DEPENDENCY_INSTRUCTIONS |
|
||||||
|
BRW_DEPENDENCY_VARIABLES);
|
||||||
|
}
|
||||||
|
#undef IS_FLAT
|
||||||
|
#undef IS_MUL_CLASS
|
||||||
|
#undef IS_MACL_CLASS
|
||||||
|
|
||||||
|
return progress;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
needs_dummy_fence(const intel_device_info *devinfo, const brw_inst *inst)
|
needs_dummy_fence(const intel_device_info *devinfo, const brw_inst *inst)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue