Offset wasn't being added to the pointer, so for arrays the operation
would always have been performed on the first array element.

Signed-off-by: Alex Smith <[email protected]>
---
Applies on top of my earlier patch:
https://lists.freedesktop.org/archives/mesa-dev/2017-June/161103.html
---
 src/amd/common/ac_nir_to_llvm.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 5bb7bc6..6845df8 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -3572,11 +3572,19 @@ visit_load_local_invocation_index(struct 
nir_to_llvm_context *ctx)
 static LLVMValueRef visit_var_atomic(struct nir_to_llvm_context *ctx,
                                     const nir_intrinsic_instr *instr)
 {
-       LLVMValueRef ptr, result;
+       LLVMValueRef ptr, result, indir_index;
+       unsigned const_index;
        int idx = instr->variables[0]->var->data.driver_location;
        LLVMValueRef src = get_src(ctx, instr->src[0]);
+
        ptr = get_shared_memory_ptr(ctx, idx, ctx->i32);
 
+       radv_get_deref_offset(ctx, instr->variables[0], false, true,
+                             NULL, NULL, &const_index, &indir_index);
+
+       if (indir_index)
+               ptr = LLVMBuildGEP(ctx->builder, ptr, &indir_index, 1, "");
+
        if (instr->intrinsic == nir_intrinsic_var_atomic_comp_swap) {
                LLVMValueRef src1 = get_src(ctx, instr->src[1]);
                result = LLVMBuildAtomicCmpXchg(ctx->builder,
-- 
2.9.4

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to