pco: Move part of legalization after register allocation
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Signed-off-by: Caius Moldovan <caius.moldovan@imgtec.com>
Reviewed-by: Simon Perretta <simon.perretta@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40724>
This commit is contained in:
Caius-Moldovan-img 2026-03-24 14:52:49 +02:00 committed by Marge Bot
parent 75dc7ef8fd
commit 37bdb2b792
3 changed files with 22 additions and 24 deletions

View file

@ -1782,10 +1782,10 @@ bool pco_bool(pco_shader *shader);
bool pco_cf(pco_shader *shader);
bool pco_dce(pco_shader *shader);
bool pco_post_ra_legalize(pco_shader *shader);
bool pco_pre_ra_legalize(pco_shader *shader);
bool pco_end(pco_shader *shader);
bool pco_group_instrs(pco_shader *shader);
bool pco_index(pco_shader *shader, bool skip_ssa);
bool pco_legalize(pco_shader *shader);
bool pco_opt_comp_only_vecs(pco_shader *shader);
bool pco_nir_compute_instance_check(nir_shader *shader);
bool pco_nir_link_clip_cull_vars(nir_shader *producer, nir_shader *consumer);

View file

@ -53,7 +53,7 @@ void pco_process_ir(pco_ctx *ctx, pco_shader *shader)
* time a drc result is used.
*/
PCO_PASS(_, shader, pco_schedule);
PCO_PASS(_, shader, pco_legalize);
PCO_PASS(_, shader, pco_pre_ra_legalize);
PCO_PASS(_, shader, pco_ra);
PCO_PASS(_, shader, pco_post_ra_legalize);
PCO_PASS(_, shader, pco_end);

View file

@ -163,9 +163,6 @@ static inline bool xfer_op_mods(pco_instr *dest, pco_instr *src)
*/
static bool legalize_fence(pco_instr *instr)
{
if (instr->op != PCO_OP_FENCE)
return false;
pco_builder b =
pco_builder_create(instr->parent_func, pco_cursor_before_instr(instr));
@ -181,6 +178,9 @@ static bool legalize_fence(pco_instr *instr)
static bool legalize_pseudo(pco_instr *instr)
{
switch (instr->op) {
case PCO_OP_FENCE:
return legalize_fence(instr);
case PCO_OP_MOV:
if (pco_ref_is_reg(instr->src[0]) &&
pco_ref_get_reg_class(instr->src[0]) == PCO_REG_CLASS_SPEC)
@ -452,43 +452,35 @@ static bool try_legalize(pco_instr *instr)
bool progress = false;
progress |= try_legalize_large_hwreg_offsets(instr, info);
/* Skip pseudo instructions. */
if (info->type == PCO_OP_TYPE_PSEUDO) {
progress |= legalize_pseudo(instr);
} else {
progress |= try_legalize_src_mappings(instr, info);
}
progress |= try_legalize_ditr_fence(instr);
return progress;
}
/**
* \brief Legalizes instructions where additional restrictions apply.
* This should be run after register allocation.
*
* \param[in,out] shader PCO shader.
* \return True if the pass made progress.
*/
bool pco_legalize(pco_shader *shader)
bool pco_pre_ra_legalize(pco_shader *shader)
{
bool progress = false;
assert(!shader->is_grouped);
assert(!shader->is_legalized);
pco_foreach_func_in_shader (func, shader) {
pco_foreach_instr_in_func_safe (instr, func) {
progress |= try_legalize(instr);
}
}
const struct pco_op_info *info;
pco_foreach_func_in_shader (func, shader) {
pco_foreach_instr_in_func_safe (instr, func) {
progress |= legalize_fence(instr);
info = &pco_op_info[instr->op];
if (info->type != PCO_OP_TYPE_PSEUDO)
progress |= try_legalize_src_mappings(instr, info);
}
}
shader->is_legalized = true;
return progress;
}
@ -500,20 +492,26 @@ bool pco_legalize(pco_shader *shader)
*/
bool pco_post_ra_legalize(pco_shader *shader)
{
assert(!shader->is_grouped);
bool progress = false;
assert(!shader->is_grouped);
pco_foreach_func_in_shader (func, shader) {
pco_foreach_instr_in_func_safe (instr, func) {
progress |= try_legalize_ditr_fence(instr);
progress |= try_legalize(instr);
}
}
const struct pco_op_info *info;
pco_foreach_func_in_shader (func, shader) {
pco_foreach_instr_in_func_safe (instr, func) {
progress |= legalize_fence(instr);
info = &pco_op_info[instr->op];
if (info->type == PCO_OP_TYPE_PSEUDO)
progress |= legalize_pseudo(instr);
}
}
shader->is_legalized = true;
return progress;
}