summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_builder.h
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2019-03-05 16:06:31 -0600
committerJason Ekstrand <[email protected]>2019-03-07 21:20:30 +0000
commitfcf2a0122e9ccf3be8d1fa3bd18b8dedbebd6acf (patch)
treead538efd0df4ddbced08289be8fc71dc4e981bcc /src/compiler/nir/nir_builder.h
parentcd4c1458baba595aaff25ca1099c60a57d31772b (diff)
nir/builder: Cast array indices in build_deref_follower
There's no guarantee when build_deref_follower is called that the two derefs have the same bit size destination. Insert a cast on the array index in case we have differing bit sizes. While we're here, insert some asserts in build_deref_array and build_deref_ptr_as_array. The validator will catch violations here but they're easier to debug if we catch them while building. Reviewed-by: Karol Herbst <[email protected]> Reviewed-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir_builder.h')
-rw-r--r--src/compiler/nir/nir_builder.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h
index 42004a2fe54..56e76ddcb39 100644
--- a/src/compiler/nir/nir_builder.h
+++ b/src/compiler/nir/nir_builder.h
@@ -824,6 +824,8 @@ nir_build_deref_array(nir_builder *build, nir_deref_instr *parent,
glsl_type_is_matrix(parent->type) ||
glsl_type_is_vector(parent->type));
+ assert(index->bit_size == parent->dest.ssa.bit_size);
+
nir_deref_instr *deref =
nir_deref_instr_create(build->shader, nir_deref_type_array);
@@ -849,6 +851,8 @@ nir_build_deref_ptr_as_array(nir_builder *build, nir_deref_instr *parent,
parent->deref_type == nir_deref_type_ptr_as_array ||
parent->deref_type == nir_deref_type_cast);
+ assert(index->bit_size == parent->dest.ssa.bit_size);
+
nir_deref_instr *deref =
nir_deref_instr_create(build->shader, nir_deref_type_ptr_as_array);
@@ -965,7 +969,9 @@ nir_build_deref_follower(nir_builder *b, nir_deref_instr *parent,
if (leader->deref_type == nir_deref_type_array) {
assert(leader->arr.index.is_ssa);
- return nir_build_deref_array(b, parent, leader->arr.index.ssa);
+ nir_ssa_def *index = nir_i2i(b, leader->arr.index.ssa,
+ parent->dest.ssa.bit_size);
+ return nir_build_deref_array(b, parent, index);
} else {
return nir_build_deref_array_wildcard(b, parent);
}