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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user