diff --git a/.pick_status.json b/.pick_status.json index a7e2f06bcd9..0bf57cf6e39 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -3919,7 +3919,7 @@ "description": "aco: don't split store data if it was already split into more elements", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 0d50ca1149c..587ed98c14d 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -3648,13 +3648,15 @@ void split_store_data(isel_context *ctx, RegType dst_type, unsigned count, Temp /* use allocated_vec if possible */ auto it = ctx->allocated_vec.find(src.id()); if (it != ctx->allocated_vec.end()) { - unsigned total_size = 0; - for (unsigned i = 0; it->second[i].bytes() && (i < NIR_MAX_VEC_COMPONENTS); i++) - total_size += it->second[i].bytes(); - if (total_size != src.bytes()) + if (!it->second[0].id()) goto split; - unsigned elem_size = it->second[0].bytes(); + assert(src.bytes() % elem_size == 0); + + for (unsigned i = 0; i < src.bytes() / elem_size; i++) { + if (!it->second[i].id()) + goto split; + } for (unsigned i = 0; i < count; i++) { if (offsets[i] % elem_size || dst[i].bytes() % elem_size) @@ -3686,10 +3688,11 @@ void split_store_data(isel_context *ctx, RegType dst_type, unsigned count, Temp } } + split: + if (dst_type == RegType::sgpr) src = bld.as_uniform(src); - split: /* just split it */ aco_ptr split{create_instruction(aco_opcode::p_split_vector, Format::PSEUDO, 1, count)}; split->operands[0] = Operand(src);