ir3: Make sure constlen includes stc/ldc.k/ldg.k instructions

nir_opt_preamble sometimes adds useless expressions, in which case we
may have stc instructions and no corresponding use of the constant.
Things can go sideways when these aren't included in the constlen, so
far only observed when earlypreamble is enabled.

Fixes: ccc64b7e00 ("ir3: Plumb through store_uniform_ir3 intrinsic")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29903>
This commit is contained in:
Connor Abbott 2024-06-25 16:04:20 -04:00 committed by Marge Bot
parent 536775ee8b
commit c42f6597f9

View file

@ -951,6 +951,12 @@ emit_intrinsic_copy_ubo_to_uniform(struct ir3_context *ctx,
ir3_instr_set_address(ldc, addr1);
/* The assembler isn't aware of what value a1.x has, so make sure that
* constlen includes the ldc.k here.
*/
ctx->so->constlen =
MAX2(ctx->so->constlen, DIV_ROUND_UP(base + size * 4, 4));
array_insert(b, b->keeps, ldc);
}
@ -984,6 +990,12 @@ emit_intrinsic_copy_global_to_uniform(struct ir3_context *ctx,
ldg->flags |= IR3_INSTR_A1EN;
}
/* The assembler isn't aware of what value a1.x has, so make sure that
* constlen includes the ldg.k here.
*/
ctx->so->constlen =
MAX2(ctx->so->constlen, DIV_ROUND_UP(dst + size * 4, 4));
array_insert(b, b->keeps, ldg);
}
@ -2858,6 +2870,11 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
ir3_instr_set_address(stc, a1);
stc->flags |= IR3_INSTR_A1EN;
}
/* The assembler isn't aware of what value a1.x has, so make sure that
* constlen includes the stc here.
*/
ctx->so->constlen =
MAX2(ctx->so->constlen, DIV_ROUND_UP(dst + components, 4));
array_insert(b, b->keeps, stc);
break;
}