ac/nir: add always_vector argument to ac_build_gather_values_extended
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 25 Jun 2017 11:04:51 +0000 (13:04 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:42 +0000 (14:55 +0200)
This simplifies a bunch of places that no longer need special treatment
of value_count == 1. We rely on LLVM to optimize away the 1-element vector
types.

This fixes a bunch of bugs where 1-element arrays are indexed indirectly.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_llvm_build.c
src/amd/common/ac_llvm_build.h
src/amd/common/ac_nir_to_llvm.c

index 2cc4eae..2dddf44 100644 (file)
@@ -181,13 +181,14 @@ ac_build_gather_values_extended(struct ac_llvm_context *ctx,
                                LLVMValueRef *values,
                                unsigned value_count,
                                unsigned value_stride,
-                               bool load)
+                               bool load,
+                               bool always_vector)
 {
        LLVMBuilderRef builder = ctx->builder;
        LLVMValueRef vec = NULL;
        unsigned i;
 
-       if (value_count == 1) {
+       if (value_count == 1 && !always_vector) {
                if (load)
                        return LLVMBuildLoad(builder, values[0], "");
                return values[0];
@@ -212,7 +213,7 @@ ac_build_gather_values(struct ac_llvm_context *ctx,
                       LLVMValueRef *values,
                       unsigned value_count)
 {
-       return ac_build_gather_values_extended(ctx, values, value_count, 1, false);
+       return ac_build_gather_values_extended(ctx, values, value_count, 1, false, false);
 }
 
 LLVMValueRef
index 10efabb..f25af8b 100644 (file)
@@ -78,7 +78,8 @@ ac_build_gather_values_extended(struct ac_llvm_context *ctx,
                                LLVMValueRef *values,
                                unsigned value_count,
                                unsigned value_stride,
-                               bool load);
+                               bool load,
+                               bool always_vector);
 LLVMValueRef
 ac_build_gather_values(struct ac_llvm_context *ctx,
                       LLVMValueRef *values,
index a089d69..f75d895 100644 (file)
@@ -1017,11 +1017,6 @@ build_store_values_extended(struct ac_llvm_context *ac,
        LLVMBuilderRef builder = ac->builder;
        unsigned i;
 
-       if (value_count == 1) {
-               LLVMBuildStore(builder, vec, values[0]);
-               return;
-       }
-
        for (i = 0; i < value_count; i++) {
                LLVMValueRef ptr = values[i * value_stride];
                LLVMValueRef index = LLVMConstInt(ac->i32, i, false);
@@ -2986,7 +2981,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
                                count -= chan / 4;
                                LLVMValueRef tmp_vec = ac_build_gather_values_extended(
                                                &ctx->ac, ctx->abi->inputs + idx + chan, count,
-                                               4, false);
+                                               4, false, true);
 
                                values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
                                                                       tmp_vec,
@@ -3003,7 +2998,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
                                count -= chan / 4;
                                LLVMValueRef tmp_vec = ac_build_gather_values_extended(
                                                &ctx->ac, ctx->locals + idx + chan, count,
-                                               4, true);
+                                               4, true, true);
 
                                values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
                                                                       tmp_vec,
@@ -3031,7 +3026,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
                                count -= chan / 4;
                                LLVMValueRef tmp_vec = ac_build_gather_values_extended(
                                                &ctx->ac, ctx->outputs + idx + chan, count,
-                                               4, true);
+                                               4, true, true);
 
                                values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
                                                                       tmp_vec,
@@ -3100,13 +3095,10 @@ visit_store_var(struct ac_nir_context *ctx,
                                count -= chan / 4;
                                LLVMValueRef tmp_vec = ac_build_gather_values_extended(
                                                &ctx->ac, ctx->outputs + idx + chan, count,
-                                               stride, true);
+                                               stride, true, true);
 
-                               if (get_llvm_num_components(tmp_vec) > 1) {
-                                       tmp_vec = LLVMBuildInsertElement(ctx->ac.builder, tmp_vec,
-                                                                        value, indir_index, "");
-                               } else
-                                       tmp_vec = value;
+                               tmp_vec = LLVMBuildInsertElement(ctx->ac.builder, tmp_vec,
+                                                                value, indir_index, "");
                                build_store_values_extended(&ctx->ac, ctx->outputs + idx + chan,
                                                            count, stride, tmp_vec);
 
@@ -3129,7 +3121,7 @@ visit_store_var(struct ac_nir_context *ctx,
                                count -= chan / 4;
                                LLVMValueRef tmp_vec = ac_build_gather_values_extended(
                                        &ctx->ac, ctx->locals + idx + chan, count,
-                                       4, true);
+                                       4, true, true);
 
                                tmp_vec = LLVMBuildInsertElement(ctx->ac.builder, tmp_vec,
                                                                 value, indir_index, "");