nir: Assert memory loads are aligned
authorJason Ekstrand <jason@jlekstrand.net>
Tue, 31 Mar 2020 04:00:34 +0000 (23:00 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 6 Apr 2020 15:57:30 +0000 (15:57 +0000)
We've had alignment parameters on these operations for a while but a
bunch of places weren't setting them.  That should be resolved now so we
can start validating that they're always set.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4441>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4441>

src/compiler/nir/nir_validate.c

index 7ecca0487508c7644ce3f4765518e6dc004176bd..3ef4bbcab055fba39507163d2de0719a88364f94 100644 (file)
@@ -570,30 +570,44 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
       break;
    }
 
-   case nir_intrinsic_load_uniform:
    case nir_intrinsic_load_ubo:
+   case nir_intrinsic_load_ssbo:
+   case nir_intrinsic_load_shared:
+   case nir_intrinsic_load_global:
+   case nir_intrinsic_load_scratch:
+      /* These memory load operations must have alignments */
+      validate_assert(state,
+         util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
+      validate_assert(state, nir_intrinsic_align_offset(instr) <
+                             nir_intrinsic_align_mul(instr));
+      /* Fall through */
+
+   case nir_intrinsic_load_uniform:
    case nir_intrinsic_load_input:
    case nir_intrinsic_load_per_vertex_input:
    case nir_intrinsic_load_interpolated_input:
-   case nir_intrinsic_load_ssbo:
    case nir_intrinsic_load_output:
    case nir_intrinsic_load_per_vertex_output:
-   case nir_intrinsic_load_shared:
    case nir_intrinsic_load_push_constant:
    case nir_intrinsic_load_constant:
-   case nir_intrinsic_load_global:
-   case nir_intrinsic_load_scratch:
-      /* Memory load operations must load at least a byte */
+      /* All memory load operations must load at least a byte */
       validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);
       break;
 
-   case nir_intrinsic_store_output:
-   case nir_intrinsic_store_per_vertex_output:
    case nir_intrinsic_store_ssbo:
    case nir_intrinsic_store_shared:
    case nir_intrinsic_store_global:
    case nir_intrinsic_store_scratch:
-      /* Memory store operations must store at least a byte */
+      /* These memory store operations must also have alignments */
+      validate_assert(state,
+         util_is_power_of_two_nonzero(nir_intrinsic_align_mul(instr)));
+      validate_assert(state, nir_intrinsic_align_offset(instr) <
+                             nir_intrinsic_align_mul(instr));
+      /* Fall through */
+
+   case nir_intrinsic_store_output:
+   case nir_intrinsic_store_per_vertex_output:
+      /* All memory store operations must store at least a byte */
       validate_assert(state, nir_src_bit_size(instr->src[0]) >= 8);
       break;