ac/nir: add always_vector argument to ac_build_gather_values_extended
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>
This commit is contained in:
@@ -181,13 +181,14 @@ ac_build_gather_values_extended(struct ac_llvm_context *ctx,
|
|||||||
LLVMValueRef *values,
|
LLVMValueRef *values,
|
||||||
unsigned value_count,
|
unsigned value_count,
|
||||||
unsigned value_stride,
|
unsigned value_stride,
|
||||||
bool load)
|
bool load,
|
||||||
|
bool always_vector)
|
||||||
{
|
{
|
||||||
LLVMBuilderRef builder = ctx->builder;
|
LLVMBuilderRef builder = ctx->builder;
|
||||||
LLVMValueRef vec = NULL;
|
LLVMValueRef vec = NULL;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
if (value_count == 1) {
|
if (value_count == 1 && !always_vector) {
|
||||||
if (load)
|
if (load)
|
||||||
return LLVMBuildLoad(builder, values[0], "");
|
return LLVMBuildLoad(builder, values[0], "");
|
||||||
return values[0];
|
return values[0];
|
||||||
@@ -212,7 +213,7 @@ ac_build_gather_values(struct ac_llvm_context *ctx,
|
|||||||
LLVMValueRef *values,
|
LLVMValueRef *values,
|
||||||
unsigned value_count)
|
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
|
LLVMValueRef
|
||||||
|
@@ -78,7 +78,8 @@ ac_build_gather_values_extended(struct ac_llvm_context *ctx,
|
|||||||
LLVMValueRef *values,
|
LLVMValueRef *values,
|
||||||
unsigned value_count,
|
unsigned value_count,
|
||||||
unsigned value_stride,
|
unsigned value_stride,
|
||||||
bool load);
|
bool load,
|
||||||
|
bool always_vector);
|
||||||
LLVMValueRef
|
LLVMValueRef
|
||||||
ac_build_gather_values(struct ac_llvm_context *ctx,
|
ac_build_gather_values(struct ac_llvm_context *ctx,
|
||||||
LLVMValueRef *values,
|
LLVMValueRef *values,
|
||||||
|
@@ -1017,11 +1017,6 @@ build_store_values_extended(struct ac_llvm_context *ac,
|
|||||||
LLVMBuilderRef builder = ac->builder;
|
LLVMBuilderRef builder = ac->builder;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
if (value_count == 1) {
|
|
||||||
LLVMBuildStore(builder, vec, values[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < value_count; i++) {
|
for (i = 0; i < value_count; i++) {
|
||||||
LLVMValueRef ptr = values[i * value_stride];
|
LLVMValueRef ptr = values[i * value_stride];
|
||||||
LLVMValueRef index = LLVMConstInt(ac->i32, i, false);
|
LLVMValueRef index = LLVMConstInt(ac->i32, i, false);
|
||||||
@@ -2986,7 +2981,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
|
|||||||
count -= chan / 4;
|
count -= chan / 4;
|
||||||
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
||||||
&ctx->ac, ctx->abi->inputs + idx + chan, count,
|
&ctx->ac, ctx->abi->inputs + idx + chan, count,
|
||||||
4, false);
|
4, false, true);
|
||||||
|
|
||||||
values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
|
values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
|
||||||
tmp_vec,
|
tmp_vec,
|
||||||
@@ -3003,7 +2998,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
|
|||||||
count -= chan / 4;
|
count -= chan / 4;
|
||||||
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
||||||
&ctx->ac, ctx->locals + idx + chan, count,
|
&ctx->ac, ctx->locals + idx + chan, count,
|
||||||
4, true);
|
4, true, true);
|
||||||
|
|
||||||
values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
|
values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
|
||||||
tmp_vec,
|
tmp_vec,
|
||||||
@@ -3031,7 +3026,7 @@ static LLVMValueRef visit_load_var(struct ac_nir_context *ctx,
|
|||||||
count -= chan / 4;
|
count -= chan / 4;
|
||||||
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
||||||
&ctx->ac, ctx->outputs + idx + chan, count,
|
&ctx->ac, ctx->outputs + idx + chan, count,
|
||||||
4, true);
|
4, true, true);
|
||||||
|
|
||||||
values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
|
values[chan] = LLVMBuildExtractElement(ctx->ac.builder,
|
||||||
tmp_vec,
|
tmp_vec,
|
||||||
@@ -3100,13 +3095,10 @@ visit_store_var(struct ac_nir_context *ctx,
|
|||||||
count -= chan / 4;
|
count -= chan / 4;
|
||||||
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
||||||
&ctx->ac, ctx->outputs + idx + chan, count,
|
&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,
|
||||||
tmp_vec = LLVMBuildInsertElement(ctx->ac.builder, tmp_vec,
|
value, indir_index, "");
|
||||||
value, indir_index, "");
|
|
||||||
} else
|
|
||||||
tmp_vec = value;
|
|
||||||
build_store_values_extended(&ctx->ac, ctx->outputs + idx + chan,
|
build_store_values_extended(&ctx->ac, ctx->outputs + idx + chan,
|
||||||
count, stride, tmp_vec);
|
count, stride, tmp_vec);
|
||||||
|
|
||||||
@@ -3129,7 +3121,7 @@ visit_store_var(struct ac_nir_context *ctx,
|
|||||||
count -= chan / 4;
|
count -= chan / 4;
|
||||||
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
LLVMValueRef tmp_vec = ac_build_gather_values_extended(
|
||||||
&ctx->ac, ctx->locals + idx + chan, count,
|
&ctx->ac, ctx->locals + idx + chan, count,
|
||||||
4, true);
|
4, true, true);
|
||||||
|
|
||||||
tmp_vec = LLVMBuildInsertElement(ctx->ac.builder, tmp_vec,
|
tmp_vec = LLVMBuildInsertElement(ctx->ac.builder, tmp_vec,
|
||||||
value, indir_index, "");
|
value, indir_index, "");
|
||||||
|
Reference in New Issue
Block a user