From fcf2a0122e9ccf3be8d1fa3bd18b8dedbebd6acf Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 5 Mar 2019 16:06:31 -0600 Subject: [PATCH] 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 Reviewed-by: Lionel Landwerlin --- src/compiler/nir/nir_builder.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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); } -- 2.30.2