gallium/radeon: simplify if/else/endif blocks
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 28 Sep 2016 16:59:42 +0000 (18:59 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 4 Oct 2016 14:39:18 +0000 (16:39 +0200)
In particular, we no longer emit an else block when there is no ELSE
instruction.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/radeon_llvm.h
src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c

index f508d3230cc94e2c646317db309b208b3f4a3bdf..58193dbcc24dc1fbb2ed1606dcac922f88a818b1 100644 (file)
@@ -41,9 +41,7 @@
 #define RADEON_LLVM_MAX_SYSTEM_VALUES 4
 
 struct radeon_llvm_branch {
-       LLVMBasicBlockRef endif_block;
-       LLVMBasicBlockRef if_block;
-       LLVMBasicBlockRef else_block;
+       LLVMBasicBlockRef next_block;
        unsigned has_else;
 };
 
index 2f6b7e27971b3fd0b2d6e308ba73a09257c53d79..6cae858d50e6136494d3d49f1538607f3f5f6c7a 100644 (file)
@@ -878,11 +878,17 @@ static void else_emit(const struct lp_build_tgsi_action *action,
        struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
        struct gallivm_state *gallivm = bld_base->base.gallivm;
        struct radeon_llvm_branch *current_branch = get_current_branch(ctx);
+       LLVMBasicBlockRef endif_block;
+
+       endif_block = LLVMAppendBasicBlockInContext(gallivm->context,
+                                                   ctx->main_fn, "ENDIF");
+       emit_default_branch(gallivm->builder, endif_block);
 
-       emit_default_branch(gallivm->builder, current_branch->endif_block);
        current_branch->has_else = 1;
-       LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->else_block);
-       set_basicblock_name(current_branch->else_block, "else", bld_base->pc);
+       LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->next_block);
+       set_basicblock_name(current_branch->next_block, "else", bld_base->pc);
+
+       current_branch->next_block = endif_block;
 }
 
 static void endif_emit(const struct lp_build_tgsi_action *action,
@@ -893,17 +899,10 @@ static void endif_emit(const struct lp_build_tgsi_action *action,
        struct gallivm_state *gallivm = bld_base->base.gallivm;
        struct radeon_llvm_branch *current_branch = get_current_branch(ctx);
 
-       emit_default_branch(gallivm->builder, current_branch->endif_block);
+       emit_default_branch(gallivm->builder, current_branch->next_block);
+       LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->next_block);
+       set_basicblock_name(current_branch->next_block, "endif", bld_base->pc);
 
-       /* Need to fixup an empty else block if there was no ELSE opcode. */
-       if (!LLVMGetBasicBlockTerminator(current_branch->else_block)) {
-               LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->else_block);
-               LLVMBuildBr(gallivm->builder, current_branch->endif_block);
-               set_basicblock_name(current_branch->else_block, "empty_else", bld_base->pc);
-       }
-
-       LLVMPositionBuilderAtEnd(gallivm->builder, current_branch->endif_block);
-       set_basicblock_name(current_branch->endif_block, "endif", bld_base->pc);
        ctx->branch_depth--;
 }
 
@@ -929,14 +928,12 @@ static void if_cond_emit(const struct lp_build_tgsi_action *action,
 {
        struct radeon_llvm_context *ctx = radeon_llvm_context(bld_base);
        struct gallivm_state *gallivm = bld_base->base.gallivm;
-       LLVMBasicBlockRef if_block, else_block, endif_block;
+       LLVMBasicBlockRef if_block, else_block;
 
-       endif_block = LLVMAppendBasicBlockInContext(gallivm->context,
-                                               ctx->main_fn, "ENDIF");
+       else_block = LLVMAppendBasicBlockInContext(gallivm->context,
+                                                  ctx->main_fn, "ELSE");
        if_block = LLVMInsertBasicBlockInContext(gallivm->context,
-                                               endif_block, "IF");
-       else_block = LLVMInsertBasicBlockInContext(gallivm->context,
-                                               endif_block, "ELSE");
+                                               else_block, "IF");
        set_basicblock_name(if_block, "if", bld_base->pc);
        LLVMBuildCondBr(gallivm->builder, cond, if_block, else_block);
        LLVMPositionBuilderAtEnd(gallivm->builder, if_block);
@@ -953,9 +950,7 @@ static void if_cond_emit(const struct lp_build_tgsi_action *action,
                ctx->branch_depth_max = new_max;
        }
 
-       ctx->branch[ctx->branch_depth - 1].endif_block = endif_block;
-       ctx->branch[ctx->branch_depth - 1].if_block = if_block;
-       ctx->branch[ctx->branch_depth - 1].else_block = else_block;
+       ctx->branch[ctx->branch_depth - 1].next_block = else_block;
        ctx->branch[ctx->branch_depth - 1].has_else = 0;
 }