From a0f6ca4393d9b28e303a043ad4125430001aca68 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 26 May 2020 16:43:05 +0100 Subject: [PATCH] aco: don't store byte-aligned short stores MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The ISA docs don't seem to say if this is allowed, so just assume short stores require short alignment. Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 94a076f4917..73be000351c 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -3857,10 +3857,10 @@ void split_buffer_store(isel_context *ctx, nir_intrinsic_instr *instr, bool smem /* dword or larger stores have to be dword-aligned */ unsigned align_mul = instr ? nir_intrinsic_align_mul(instr) : 4; - unsigned align_offset = instr ? nir_intrinsic_align_offset(instr) : 0; - bool dword_aligned = (align_offset + offset) % 4 == 0 && align_mul % 4 == 0; - if (bytes >= 4 && !dword_aligned) - bytes = MIN2(bytes, 2); + unsigned align_offset = (instr ? nir_intrinsic_align_offset(instr) : 0) + offset; + bool dword_aligned = align_offset % 4 == 0 && align_mul % 4 == 0; + if (!dword_aligned) + bytes = MIN2(bytes, (align_offset % 2 == 0 && align_mul % 2 == 0) ? 2 : 1); advance_write_mask(&todo, offset, bytes); write_count_with_skips++; -- 2.30.2