aco: allow overflow for some SMEM instructions
fossil-db (Navi): Totals from 10184 (7.49% of 135946) affected shaders: CodeSize: 83419748 -> 82430824 (-1.19%); split: -1.19%, +0.01% Instrs: 16054612 -> 15908523 (-0.91%); split: -0.93%, +0.02% VMEM: 1608018 -> 1581829 (-1.63%); split: +0.20%, -1.83% SMEM: 577031 -> 563492 (-2.35%); split: +0.10%, -2.45% VClause: 242643 -> 242512 (-0.05%); split: -0.06%, +0.00% SClause: 640966 -> 569897 (-11.09%) Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2720>
This commit is contained in:
@@ -1001,13 +1001,14 @@ void label_instruction(opt_ctx &ctx, Block& block, aco_ptr<Instruction>& instr)
|
||||
SMEM_instruction *smem = static_cast<SMEM_instruction *>(instr.get());
|
||||
Temp base;
|
||||
uint32_t offset;
|
||||
bool prevent_overflow = smem->operands[0].size() > 2 || smem->prevent_overflow;
|
||||
if (i == 1 && info.is_constant_or_literal(32) &&
|
||||
((ctx.program->chip_class == GFX6 && info.val <= 0x3FF) ||
|
||||
(ctx.program->chip_class == GFX7 && info.val <= 0xFFFFFFFF) ||
|
||||
(ctx.program->chip_class >= GFX8 && info.val <= 0xFFFFF))) {
|
||||
instr->operands[i] = Operand(info.val);
|
||||
continue;
|
||||
} else if (i == 1 && parse_base_offset(ctx, instr.get(), i, &base, &offset, true) && base.regClass() == s1 && offset <= 0xFFFFF && ctx.program->chip_class >= GFX9) {
|
||||
} else if (i == 1 && parse_base_offset(ctx, instr.get(), i, &base, &offset, prevent_overflow) && base.regClass() == s1 && offset <= 0xFFFFF && ctx.program->chip_class >= GFX9) {
|
||||
bool soe = smem->operands.size() >= (!smem->definitions.empty() ? 3 : 4);
|
||||
if (soe &&
|
||||
(!ctx.info[smem->operands.back().tempId()].is_constant_or_literal(32) ||
|
||||
|
||||
Reference in New Issue
Block a user