glsl: refactor code to avoid static analyzer noise
authorMarcin Ślusarz <marcin.slusarz@intel.com>
Tue, 17 Aug 2021 09:17:18 +0000 (11:17 +0200)
committerMarge Bot <eric+marge@anholt.net>
Thu, 19 Aug 2021 06:59:01 +0000 (06:59 +0000)
Clang analyzer thinks struct_base_offset can be used uninitialized
because it doesn't know that glsl_type_is_struct_or_ifc returns
the same value for the same type.

Refactor the code to make it clear what is going on. As a side effect
this should be faster because glsl_get_length and
glsl_type_is_struct_or_ifc will be called only once (they are not
inline functions).

This is an alternative approach to
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12399.

Signed-off-by: Marcin Ślusarz <marcin.slusarz@intel.com>
Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12403>

src/compiler/glsl/gl_nir_link_uniform_blocks.c

index 9c95918..a2b2e9d 100644 (file)
@@ -374,18 +374,22 @@ iterate_type_fill_variables(const struct glsl_type *type,
                             struct gl_shader_program *prog,
                             struct gl_uniform_block *block)
 {
-   unsigned int struct_base_offset;
+   unsigned length = glsl_get_length(type);
+   if (length == 0)
+      return;
 
-   for (unsigned i = 0; i < glsl_get_length(type); i++) {
+   unsigned struct_base_offset;
+
+   bool struct_or_ifc = glsl_type_is_struct_or_ifc(type);
+   if (struct_or_ifc)
+      struct_base_offset = *offset;
+
+   for (unsigned i = 0; i < length; i++) {
       const struct glsl_type *field_type;
 
-      if (glsl_type_is_struct_or_ifc(type)) {
+      if (struct_or_ifc) {
          field_type = glsl_get_struct_field(type, i);
 
-         if (i == 0) {
-            struct_base_offset = *offset;
-         }
-
          *offset = struct_base_offset + glsl_get_struct_field_offset(type, i);
       } else {
          field_type = glsl_get_array_element(type);