ir3: Allow collect sources to be undef

Undef collect sources will never have a move materialized for them.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28447>
This commit is contained in:
Connor Abbott
2024-03-27 15:03:20 -04:00
committed by Marge Bot
parent c2c48db6a4
commit 3a5cb40c1f
3 changed files with 31 additions and 11 deletions
+20 -4
View File
@@ -322,7 +322,19 @@ ir3_create_collect(struct ir3_builder *build,
if (arrsz == 1)
return arr[0];
unsigned flags = dest_flags(arr[0]);
int non_undef_src = -1;
for (unsigned i = 0; i < arrsz; i++) {
if (arr[i]) {
non_undef_src = i;
break;
}
}
/* There should be at least one non-undef source to determine the type of the
* destination.
*/
assert(non_undef_src != -1);
unsigned flags = dest_flags(arr[non_undef_src]);
collect = ir3_build_instr(build, OPC_META_COLLECT, 1, arrsz);
__ssa_dst(collect)->flags |= flags;
@@ -353,13 +365,17 @@ ir3_create_collect(struct ir3_builder *build,
* scalar registers.
*
*/
if (elem->dsts[0]->flags & IR3_REG_ARRAY) {
if (elem && elem->dsts[0]->flags & IR3_REG_ARRAY) {
type_t type = (flags & IR3_REG_HALF) ? TYPE_U16 : TYPE_U32;
elem = ir3_MOV(build, elem, type);
}
assert(dest_flags(elem) == flags);
__ssa_src(collect, elem, flags);
if (elem) {
assert(dest_flags(elem) == flags);
__ssa_src(collect, elem, flags);
} else {
ir3_src_create(collect, INVALID_REG, flags | IR3_REG_SSA);
}
}
collect->dsts[0]->wrmask = MASK(arrsz);
+9 -6
View File
@@ -520,12 +520,15 @@ ir3_lower_copies(struct ir3_shader_variant *v)
unsigned flags = dst->flags & (IR3_REG_HALF | IR3_REG_SHARED);
for (unsigned i = 0; i < instr->srcs_count; i++) {
struct ir3_register *src = instr->srcs[i];
array_insert(NULL, copies,
(struct copy_entry){
.dst = ra_num_to_physreg(dst->num + i, flags),
.src = get_copy_src(src, 0),
.flags = flags,
});
if ((src->flags & (IR3_REG_CONST | IR3_REG_IMMED)) ||
src->num != INVALID_REG) {
array_insert(NULL, copies,
(struct copy_entry){
.dst = ra_num_to_physreg(dst->num + i, flags),
.src = get_copy_src(src, 0),
.flags = flags,
});
}
}
handle_copies(v, instr, copies, copies_count);
list_del(&instr->node);
+2 -1
View File
@@ -377,7 +377,8 @@ aggressive_coalesce_collect(struct ir3_liveness *live,
{
for (unsigned i = 0, offset = 0; i < collect->srcs_count;
offset += reg_elem_size(collect->srcs[i]), i++) {
if (!(collect->srcs[i]->flags & IR3_REG_SSA))
if (!(collect->srcs[i]->flags & IR3_REG_SSA) ||
!collect->srcs[i]->def)
continue;
try_merge_defs(live, collect->dsts[0], collect->srcs[i]->def, offset);
}