From cdd4f62e891094276a6a61e35fd8efa98524d631 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Sun, 20 Apr 2025 22:07:44 +0200 Subject: [PATCH] aco: help clang 20 do some additions and subtractions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clang 20 complains: ../src/amd/compiler/aco_assembler.cpp:837:28: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 837 | vaddr[num_vaddr + i] = reg(ctx, instr->operands.back(), 8) + i + 1; | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/amd/compiler/aco_assembler.cpp:832:12: note: at offset 5 into destination object ‘vaddr’ of size 5 832 | uint8_t vaddr[5] = {0, 0, 0, 0, 0}; | ^~~~~ ../src/amd/compiler/aco_assembler.cpp:837:28: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 837 | vaddr[num_vaddr + i] = reg(ctx, instr->operands.back(), 8) + i + 1; | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/amd/compiler/aco_assembler.cpp:832:12: note: at offset 6 into destination object ‘vaddr’ of size 5 832 | uint8_t vaddr[5] = {0, 0, 0, 0, 0}; | ^~~~~ ../src/amd/compiler/aco_assembler.cpp:837:28: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=] 837 | vaddr[num_vaddr + i] = reg(ctx, instr->operands.back(), 8) + i + 1; | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/amd/compiler/aco_assembler.cpp:832:12: note: at offset 7 into destination object ‘vaddr’ of size 5 832 | uint8_t vaddr[5] = {0, 0, 0, 0, 0}; | ^~~~~ But `i < MIN2(instr->operands.back().size() - 1, 5 - num_vaddr)` means `i` is at most `5 - num_vaddr - 1`, which means `vaddr[num_vaddr + i]` => `vaddr[num_vaddr + 5 - num_vaddr - 1]` => `vaddr[5 - 1]` => `vaddr[4]` which is within the valid indices. For some reason, using signed `int` instead allows clang to figure this out, so let's do that since we don't need the extra range. While at it, use ARRAY_SIZE(vaddr) instead of hard-coding the same `5` in several places. Backport-to: 25.0 Part-of: (cherry picked from commit 2bcb55f3f66652873b11e24e3012dc19c3bff4ae) --- .pick_status.json | 2 +- src/amd/compiler/aco_assembler.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 12fa0e17c02..3655fea0513 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -684,7 +684,7 @@ "description": "aco: help clang 20 do some additions and subtractions", "nominated": true, "nomination_type": 4, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index 9ef25e3edd4..4b93121f8cb 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -832,8 +832,8 @@ emit_mimg_instruction_gfx12(asm_context& ctx, std::vector& out, const uint8_t vaddr[5] = {0, 0, 0, 0, 0}; for (unsigned i = 3; i < instr->operands.size(); i++) vaddr[i - 3] = reg(ctx, instr->operands[i], 8); - unsigned num_vaddr = instr->operands.size() - 3; - for (unsigned i = 0; i < MIN2(instr->operands.back().size() - 1, 5 - num_vaddr); i++) + int num_vaddr = instr->operands.size() - 3; + for (int i = 0; i < (int)MIN2(instr->operands.back().size() - 1, ARRAY_SIZE(vaddr) - num_vaddr); i++) vaddr[num_vaddr + i] = reg(ctx, instr->operands.back(), 8) + i + 1; encoding = 0;