[Mesa-dev] [PATCH 3/3] ac: make use of if/loop build helpers

Marek Olšák maraeo at gmail.com
Wed Mar 7 20:43:49 UTC 2018


For the series:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Tue, Mar 6, 2018 at 8:40 PM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> These helpers insert the basic block in the same order as they
> appear in NIR making it easier to follow LLVM IR dumps. The helpers
> also insert more useful labels onto the blocks.
>
> TGSI use the line number of the corresponding opcode in the TGSI
> dump as the label id, here we use the corresponding block index
> from NIR.
> ---
>  src/amd/common/ac_nir_to_llvm.c | 60 +++++++++++++----------------------------
>  1 file changed, 18 insertions(+), 42 deletions(-)
>
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index cda91fe8bf..dc463ed253 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -5237,17 +5237,15 @@ static void visit_ssa_undef(struct ac_nir_context *ctx,
>         _mesa_hash_table_insert(ctx->defs, &instr->def, undef);
>  }
>
> -static void visit_jump(struct ac_nir_context *ctx,
> +static void visit_jump(struct ac_llvm_context *ctx,
>                        const nir_jump_instr *instr)
>  {
>         switch (instr->type) {
>         case nir_jump_break:
> -               LLVMBuildBr(ctx->ac.builder, ctx->break_block);
> -               LLVMClearInsertionPosition(ctx->ac.builder);
> +               ac_build_break(ctx);
>                 break;
>         case nir_jump_continue:
> -               LLVMBuildBr(ctx->ac.builder, ctx->continue_block);
> -               LLVMClearInsertionPosition(ctx->ac.builder);
> +               ac_build_continue(ctx);
>                 break;
>         default:
>                 fprintf(stderr, "Unknown NIR jump instr: ");
> @@ -5285,7 +5283,7 @@ static void visit_block(struct ac_nir_context *ctx, nir_block *block)
>                         visit_ssa_undef(ctx, nir_instr_as_ssa_undef(instr));
>                         break;
>                 case nir_instr_type_jump:
> -                       visit_jump(ctx, nir_instr_as_jump(instr));
> +                       visit_jump(&ctx->ac, nir_instr_as_jump(instr));
>                         break;
>                 default:
>                         fprintf(stderr, "Unknown NIR instr type: ");
> @@ -5302,56 +5300,34 @@ static void visit_if(struct ac_nir_context *ctx, nir_if *if_stmt)
>  {
>         LLVMValueRef value = get_src(ctx, if_stmt->condition);
>
> -       LLVMValueRef fn = LLVMGetBasicBlockParent(LLVMGetInsertBlock(ctx->ac.builder));
> -       LLVMBasicBlockRef merge_block =
> -           LLVMAppendBasicBlockInContext(ctx->ac.context, fn, "");
> -       LLVMBasicBlockRef if_block =
> -           LLVMAppendBasicBlockInContext(ctx->ac.context, fn, "");
> -       LLVMBasicBlockRef else_block = merge_block;
> -       if (!exec_list_is_empty(&if_stmt->else_list))
> -               else_block = LLVMAppendBasicBlockInContext(
> -                   ctx->ac.context, fn, "");
> -
> -       LLVMValueRef cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntNE, value,
> -                                         ctx->ac.i32_0, "");
> -       LLVMBuildCondBr(ctx->ac.builder, cond, if_block, else_block);
> -
> -       LLVMPositionBuilderAtEnd(ctx->ac.builder, if_block);
> +       nir_block *then_block =
> +               (nir_block *) exec_list_get_head(&if_stmt->then_list);
> +
> +       ac_build_uif(&ctx->ac, value, then_block->index);
> +
>         visit_cf_list(ctx, &if_stmt->then_list);
> -       if (LLVMGetInsertBlock(ctx->ac.builder))
> -               LLVMBuildBr(ctx->ac.builder, merge_block);
>
>         if (!exec_list_is_empty(&if_stmt->else_list)) {
> -               LLVMPositionBuilderAtEnd(ctx->ac.builder, else_block);
> +               nir_block *else_block =
> +                       (nir_block *) exec_list_get_head(&if_stmt->else_list);
> +
> +               ac_build_else(&ctx->ac, else_block->index);
>                 visit_cf_list(ctx, &if_stmt->else_list);
> -               if (LLVMGetInsertBlock(ctx->ac.builder))
> -                       LLVMBuildBr(ctx->ac.builder, merge_block);
>         }
>
> -       LLVMPositionBuilderAtEnd(ctx->ac.builder, merge_block);
> +       ac_build_endif(&ctx->ac, then_block->index);
>  }
>
>  static void visit_loop(struct ac_nir_context *ctx, nir_loop *loop)
>  {
> -       LLVMValueRef fn = LLVMGetBasicBlockParent(LLVMGetInsertBlock(ctx->ac.builder));
> -       LLVMBasicBlockRef continue_parent = ctx->continue_block;
> -       LLVMBasicBlockRef break_parent = ctx->break_block;
> +       nir_block *first_loop_block =
> +               (nir_block *) exec_list_get_head(&loop->body);
>
> -       ctx->continue_block =
> -           LLVMAppendBasicBlockInContext(ctx->ac.context, fn, "");
> -       ctx->break_block =
> -           LLVMAppendBasicBlockInContext(ctx->ac.context, fn, "");
> +       ac_build_bgnloop(&ctx->ac, first_loop_block->index);
>
> -       LLVMBuildBr(ctx->ac.builder, ctx->continue_block);
> -       LLVMPositionBuilderAtEnd(ctx->ac.builder, ctx->continue_block);
>         visit_cf_list(ctx, &loop->body);
>
> -       if (LLVMGetInsertBlock(ctx->ac.builder))
> -               LLVMBuildBr(ctx->ac.builder, ctx->continue_block);
> -       LLVMPositionBuilderAtEnd(ctx->ac.builder, ctx->break_block);
> -
> -       ctx->continue_block = continue_parent;
> -       ctx->break_block = break_parent;
> +       ac_build_endloop(&ctx->ac, first_loop_block->index);
>  }
>
>  static void visit_cf_list(struct ac_nir_context *ctx,
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list