aco: Optimize MUBUF 0 offset when idxen is also being used.
Now that we added an index src to the NIR intrinsic, it can happen that these generate MUBUF instructions which have both an index and an offset. Extend this ACO optimization to the case when idxen is used. Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Georg Lehmann <dadschoorse@gmail.com> Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17551>
This commit is contained in:
@@ -1424,8 +1424,16 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
||||
* MUBUF accesses. */
|
||||
bool vaddr_prevent_overflow = mubuf.swizzled && ctx.program->gfx_level < GFX9;
|
||||
|
||||
if (mubuf.offen && i == 1 && info.is_constant_or_literal(32) &&
|
||||
mubuf.offset + info.val < 4096) {
|
||||
if (mubuf.offen && mubuf.idxen && i == 1 && info.is_vec() &&
|
||||
info.instr->operands.size() == 2 && info.instr->operands[0].isTemp() &&
|
||||
info.instr->operands[0].regClass() == v1 && info.instr->operands[1].isConstant() &&
|
||||
mubuf.offset + info.instr->operands[1].constantValue() < 4096) {
|
||||
instr->operands[1] = info.instr->operands[0];
|
||||
mubuf.offset += info.instr->operands[1].constantValue();
|
||||
mubuf.offen = false;
|
||||
continue;
|
||||
} else if (mubuf.offen && i == 1 && info.is_constant_or_literal(32) &&
|
||||
mubuf.offset + info.val < 4096) {
|
||||
assert(!mubuf.idxen);
|
||||
instr->operands[1] = Operand(v1);
|
||||
mubuf.offset += info.val;
|
||||
|
||||
Reference in New Issue
Block a user