From cf5fc4b973cd9193f3a1fcb684c75a0e15c2b25c Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 30 Nov 2021 15:45:12 +0000 Subject: [PATCH] aco: disallow SMEM offsets that are not multiples of 4 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit These can't be encoded on GFX6/7, and combining these additions causes CTS failures on GFX10.3. I think the low 2 MSBs are ignored before the addition, not after, so load(a + 3, 0) becomes load(a, 3), which is the same as load(a, 0). No fossil-db changes. Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_optimizer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp index 9b1ac02..8ea5dac 100644 --- a/src/amd/compiler/aco_optimizer.cpp +++ b/src/amd/compiler/aco_optimizer.cpp @@ -1189,7 +1189,8 @@ label_instruction(opt_ctx& ctx, aco_ptr& instr) continue; } 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) { + base.regClass() == s1 && offset <= 0xFFFFF && ctx.program->chip_class >= GFX9 && + offset % 4u == 0) { bool soe = smem.operands.size() >= (!smem.definitions.empty() ? 3 : 4); if (soe && (!ctx.info[smem.operands.back().tempId()].is_constant_or_literal(32) || ctx.info[smem.operands.back().tempId()].val != 0)) { -- 2.7.4