From 4a888beea9f00f0de8adf2cfff02fc160140113a Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Wed, 25 Apr 2018 00:45:33 +0200 Subject: [PATCH] ac/nir: Implement the deref instr for shared memory. v2: Store the result in ctx->ssa_defs. Acked-by: Rob Clark Acked-by: Bas Nieuwenhuizen Acked-by: Dave Airlie Reviewed-by: Kenneth Graunke --- src/amd/common/ac_nir_to_llvm.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index b77d62a39b0..38797231663 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -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);