diff options
author | Bas Nieuwenhuizen <[email protected]> | 2018-04-25 00:45:33 +0200 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-06-22 20:15:58 -0700 |
commit | 4a888beea9f00f0de8adf2cfff02fc160140113a (patch) | |
tree | 14f4c439d9de3a1233a2fb21b4879f3ebbe0b34d | |
parent | c11833ab24dcba26de1b0a5805e35a5d6761514e (diff) |
ac/nir: Implement the deref instr for shared memory.
v2: Store the result in ctx->ssa_defs.
Acked-by: Rob Clark <[email protected]>
Acked-by: Bas Nieuwenhuizen <[email protected]>
Acked-by: Dave Airlie <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 31 |
1 files changed, 31 insertions, 0 deletions
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); |