From 5463ea2701df9c28328e21caedb987ce11c89371 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Fri, 10 Oct 2025 18:30:55 +0200 Subject: [PATCH] aco: fix global_atomic_swap offset overflow check Fixes: d7dcd81c77e ("aco/gfx6: allow both constant and gpr offset for global with sgpr address") Reviewed-by: Rhys Perry Part-of: (cherry picked from commit c13caa5e5fdcdf624687dfe56e35e329a24b757e) --- .pick_status.json | 2 +- .../instruction_selection/aco_select_nir_intrinsics.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 829a977ee3c..1c7d3961157 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1744,7 +1744,7 @@ "description": "aco: fix global_atomic_swap offset overflow check", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "d7dcd81c77efffce2ef122254c9dfc9dbb3bf447", "notes": null diff --git a/src/amd/compiler/instruction_selection/aco_select_nir_intrinsics.cpp b/src/amd/compiler/instruction_selection/aco_select_nir_intrinsics.cpp index 79515228007..ada0d6d7168 100644 --- a/src/amd/compiler/instruction_selection/aco_select_nir_intrinsics.cpp +++ b/src/amd/compiler/instruction_selection/aco_select_nir_intrinsics.cpp @@ -2667,10 +2667,13 @@ visit_global_atomic(isel_context* ctx, nir_intrinsic_instr* instr) const nir_atomic_op nir_op = nir_intrinsic_atomic_op(instr); const bool cmpswap = nir_op == nir_atomic_op_cmpxchg; + unsigned offset_idx = 2; - if (cmpswap) + if (cmpswap) { + offset_idx = 3; data = bld.pseudo(aco_opcode::p_create_vector, bld.def(RegType::vgpr, data.size() * 2), get_ssa_temp(ctx, instr->src[2].ssa), data); + } Temp dst = get_ssa_temp(ctx, &instr->def); @@ -2679,7 +2682,8 @@ visit_global_atomic(isel_context* ctx, nir_intrinsic_instr* instr) Temp addr, offset; uint32_t const_offset; parse_global(ctx, instr, &addr, &const_offset, &offset); - Format format = lower_global_address(ctx, bld, 0, &addr, &const_offset, &offset, &instr->src[2]); + Format format = + lower_global_address(ctx, bld, 0, &addr, &const_offset, &offset, &instr->src[offset_idx]); if (format != Format::MUBUF) { bool global = format == Format::GLOBAL;