ac/nir: Implement the deref instr for shared memory.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Tue, 24 Apr 2018 22:45:33 +0000 (00:45 +0200)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 23 Jun 2018 03:15:58 +0000 (20:15 -0700)
v2: Store the result in ctx->ssa_defs.
Acked-by: Rob Clark <robdclark@gmail.com>
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Acked-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/amd/common/ac_nir_to_llvm.c

index b77d62a39b00868559eb33df964094a3bac5b478..38797231663484f223e5d49546cfa1623d9d3364 100644 (file)
@@ -3583,6 +3583,34 @@ static void visit_jump(struct ac_llvm_context *ctx,
        }
 }
 
+static void visit_deref(struct ac_nir_context *ctx,
+                        nir_deref_instr *instr)
+{
+       if (instr->mode != nir_var_shared)
+               return;
+
+       LLVMValueRef result = NULL;
+       switch(instr->deref_type) {
+       case nir_deref_type_var: {
+               struct hash_entry *entry = _mesa_hash_table_search(ctx->vars, instr->var);
+               result = entry->data;
+               break;
+       }
+       case nir_deref_type_struct:
+               result = ac_build_gep0(&ctx->ac, get_src(ctx, instr->parent),
+                                      LLVMConstInt(ctx->ac.i32, instr->strct.index, 0));
+               break;
+       case nir_deref_type_array:
+               result = ac_build_gep0(&ctx->ac, get_src(ctx, instr->parent),
+                                      get_src(ctx, instr->arr.index));
+               break;
+       default:
+               unreachable("Unhandled deref_instr deref type");
+       }
+
+       ctx->ssa_defs[instr->dest.ssa.index] = result;
+}
+
 static void visit_cf_list(struct ac_nir_context *ctx,
                           struct exec_list *list);
 
@@ -3613,6 +3641,9 @@ static void visit_block(struct ac_nir_context *ctx, nir_block *block)
                case nir_instr_type_jump:
                        visit_jump(&ctx->ac, nir_instr_as_jump(instr));
                        break;
+               case nir_instr_type_deref:
+                       visit_deref(ctx, nir_instr_as_deref(instr));
+                       break;
                default:
                        fprintf(stderr, "Unknown NIR instr type: ");
                        nir_print_instr(instr, stderr);