[glsl] Use structs for padding when possible

When the number of padding bytes is large and the current offset is
aligned, use structures to pad out the struct to avoid emitting too
many members and initializer values. We use structures of uint values
to avoid increasing the alignment of the containing struct.

This significantly reduces the number of members needed for large
amounts of padding, which helps with some fuzzer cases.

Also add proper handling for padding amounts smaller than 4 bytes,
which can happen with f16 members.

Change-Id: I8ccb22a64ed32a1bec92ee2e4b12c945e8409cfa
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/336055
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
Commit-Queue: Ryan Harrison <rharrison@chromium.org>
diff --git a/src/tint/lang/glsl/writer/access_test.cc b/src/tint/lang/glsl/writer/access_test.cc
index 110c8f5..3606b8e 100644
--- a/src/tint/lang/glsl/writer/access_test.cc
+++ b/src/tint/lang/glsl/writer/access_test.cc
@@ -2207,6 +2207,7 @@
 struct SB {
   int a;
   float16_t b;
+  float16_t tint_pad_0;
 };
 
 layout(binding = 0, std430)
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index 0844afd..c7ffb7d 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -210,11 +210,21 @@
     // The set of emitted structs
     Hashset<const core::type::Struct*, 4> emitted_structs_;
 
+    /// PaddingStruct holds the name of a struct that provides a certain amount of padding bytes,
+    /// along with the name of a global constant that provides a zero-initializer for that struct.
+    struct PaddingStruct {
+        std::string name;
+        std::string init;
+    };
+    PaddingStruct pad16bytes;
+    PaddingStruct pad64bytes;
+
     // For host shareable structs where we have injected padding, this map stores a pointer from the
-    // struct to a vector. The vector contains an entry for each member and padded item. Each
-    // padding item will have a `nullopt` set. Each real member will have a value of the index into
-    // the struct members list.
-    Hashmap<const core::type::Struct*, Vector<std::optional<uint32_t>, 4>, 4>
+    // struct to a vector. The vector contains an entry for each member and padded item. Each real
+    // member will have a value of the index into the struct members list, while each padding member
+    // will be represented by a string that can be used to zero-initialize it.
+    using PaddedStructEntry = std::variant<uint32_t, std::string>;
+    Hashmap<const core::type::Struct*, Vector<PaddedStructEntry, 4>, 4>
         struct_to_padding_struct_ids_;
 
     /// Block to emit for a continuing
@@ -741,27 +751,93 @@
             TINT_ICE_ON_NO_MATCH);
     }
 
+    PaddingStruct MakePaddingStruct(uint32_t bytes) {
+        TINT_IR_ASSERT(ir_, bytes % 4 == 0);
+
+        PaddingStruct result;
+        result.name = UniqueIdentifier("tint_pad" + std::to_string(bytes));
+        result.init = UniqueIdentifier("tint_pad" + std::to_string(bytes) + "_init");
+
+        TextBuffer str_buf;
+        Line(&str_buf) << "\nstruct " << result.name << " {";
+        str_buf.IncrementIndent();
+        for (uint32_t i = 0; i < bytes / 4; i++) {
+            Line(&str_buf) << "uint tint_pad_" << i << ";";
+        }
+        str_buf.DecrementIndent();
+        Line(&str_buf) << "};";
+
+        {
+            auto init = Line(&str_buf);
+            init << "const " << result.name << " " << result.init << " = " << result.name << "(";
+            for (uint32_t i = 0; i < bytes / 4; i++) {
+                if (i > 0) {
+                    init << ", ";
+                }
+                init << "0u";
+            }
+            init << ");";
+        }
+
+        preamble_buffer_.Append(str_buf);
+
+        return result;
+    }
+
     void EmitStructMembers(TextBuffer& str_buf, const core::type::Struct* str) {
         bool is_host_shareable = host_shareable_structs_.Contains(str);
-        Vector<std::optional<uint32_t>, 4> new_struct_to_old;
+        Vector<PaddedStructEntry, 4> new_struct_to_old;
+
+        uint32_t glsl_offset = 0;
 
         // Padding members need to be named consistently between different shader stages to satisfy
         // GLSL's interface matching rules.
         uint32_t pad_id = 0;
-        auto add_padding = [&](uint32_t size) {
-            auto pad_size = size / 4;
-            for (size_t i = 0; i < pad_size; ++i) {
+        auto add_padding = [&](uint32_t pad_size) {
+            while (pad_size > 0) {
                 std::string name;
                 do {
                     name = "tint_pad_" + std::to_string(pad_id++);
                 } while (str->FindMember(ir_.symbols.Get(name)));
 
-                Line(&str_buf) << "uint " << name << ";";
-                new_struct_to_old.Push(std::nullopt);
+                // If the number of padding bytes is large and the current offset is sufficiently
+                // aligned, use structures to pad out the struct to avoid emitting too many struct
+                // members and initializer values. We use structures of uint values to avoid
+                // increasing the alignment of the containing struct.
+                if (pad_size >= 64 && glsl_offset % 64 == 0) {
+                    if (pad64bytes.name.empty()) {
+                        pad64bytes = MakePaddingStruct(64);
+                    }
+
+                    Line(&str_buf) << pad64bytes.name << " " << name << ";";
+                    pad_size -= 64;
+                    glsl_offset += 64;
+                    new_struct_to_old.Push(pad64bytes.init);
+                } else if (pad_size >= 16 && glsl_offset % 16 == 0) {
+                    if (pad16bytes.name.empty()) {
+                        pad16bytes = MakePaddingStruct(16);
+                    }
+
+                    Line(&str_buf) << pad16bytes.name << " " << name << ";";
+                    pad_size -= 16;
+                    glsl_offset += 16;
+                    new_struct_to_old.Push(pad16bytes.init);
+                } else if (pad_size % 4 == 0) {
+                    Line(&str_buf) << "uint " << name << ";";
+                    pad_size -= 4;
+                    glsl_offset += 4;
+                    new_struct_to_old.Push("0u");
+                } else if (pad_size % 2 == 0) {
+                    Line(&str_buf) << "float16_t " << name << ";";
+                    pad_size -= 2;
+                    glsl_offset += 2;
+                    new_struct_to_old.Push("0.0hf");
+                } else {
+                    TINT_IR_UNREACHABLE(ir_);
+                }
             }
         };
 
-        uint32_t glsl_offset = 0;
         for (auto* mem : str->Members()) {
             auto out = Line(&str_buf);
             auto ir_offset = mem->Offset();
@@ -776,7 +852,6 @@
                 // Generate padding if required
                 if (auto padding = ir_offset - glsl_offset) {
                     add_padding(padding);
-                    glsl_offset += padding;
                 }
             }
 
@@ -1564,11 +1639,17 @@
                         }
                         needs_comma = true;
 
-                        if (!idx.has_value()) {
-                            out << "0u";
-                        } else {
-                            EmitValue(out, c->Args()[idx.value()]);
-                        }
+                        // Emit the argument that corresponds to a non-padding member, or a zero
+                        // value for a padding member.
+                        std::visit(
+                            [&](auto v) {
+                                if constexpr (std::is_same_v<decltype(v), std::uint32_t>) {
+                                    EmitValue(out, c->Args()[v]);
+                                } else {
+                                    out << v;
+                                }
+                            },
+                            idx);
                     }
                     out << ")";
                 } else {
@@ -1888,12 +1969,18 @@
                 }
                 first = false;
 
-                if (!idx.has_value()) {
-                    out << "0u";
-                } else {
-                    EmitConstant(out, c->Index(i));
-                    ++i;
-                }
+                // Emit the next value in the constant for a non-padding member, or a zero value
+                // for a padding member.
+                std::visit(
+                    [&](auto v) {
+                        if constexpr (std::is_same_v<decltype(v), std::uint32_t>) {
+                            EmitConstant(out, c->Index(i));
+                            ++i;
+                        } else {
+                            out << v;
+                        }
+                    },
+                    idx);
             }
         } else {
             for (size_t i = 0; i < s->Members().Length(); ++i) {
diff --git a/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl b/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl
index 6a8887c..cb1068f 100644
--- a/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/dynamic_index/read_f16.wgsl.expected.glsl
@@ -7,32 +7,34 @@
   int scalar_i32;
   uint scalar_u32;
   float16_t scalar_f16;
+  float16_t tint_pad_0;
   vec2 vec2_f32;
   ivec2 vec2_i32;
   uvec2 vec2_u32;
   f16vec2 vec2_f16;
-  uint tint_pad_0;
-  vec3 vec3_f32;
   uint tint_pad_1;
-  ivec3 vec3_i32;
+  vec3 vec3_f32;
   uint tint_pad_2;
-  uvec3 vec3_u32;
+  ivec3 vec3_i32;
   uint tint_pad_3;
-  f16vec3 vec3_f16;
+  uvec3 vec3_u32;
   uint tint_pad_4;
-  uint tint_pad_5;
+  f16vec3 vec3_f16;
+  float16_t tint_pad_5;
+  uint tint_pad_6;
+  uint tint_pad_7;
   vec4 vec4_f32;
   ivec4 vec4_i32;
   uvec4 vec4_u32;
   f16vec4 vec4_f16;
   mat2 mat2x2_f32;
-  uint tint_pad_6;
-  uint tint_pad_7;
+  uint tint_pad_8;
+  uint tint_pad_9;
   mat2x3 mat2x3_f32;
   mat2x4 mat2x4_f32;
   mat3x2 mat3x2_f32;
-  uint tint_pad_8;
-  uint tint_pad_9;
+  uint tint_pad_10;
+  uint tint_pad_11;
   mat3 mat3x3_f32;
   mat3x4 mat3x4_f32;
   mat4x2 mat4x2_f32;
@@ -42,14 +44,14 @@
   f16mat2x3 mat2x3_f16;
   f16mat2x4 mat2x4_f16;
   f16mat3x2 mat3x2_f16;
-  uint tint_pad_10;
+  uint tint_pad_12;
   f16mat3 mat3x3_f16;
   f16mat3x4 mat3x4_f16;
   f16mat4x2 mat4x2_f16;
   f16mat4x3 mat4x3_f16;
   f16mat4 mat4x4_f16;
-  uint tint_pad_11;
-  uint tint_pad_12;
+  uint tint_pad_13;
+  uint tint_pad_14;
   vec3 arr2_vec3_f32[2];
   f16mat4x2 arr2_mat4x2_f16[2];
 };
diff --git a/test/tint/buffer/storage/dynamic_index/write_f16.wgsl.expected.glsl b/test/tint/buffer/storage/dynamic_index/write_f16.wgsl.expected.glsl
index 821ede3..c17b88d 100644
--- a/test/tint/buffer/storage/dynamic_index/write_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/dynamic_index/write_f16.wgsl.expected.glsl
@@ -7,32 +7,34 @@
   int scalar_i32;
   uint scalar_u32;
   float16_t scalar_f16;
+  float16_t tint_pad_0;
   vec2 vec2_f32;
   ivec2 vec2_i32;
   uvec2 vec2_u32;
   f16vec2 vec2_f16;
-  uint tint_pad_0;
-  vec3 vec3_f32;
   uint tint_pad_1;
-  ivec3 vec3_i32;
+  vec3 vec3_f32;
   uint tint_pad_2;
-  uvec3 vec3_u32;
+  ivec3 vec3_i32;
   uint tint_pad_3;
-  f16vec3 vec3_f16;
+  uvec3 vec3_u32;
   uint tint_pad_4;
-  uint tint_pad_5;
+  f16vec3 vec3_f16;
+  float16_t tint_pad_5;
+  uint tint_pad_6;
+  uint tint_pad_7;
   vec4 vec4_f32;
   ivec4 vec4_i32;
   uvec4 vec4_u32;
   f16vec4 vec4_f16;
   mat2 mat2x2_f32;
-  uint tint_pad_6;
-  uint tint_pad_7;
+  uint tint_pad_8;
+  uint tint_pad_9;
   mat2x3 mat2x3_f32;
   mat2x4 mat2x4_f32;
   mat3x2 mat3x2_f32;
-  uint tint_pad_8;
-  uint tint_pad_9;
+  uint tint_pad_10;
+  uint tint_pad_11;
   mat3 mat3x3_f32;
   mat3x4 mat3x4_f32;
   mat4x2 mat4x2_f32;
@@ -42,14 +44,14 @@
   f16mat2x3 mat2x3_f16;
   f16mat2x4 mat2x4_f16;
   f16mat3x2 mat3x2_f16;
-  uint tint_pad_10;
+  uint tint_pad_12;
   f16mat3 mat3x3_f16;
   f16mat3x4 mat3x4_f16;
   f16mat4x2 mat4x2_f16;
   f16mat4x3 mat4x3_f16;
   f16mat4 mat4x4_f16;
-  uint tint_pad_11;
-  uint tint_pad_12;
+  uint tint_pad_13;
+  uint tint_pad_14;
   vec3 arr2_vec3_f32[2];
   f16mat4x2 arr2_mat4x2_f16[2];
 };
diff --git a/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl b/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl
index 9485cd2..8ec47fd 100644
--- a/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/static_index/read_f16.wgsl.expected.glsl
@@ -6,6 +6,7 @@
   int scalar_i32;
   float scalar_f32;
   float16_t scalar_f16;
+  float16_t tint_pad_0;
 };
 
 struct S {
@@ -13,32 +14,34 @@
   int scalar_i32;
   uint scalar_u32;
   float16_t scalar_f16;
+  float16_t tint_pad_0;
   vec2 vec2_f32;
   ivec2 vec2_i32;
   uvec2 vec2_u32;
   f16vec2 vec2_f16;
-  uint tint_pad_0;
-  vec3 vec3_f32;
   uint tint_pad_1;
-  ivec3 vec3_i32;
+  vec3 vec3_f32;
   uint tint_pad_2;
-  uvec3 vec3_u32;
+  ivec3 vec3_i32;
   uint tint_pad_3;
-  f16vec3 vec3_f16;
+  uvec3 vec3_u32;
   uint tint_pad_4;
-  uint tint_pad_5;
+  f16vec3 vec3_f16;
+  float16_t tint_pad_5;
+  uint tint_pad_6;
+  uint tint_pad_7;
   vec4 vec4_f32;
   ivec4 vec4_i32;
   uvec4 vec4_u32;
   f16vec4 vec4_f16;
   mat2 mat2x2_f32;
-  uint tint_pad_6;
-  uint tint_pad_7;
+  uint tint_pad_8;
+  uint tint_pad_9;
   mat2x3 mat2x3_f32;
   mat2x4 mat2x4_f32;
   mat3x2 mat3x2_f32;
-  uint tint_pad_8;
-  uint tint_pad_9;
+  uint tint_pad_10;
+  uint tint_pad_11;
   mat3 mat3x3_f32;
   mat3x4 mat3x4_f32;
   mat4x2 mat4x2_f32;
@@ -48,19 +51,19 @@
   f16mat2x3 mat2x3_f16;
   f16mat2x4 mat2x4_f16;
   f16mat3x2 mat3x2_f16;
-  uint tint_pad_10;
+  uint tint_pad_12;
   f16mat3 mat3x3_f16;
   f16mat3x4 mat3x4_f16;
   f16mat4x2 mat4x2_f16;
   f16mat4x3 mat4x3_f16;
   f16mat4 mat4x4_f16;
-  uint tint_pad_11;
-  uint tint_pad_12;
+  uint tint_pad_13;
+  uint tint_pad_14;
   vec3 arr2_vec3_f32[2];
   f16mat4x2 arr2_mat4x2_f16[2];
   Inner struct_inner;
   Inner array_struct_inner[4];
-  uint tint_pad_13;
+  uint tint_pad_15;
 };
 
 layout(binding = 0, std430)
diff --git a/test/tint/buffer/storage/static_index/write_f16.wgsl.expected.glsl b/test/tint/buffer/storage/static_index/write_f16.wgsl.expected.glsl
index 30c3b44..628e19e 100644
--- a/test/tint/buffer/storage/static_index/write_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/static_index/write_f16.wgsl.expected.glsl
@@ -6,6 +6,7 @@
   int scalar_i32;
   float scalar_f32;
   float16_t scalar_f16;
+  float16_t tint_pad_0;
 };
 
 struct S {
@@ -13,32 +14,34 @@
   int scalar_i32;
   uint scalar_u32;
   float16_t scalar_f16;
+  float16_t tint_pad_0;
   vec2 vec2_f32;
   ivec2 vec2_i32;
   uvec2 vec2_u32;
   f16vec2 vec2_f16;
-  uint tint_pad_0;
-  vec3 vec3_f32;
   uint tint_pad_1;
-  ivec3 vec3_i32;
+  vec3 vec3_f32;
   uint tint_pad_2;
-  uvec3 vec3_u32;
+  ivec3 vec3_i32;
   uint tint_pad_3;
-  f16vec3 vec3_f16;
+  uvec3 vec3_u32;
   uint tint_pad_4;
-  uint tint_pad_5;
+  f16vec3 vec3_f16;
+  float16_t tint_pad_5;
+  uint tint_pad_6;
+  uint tint_pad_7;
   vec4 vec4_f32;
   ivec4 vec4_i32;
   uvec4 vec4_u32;
   f16vec4 vec4_f16;
   mat2 mat2x2_f32;
-  uint tint_pad_6;
-  uint tint_pad_7;
+  uint tint_pad_8;
+  uint tint_pad_9;
   mat2x3 mat2x3_f32;
   mat2x4 mat2x4_f32;
   mat3x2 mat3x2_f32;
-  uint tint_pad_8;
-  uint tint_pad_9;
+  uint tint_pad_10;
+  uint tint_pad_11;
   mat3 mat3x3_f32;
   mat3x4 mat3x4_f32;
   mat4x2 mat4x2_f32;
@@ -48,19 +51,19 @@
   f16mat2x3 mat2x3_f16;
   f16mat2x4 mat2x4_f16;
   f16mat3x2 mat3x2_f16;
-  uint tint_pad_10;
+  uint tint_pad_12;
   f16mat3 mat3x3_f16;
   f16mat3x4 mat3x4_f16;
   f16mat4x2 mat4x2_f16;
   f16mat4x3 mat4x3_f16;
   f16mat4 mat4x4_f16;
-  uint tint_pad_11;
-  uint tint_pad_12;
+  uint tint_pad_13;
+  uint tint_pad_14;
   vec3 arr2_vec3_f32[2];
   f16mat4x2 arr2_mat4x2_f16[2];
   Inner struct_inner;
   Inner array_struct_inner[4];
-  uint tint_pad_13;
+  uint tint_pad_15;
 };
 
 layout(binding = 0, std430)
@@ -177,6 +180,6 @@
   v.inner.mat4x4_f16 = f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf));
   tint_store_and_preserve_padding_6(vec3[2](vec3(0.0f), vec3(0.0f)));
   v.inner.arr2_mat4x2_f16 = f16mat4x2[2](f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)));
-  tint_store_and_preserve_padding_7(Inner(0, 0.0f, 0.0hf));
-  tint_store_and_preserve_padding_9(Inner[4](Inner(0, 0.0f, 0.0hf), Inner(0, 0.0f, 0.0hf), Inner(0, 0.0f, 0.0hf), Inner(0, 0.0f, 0.0hf)));
+  tint_store_and_preserve_padding_7(Inner(0, 0.0f, 0.0hf, 0.0hf));
+  tint_store_and_preserve_padding_9(Inner[4](Inner(0, 0.0f, 0.0hf, 0.0hf), Inner(0, 0.0f, 0.0hf, 0.0hf), Inner(0, 0.0f, 0.0hf, 0.0hf), Inner(0, 0.0f, 0.0hf, 0.0hf)));
 }
diff --git a/test/tint/buffer/storage/types/struct_f16.wgsl.expected.glsl b/test/tint/buffer/storage/types/struct_f16.wgsl.expected.glsl
index 4f4eab9..5b0ab21 100644
--- a/test/tint/buffer/storage/types/struct_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/storage/types/struct_f16.wgsl.expected.glsl
@@ -4,8 +4,10 @@
 
 struct Inner {
   float16_t scalar_f16;
-  uint tint_pad_0;
+  float16_t tint_pad_0;
+  uint tint_pad_1;
   f16vec3 vec3_f16;
+  float16_t tint_pad_2;
   f16mat2x4 mat2x4_f16;
 };
 
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.glsl
index 4bcddee..70a1fa1 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f16/to_storage.wgsl.expected.glsl
@@ -2,38 +2,28 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
-struct S {
-  int before;
-  f16mat2 m;
+struct tint_pad16 {
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
   uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
+struct S {
+  int before;
+  f16mat2 m;
+  uint tint_pad_0;
+  tint_pad16 tint_pad_1;
+  tint_pad16 tint_pad_2;
+  tint_pad16 tint_pad_3;
+  int after;
   uint tint_pad_4;
   uint tint_pad_5;
   uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  int after;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
-  uint tint_pad_27;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
 };
 
 layout(binding = 0, std140)
@@ -63,7 +53,7 @@
   f16mat2 v_8 = v_2((4u + start_byte_offset));
   uint v_9 = (64u + start_byte_offset);
   uvec4 v_10 = v.inner[(v_9 / 16u)];
-  return S(v_7, v_8, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_10[((v_9 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_7, v_8, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, int(v_10[((v_9 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -82,7 +72,7 @@
   }
 }
 S[4] v_13(uint start_byte_offset) {
-  S a[4] = S[4](S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat2(f16vec2(0.0hf), f16vec2(0.0hf)), 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_14 = 0u;
     v_14 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_storage.wgsl.expected.glsl
index aba3499..b21c2e3 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x2_f32/to_storage.wgsl.expected.glsl
@@ -1,36 +1,29 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   mat2 m;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
-  uint tint_pad_4;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  int after;
   uint tint_pad_5;
   uint tint_pad_6;
   uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  int after;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
+  tint_pad16 tint_pad_10;
 };
 
 layout(binding = 0, std140)
@@ -59,7 +52,7 @@
   mat2 v_10 = v_2((8u + start_byte_offset));
   uint v_11 = (64u + start_byte_offset);
   uvec4 v_12 = v.inner[(v_11 / 16u)];
-  return S(v_9, 0u, v_10, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_9, 0u, v_10, 0u, 0u, tint_pad16_init, tint_pad16_init, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -78,7 +71,7 @@
   }
 }
 S[4] v_15(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat2(vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_16 = 0u;
     v_16 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.glsl
index 301df4a..ffc307e 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f16/to_storage.wgsl.expected.glsl
@@ -2,36 +2,29 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   f16mat2x3 m;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
-  uint tint_pad_4;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  int after;
   uint tint_pad_5;
   uint tint_pad_6;
   uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  int after;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
+  tint_pad16 tint_pad_10;
 };
 
 layout(binding = 0, std140)
@@ -67,7 +60,7 @@
   f16mat2x3 v_10 = v_2((8u + start_byte_offset));
   uint v_11 = (64u + start_byte_offset);
   uvec4 v_12 = v.inner[(v_11 / 16u)];
-  return S(v_9, 0u, v_10, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_9, 0u, v_10, 0u, 0u, tint_pad16_init, tint_pad16_init, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -86,7 +79,7 @@
   }
 }
 S[4] v_15(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat2x3(f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_16 = 0u;
     v_16 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_storage.wgsl.expected.glsl
index b9556fe..03bbfe8 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x3_f32/to_storage.wgsl.expected.glsl
@@ -1,32 +1,28 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
   mat2x3 m;
-  uint tint_pad_3;
+  tint_pad16 tint_pad_3;
+  int after;
   uint tint_pad_4;
   uint tint_pad_5;
   uint tint_pad_6;
-  int after;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
 };
 
 layout(binding = 0, std140)
@@ -55,7 +51,7 @@
   mat2x3 v_6 = v_2((16u + start_byte_offset));
   uint v_7 = (64u + start_byte_offset);
   uvec4 v_8 = v.inner[(v_7 / 16u)];
-  return S(v_5, 0u, 0u, 0u, v_6, 0u, 0u, 0u, 0u, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_5, 0u, 0u, 0u, v_6, tint_pad16_init, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -74,7 +70,7 @@
   }
 }
 S[4] v_11(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat2x3(vec3(0.0f), vec3(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_12 = 0u;
     v_12 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.glsl
index b7cef29..92bf410 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f16/to_storage.wgsl.expected.glsl
@@ -2,36 +2,29 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   f16mat2x4 m;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
-  uint tint_pad_4;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  int after;
   uint tint_pad_5;
   uint tint_pad_6;
   uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  int after;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
+  tint_pad16 tint_pad_10;
 };
 
 layout(binding = 0, std140)
@@ -63,7 +56,7 @@
   f16mat2x4 v_10 = v_2((8u + start_byte_offset));
   uint v_11 = (64u + start_byte_offset);
   uvec4 v_12 = v.inner[(v_11 / 16u)];
-  return S(v_9, 0u, v_10, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_9, 0u, v_10, 0u, 0u, tint_pad16_init, tint_pad16_init, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -82,7 +75,7 @@
   }
 }
 S[4] v_15(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat2x4(f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_16 = 0u;
     v_16 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_storage.wgsl.expected.glsl
index 7081380..d2d24c9 100644
--- a/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat2x4_f32/to_storage.wgsl.expected.glsl
@@ -1,32 +1,28 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
   mat2x4 m;
-  uint tint_pad_3;
+  tint_pad16 tint_pad_3;
+  int after;
   uint tint_pad_4;
   uint tint_pad_5;
   uint tint_pad_6;
-  int after;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
 };
 
 layout(binding = 0, std140)
@@ -51,7 +47,7 @@
   mat2x4 v_6 = v_2((16u + start_byte_offset));
   uint v_7 = (64u + start_byte_offset);
   uvec4 v_8 = v.inner[(v_7 / 16u)];
-  return S(v_5, 0u, 0u, 0u, v_6, 0u, 0u, 0u, 0u, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_5, 0u, 0u, 0u, v_6, tint_pad16_init, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -70,7 +66,7 @@
   }
 }
 S[4] v_11(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat2x4(vec4(0.0f), vec4(0.0f)), tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_12 = 0u;
     v_12 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.glsl
index da40c69..24d5f20 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f16/to_storage.wgsl.expected.glsl
@@ -2,37 +2,27 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
-struct S {
-  int before;
-  f16mat3x2 m;
+struct tint_pad16 {
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
   uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
+struct S {
+  int before;
+  f16mat3x2 m;
+  tint_pad16 tint_pad_0;
+  tint_pad16 tint_pad_1;
+  tint_pad16 tint_pad_2;
+  int after;
+  uint tint_pad_3;
   uint tint_pad_4;
   uint tint_pad_5;
-  uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  int after;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
 };
 
 layout(binding = 0, std140)
@@ -64,7 +54,7 @@
   f16mat3x2 v_10 = v_2((4u + start_byte_offset));
   uint v_11 = (64u + start_byte_offset);
   uvec4 v_12 = v.inner[(v_11 / 16u)];
-  return S(v_9, v_10, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_9, v_10, tint_pad16_init, tint_pad16_init, tint_pad16_init, int(v_12[((v_11 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -83,7 +73,7 @@
   }
 }
 S[4] v_15(uint start_byte_offset) {
-  S a[4] = S[4](S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat3x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_16 = 0u;
     v_16 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_storage.wgsl.expected.glsl
index 4a2e68e..e74c6d2 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x2_f32/to_storage.wgsl.expected.glsl
@@ -1,34 +1,27 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   mat3x2 m;
-  uint tint_pad_1;
-  uint tint_pad_2;
+  tint_pad16 tint_pad_1;
+  tint_pad16 tint_pad_2;
+  int after;
   uint tint_pad_3;
   uint tint_pad_4;
   uint tint_pad_5;
-  uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  int after;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
 };
 
 layout(binding = 0, std140)
@@ -60,7 +53,7 @@
   mat3x2 v_13 = v_2((8u + start_byte_offset));
   uint v_14 = (64u + start_byte_offset);
   uvec4 v_15 = v.inner[(v_14 / 16u)];
-  return S(v_12, 0u, v_13, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_15[((v_14 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_12, 0u, v_13, tint_pad16_init, tint_pad16_init, int(v_15[((v_14 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -79,7 +72,7 @@
   }
 }
 S[4] v_18(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat3x2(vec2(0.0f), vec2(0.0f), vec2(0.0f)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_19 = 0u;
     v_19 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.glsl
index e563878..d02bbd1 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f16/to_storage.wgsl.expected.glsl
@@ -2,34 +2,27 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   f16mat3 m;
-  uint tint_pad_1;
-  uint tint_pad_2;
+  tint_pad16 tint_pad_1;
+  tint_pad16 tint_pad_2;
+  int after;
   uint tint_pad_3;
   uint tint_pad_4;
   uint tint_pad_5;
-  uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  int after;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
 };
 
 layout(binding = 0, std140)
@@ -69,7 +62,7 @@
   f16mat3 v_13 = v_2((8u + start_byte_offset));
   uint v_14 = (64u + start_byte_offset);
   uvec4 v_15 = v.inner[(v_14 / 16u)];
-  return S(v_12, 0u, v_13, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_15[((v_14 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_12, 0u, v_13, tint_pad16_init, tint_pad16_init, int(v_15[((v_14 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -88,7 +81,7 @@
   }
 }
 S[4] v_18(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_19 = 0u;
     v_19 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_storage.wgsl.expected.glsl
index 7a3341c..d941dc9 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x3_f32/to_storage.wgsl.expected.glsl
@@ -1,6 +1,14 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
@@ -11,18 +19,9 @@
   uint tint_pad_3;
   uint tint_pad_4;
   uint tint_pad_5;
-  uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
 };
 
 layout(binding = 0, std140)
@@ -52,7 +51,7 @@
   mat3 v_6 = v_2((16u + start_byte_offset));
   uint v_7 = (64u + start_byte_offset);
   uvec4 v_8 = v.inner[(v_7 / 16u)];
-  return S(v_5, 0u, 0u, 0u, v_6, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_5, 0u, 0u, 0u, v_6, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -71,7 +70,7 @@
   }
 }
 S[4] v_11(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat3(vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_12 = 0u;
     v_12 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.glsl
index 33a66a2..9d77e54 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f16/to_storage.wgsl.expected.glsl
@@ -2,34 +2,27 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   f16mat3x4 m;
-  uint tint_pad_1;
-  uint tint_pad_2;
+  tint_pad16 tint_pad_1;
+  tint_pad16 tint_pad_2;
+  int after;
   uint tint_pad_3;
   uint tint_pad_4;
   uint tint_pad_5;
-  uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  int after;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
 };
 
 layout(binding = 0, std140)
@@ -64,7 +57,7 @@
   f16mat3x4 v_13 = v_2((8u + start_byte_offset));
   uint v_14 = (64u + start_byte_offset);
   uvec4 v_15 = v.inner[(v_14 / 16u)];
-  return S(v_12, 0u, v_13, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_15[((v_14 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_12, 0u, v_13, tint_pad16_init, tint_pad16_init, int(v_15[((v_14 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -83,7 +76,7 @@
   }
 }
 S[4] v_18(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat3x4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_19 = 0u;
     v_19 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_storage.wgsl.expected.glsl
index 64d9d44..b8b6358 100644
--- a/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat3x4_f32/to_storage.wgsl.expected.glsl
@@ -1,6 +1,14 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
@@ -11,18 +19,9 @@
   uint tint_pad_3;
   uint tint_pad_4;
   uint tint_pad_5;
-  uint tint_pad_6;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
 };
 
 layout(binding = 0, std140)
@@ -47,7 +46,7 @@
   mat3x4 v_6 = v_2((16u + start_byte_offset));
   uint v_7 = (64u + start_byte_offset);
   uvec4 v_8 = v.inner[(v_7 / 16u)];
-  return S(v_5, 0u, 0u, 0u, v_6, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_5, 0u, 0u, 0u, v_6, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -66,7 +65,7 @@
   }
 }
 S[4] v_11(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat3x4(vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_12 = 0u;
     v_12 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.glsl
index edcf193..706a38e 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f16/to_storage.wgsl.expected.glsl
@@ -2,36 +2,29 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   f16mat4x2 m;
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
-  uint tint_pad_4;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  int after;
   uint tint_pad_5;
   uint tint_pad_6;
   uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  int after;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
+  tint_pad16 tint_pad_10;
 };
 
 layout(binding = 0, std140)
@@ -65,7 +58,7 @@
   f16mat4x2 v_12 = v_2((4u + start_byte_offset));
   uint v_13 = (64u + start_byte_offset);
   uvec4 v_14 = v.inner[(v_13 / 16u)];
-  return S(v_11, v_12, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_14[((v_13 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_11, v_12, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, int(v_14[((v_13 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -84,7 +77,7 @@
   }
 }
 S[4] v_17(uint start_byte_offset) {
-  S a[4] = S[4](S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, f16mat4x2(f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf), f16vec2(0.0hf)), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_18 = 0u;
     v_18 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_storage.wgsl.expected.glsl
index ead8a16..dd0bed5 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x2_f32/to_storage.wgsl.expected.glsl
@@ -1,32 +1,28 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   mat4x2 m;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
+  tint_pad16 tint_pad_3;
+  int after;
   uint tint_pad_4;
   uint tint_pad_5;
   uint tint_pad_6;
-  int after;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
 };
 
 layout(binding = 0, std140)
@@ -61,7 +57,7 @@
   mat4x2 v_16 = v_2((8u + start_byte_offset));
   uint v_17 = (64u + start_byte_offset);
   uvec4 v_18 = v.inner[(v_17 / 16u)];
-  return S(v_15, 0u, v_16, 0u, 0u, 0u, 0u, 0u, 0u, int(v_18[((v_17 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_15, 0u, v_16, 0u, 0u, tint_pad16_init, int(v_18[((v_17 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -80,7 +76,7 @@
   }
 }
 S[4] v_21(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, mat4x2(vec2(0.0f), vec2(0.0f), vec2(0.0f), vec2(0.0f)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_22 = 0u;
     v_22 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.glsl
index 66c8b7c..6b8d9ee 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f16/to_storage.wgsl.expected.glsl
@@ -2,32 +2,28 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   f16mat4x3 m;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
+  tint_pad16 tint_pad_3;
+  int after;
   uint tint_pad_4;
   uint tint_pad_5;
   uint tint_pad_6;
-  int after;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
 };
 
 layout(binding = 0, std140)
@@ -71,7 +67,7 @@
   f16mat4x3 v_16 = v_2((8u + start_byte_offset));
   uint v_17 = (64u + start_byte_offset);
   uvec4 v_18 = v.inner[(v_17 / 16u)];
-  return S(v_15, 0u, v_16, 0u, 0u, 0u, 0u, 0u, 0u, int(v_18[((v_17 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_15, 0u, v_16, 0u, 0u, tint_pad16_init, int(v_18[((v_17 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -90,7 +86,7 @@
   }
 }
 S[4] v_21(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat4x3(f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf), f16vec3(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_22 = 0u;
     v_22 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_storage.wgsl.expected.glsl
index 26e20d2..21cede8 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x3_f32/to_storage.wgsl.expected.glsl
@@ -1,40 +1,30 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
   mat4x3 m;
-  uint tint_pad_3;
-  uint tint_pad_4;
-  uint tint_pad_5;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  tint_pad16 tint_pad_5;
+  int after;
   uint tint_pad_6;
   uint tint_pad_7;
   uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  int after;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
-  uint tint_pad_27;
-  uint tint_pad_28;
-  uint tint_pad_29;
+  tint_pad16 tint_pad_9;
+  tint_pad16 tint_pad_10;
+  tint_pad16 tint_pad_11;
 };
 
 layout(binding = 0, std140)
@@ -65,7 +55,7 @@
   mat4x3 v_6 = v_2((16u + start_byte_offset));
   uint v_7 = (128u + start_byte_offset);
   uvec4 v_8 = v.inner[(v_7 / 16u)];
-  return S(v_5, 0u, 0u, 0u, v_6, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_5, 0u, 0u, 0u, v_6, tint_pad16_init, tint_pad16_init, tint_pad16_init, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -84,7 +74,7 @@
   }
 }
 S[4] v_11(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat4x3(vec3(0.0f), vec3(0.0f), vec3(0.0f), vec3(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_12 = 0u;
     v_12 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.glsl
index 3990c83..d6bee05 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f16/to_storage.wgsl.expected.glsl
@@ -2,32 +2,28 @@
 #extension GL_AMD_gpu_shader_half_float: require
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   f16mat4 m;
   uint tint_pad_1;
   uint tint_pad_2;
-  uint tint_pad_3;
+  tint_pad16 tint_pad_3;
+  int after;
   uint tint_pad_4;
   uint tint_pad_5;
   uint tint_pad_6;
-  int after;
-  uint tint_pad_7;
-  uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad16 tint_pad_9;
 };
 
 layout(binding = 0, std140)
@@ -65,7 +61,7 @@
   f16mat4 v_16 = v_2((8u + start_byte_offset));
   uint v_17 = (64u + start_byte_offset);
   uvec4 v_18 = v.inner[(v_17 / 16u)];
-  return S(v_15, 0u, v_16, 0u, 0u, 0u, 0u, 0u, 0u, int(v_18[((v_17 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_15, 0u, v_16, 0u, 0u, tint_pad16_init, int(v_18[((v_17 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -84,7 +80,7 @@
   }
 }
 S[4] v_21(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, f16mat4(f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf), f16vec4(0.0hf)), 0u, 0u, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_22 = 0u;
     v_22 = 0u;
diff --git a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_storage.wgsl.expected.glsl b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_storage.wgsl.expected.glsl
index aa7f9c3..05b7554 100644
--- a/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_storage.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/std140/struct/mat4x4_f32/to_storage.wgsl.expected.glsl
@@ -1,40 +1,30 @@
 #version 310 es
 
 
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
 struct S {
   int before;
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
   mat4 m;
-  uint tint_pad_3;
-  uint tint_pad_4;
-  uint tint_pad_5;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  tint_pad16 tint_pad_5;
+  int after;
   uint tint_pad_6;
   uint tint_pad_7;
   uint tint_pad_8;
-  uint tint_pad_9;
-  uint tint_pad_10;
-  uint tint_pad_11;
-  uint tint_pad_12;
-  uint tint_pad_13;
-  uint tint_pad_14;
-  int after;
-  uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
-  uint tint_pad_27;
-  uint tint_pad_28;
-  uint tint_pad_29;
+  tint_pad16 tint_pad_9;
+  tint_pad16 tint_pad_10;
+  tint_pad16 tint_pad_11;
 };
 
 layout(binding = 0, std140)
@@ -59,7 +49,7 @@
   mat4 v_6 = v_2((16u + start_byte_offset));
   uint v_7 = (128u + start_byte_offset);
   uvec4 v_8 = v.inner[(v_7 / 16u)];
-  return S(v_5, 0u, 0u, 0u, v_6, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+  return S(v_5, 0u, 0u, 0u, v_6, tint_pad16_init, tint_pad16_init, tint_pad16_init, int(v_8[((v_7 & 15u) >> 2u)]), 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init);
 }
 void tint_store_and_preserve_padding(S value_param[4]) {
   {
@@ -78,7 +68,7 @@
   }
 }
 S[4] v_11(uint start_byte_offset) {
-  S a[4] = S[4](S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u), S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  S a[4] = S[4](S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init), S(0, 0u, 0u, 0u, mat4(vec4(0.0f), vec4(0.0f), vec4(0.0f), vec4(0.0f)), tint_pad16_init, tint_pad16_init, tint_pad16_init, 0, 0u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
   {
     uint v_12 = 0u;
     v_12 = 0u;
diff --git a/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.glsl b/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.glsl
index 54977ae..8dc3cd1 100644
--- a/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.glsl
+++ b/test/tint/buffer/uniform/types/struct_f16.wgsl.expected.glsl
@@ -4,8 +4,10 @@
 
 struct Inner {
   float16_t scalar_f16;
-  uint tint_pad_0;
+  float16_t tint_pad_0;
+  uint tint_pad_1;
   f16vec3 vec3_f16;
+  float16_t tint_pad_2;
   f16mat2x4 mat2x4_f16;
 };
 
@@ -48,7 +50,7 @@
   uint v_10 = (8u + start_byte_offset);
   uvec4 v_11 = v.inner[(v_10 / 16u)];
   f16vec3 v_12 = tint_bitcast_to_16bit_1(mix(v_11.xy, v_11.zw, bvec2((((v_10 & 15u) >> 2u) == 2u)))).xyz;
-  return Inner(v_9, 0u, v_12, v_2((16u + start_byte_offset)));
+  return Inner(v_9, 0.0hf, 0u, v_12, 0.0hf, v_2((16u + start_byte_offset)));
 }
 S v_13(uint start_byte_offset) {
   return S(v_7(start_byte_offset));
diff --git a/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl b/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl
index 5d548ad..5440d3e 100644
--- a/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl
+++ b/test/tint/expressions/swizzle/write/packed_vec3/f16.wgsl.expected.glsl
@@ -4,6 +4,7 @@
 
 struct S {
   f16vec3 v;
+  float16_t tint_pad_0;
 };
 
 layout(binding = 0, std430)
diff --git a/test/tint/types/functions/shader_io/attributes_on_struct_not_used_for_interface.wgsl.expected.glsl b/test/tint/types/functions/shader_io/attributes_on_struct_not_used_for_interface.wgsl.expected.glsl
index 9d2e01b..b0005be 100644
--- a/test/tint/types/functions/shader_io/attributes_on_struct_not_used_for_interface.wgsl.expected.glsl
+++ b/test/tint/types/functions/shader_io/attributes_on_struct_not_used_for_interface.wgsl.expected.glsl
@@ -3,9 +3,15 @@
 precision highp int;
 
 
-struct S {
-  float f;
-  uint u;
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
+struct tint_pad64 {
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
@@ -22,49 +28,23 @@
   uint tint_pad_13;
   uint tint_pad_14;
   uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
-  uint tint_pad_27;
-  uint tint_pad_28;
-  uint tint_pad_29;
+};
+const tint_pad64 tint_pad64_init = tint_pad64(0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+
+struct S {
+  float f;
+  uint u;
+  uint tint_pad_0;
+  uint tint_pad_1;
+  tint_pad16 tint_pad_2;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  tint_pad64 tint_pad_5;
   vec4 v;
-  uint tint_pad_30;
-  uint tint_pad_31;
-  uint tint_pad_32;
-  uint tint_pad_33;
-  uint tint_pad_34;
-  uint tint_pad_35;
-  uint tint_pad_36;
-  uint tint_pad_37;
-  uint tint_pad_38;
-  uint tint_pad_39;
-  uint tint_pad_40;
-  uint tint_pad_41;
-  uint tint_pad_42;
-  uint tint_pad_43;
-  uint tint_pad_44;
-  uint tint_pad_45;
-  uint tint_pad_46;
-  uint tint_pad_47;
-  uint tint_pad_48;
-  uint tint_pad_49;
-  uint tint_pad_50;
-  uint tint_pad_51;
-  uint tint_pad_52;
-  uint tint_pad_53;
-  uint tint_pad_54;
-  uint tint_pad_55;
-  uint tint_pad_56;
-  uint tint_pad_57;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad64 tint_pad_9;
 };
 
 layout(binding = 0, std430)
@@ -77,5 +57,5 @@
   v_1.inner.v = value_param.v;
 }
 void main() {
-  tint_store_and_preserve_padding(S(1.0f, 2u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, vec4(3.0f), 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  tint_store_and_preserve_padding(S(1.0f, 2u, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, tint_pad64_init, vec4(3.0f), tint_pad16_init, tint_pad16_init, tint_pad16_init, tint_pad64_init));
 }
diff --git a/test/tint/types/functions/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl b/test/tint/types/functions/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl
index 4099ca0..c69fd93 100644
--- a/test/tint/types/functions/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl
+++ b/test/tint/types/functions/shader_io/shared_struct_storage_buffer.wgsl.expected.glsl
@@ -3,9 +3,15 @@
 precision highp int;
 
 
-struct S {
-  float f;
-  uint u;
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
+struct tint_pad64 {
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
@@ -22,49 +28,23 @@
   uint tint_pad_13;
   uint tint_pad_14;
   uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
-  uint tint_pad_27;
-  uint tint_pad_28;
-  uint tint_pad_29;
+};
+const tint_pad64 tint_pad64_init = tint_pad64(0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+
+struct S {
+  float f;
+  uint u;
+  uint tint_pad_0;
+  uint tint_pad_1;
+  tint_pad16 tint_pad_2;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  tint_pad64 tint_pad_5;
   vec4 v;
-  uint tint_pad_30;
-  uint tint_pad_31;
-  uint tint_pad_32;
-  uint tint_pad_33;
-  uint tint_pad_34;
-  uint tint_pad_35;
-  uint tint_pad_36;
-  uint tint_pad_37;
-  uint tint_pad_38;
-  uint tint_pad_39;
-  uint tint_pad_40;
-  uint tint_pad_41;
-  uint tint_pad_42;
-  uint tint_pad_43;
-  uint tint_pad_44;
-  uint tint_pad_45;
-  uint tint_pad_46;
-  uint tint_pad_47;
-  uint tint_pad_48;
-  uint tint_pad_49;
-  uint tint_pad_50;
-  uint tint_pad_51;
-  uint tint_pad_52;
-  uint tint_pad_53;
-  uint tint_pad_54;
-  uint tint_pad_55;
-  uint tint_pad_56;
-  uint tint_pad_57;
+  tint_pad16 tint_pad_6;
+  tint_pad16 tint_pad_7;
+  tint_pad16 tint_pad_8;
+  tint_pad64 tint_pad_9;
 };
 
 layout(binding = 0, std430)
@@ -85,5 +65,5 @@
   tint_store_and_preserve_padding(v_2);
 }
 void main() {
-  frag_main_inner(S(tint_interstage_location0, tint_interstage_location1, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, gl_FragCoord, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  frag_main_inner(S(tint_interstage_location0, tint_interstage_location1, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, tint_pad64_init, gl_FragCoord, tint_pad16_init, tint_pad16_init, tint_pad16_init, tint_pad64_init));
 }
diff --git a/test/tint/types/functions/shader_io/shared_struct_storage_buffer_f16.wgsl.expected.glsl b/test/tint/types/functions/shader_io/shared_struct_storage_buffer_f16.wgsl.expected.glsl
index 7251865..243e934 100644
--- a/test/tint/types/functions/shader_io/shared_struct_storage_buffer_f16.wgsl.expected.glsl
+++ b/test/tint/types/functions/shader_io/shared_struct_storage_buffer_f16.wgsl.expected.glsl
@@ -4,9 +4,15 @@
 precision highp int;
 
 
-struct S {
-  float f;
-  uint u;
+struct tint_pad16 {
+  uint tint_pad_0;
+  uint tint_pad_1;
+  uint tint_pad_2;
+  uint tint_pad_3;
+};
+const tint_pad16 tint_pad16_init = tint_pad16(0u, 0u, 0u, 0u);
+
+struct tint_pad64 {
   uint tint_pad_0;
   uint tint_pad_1;
   uint tint_pad_2;
@@ -23,48 +29,33 @@
   uint tint_pad_13;
   uint tint_pad_14;
   uint tint_pad_15;
-  uint tint_pad_16;
-  uint tint_pad_17;
-  uint tint_pad_18;
-  uint tint_pad_19;
-  uint tint_pad_20;
-  uint tint_pad_21;
-  uint tint_pad_22;
-  uint tint_pad_23;
-  uint tint_pad_24;
-  uint tint_pad_25;
-  uint tint_pad_26;
-  uint tint_pad_27;
-  uint tint_pad_28;
-  uint tint_pad_29;
+};
+const tint_pad64 tint_pad64_init = tint_pad64(0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u);
+
+struct S {
+  float f;
+  uint u;
+  uint tint_pad_0;
+  uint tint_pad_1;
+  tint_pad16 tint_pad_2;
+  tint_pad16 tint_pad_3;
+  tint_pad16 tint_pad_4;
+  tint_pad64 tint_pad_5;
   vec4 v;
-  uint tint_pad_30;
-  uint tint_pad_31;
-  uint tint_pad_32;
-  uint tint_pad_33;
+  tint_pad16 tint_pad_6;
   float16_t x;
-  uint tint_pad_34;
-  uint tint_pad_35;
-  uint tint_pad_36;
-  uint tint_pad_37;
-  uint tint_pad_38;
-  uint tint_pad_39;
-  uint tint_pad_40;
+  float16_t tint_pad_7;
+  uint tint_pad_8;
+  uint tint_pad_9;
+  uint tint_pad_10;
+  tint_pad16 tint_pad_11;
   f16vec3 y;
-  uint tint_pad_41;
-  uint tint_pad_42;
-  uint tint_pad_43;
-  uint tint_pad_44;
-  uint tint_pad_45;
-  uint tint_pad_46;
-  uint tint_pad_47;
-  uint tint_pad_48;
-  uint tint_pad_49;
-  uint tint_pad_50;
-  uint tint_pad_51;
-  uint tint_pad_52;
-  uint tint_pad_53;
-  uint tint_pad_54;
+  float16_t tint_pad_12;
+  uint tint_pad_13;
+  uint tint_pad_14;
+  tint_pad16 tint_pad_15;
+  tint_pad16 tint_pad_16;
+  tint_pad16 tint_pad_17;
 };
 
 layout(binding = 0, std430)
@@ -91,5 +82,5 @@
   tint_store_and_preserve_padding(v_2);
 }
 void main() {
-  frag_main_inner(S(tint_interstage_location0, tint_interstage_location1, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, gl_FragCoord, 0u, 0u, 0u, 0u, tint_interstage_location2, 0u, 0u, 0u, 0u, 0u, 0u, 0u, tint_interstage_location3, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u));
+  frag_main_inner(S(tint_interstage_location0, tint_interstage_location1, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init, tint_pad64_init, gl_FragCoord, tint_pad16_init, tint_interstage_location2, 0.0hf, 0u, 0u, 0u, tint_pad16_init, tint_interstage_location3, 0.0hf, 0u, 0u, tint_pad16_init, tint_pad16_init, tint_pad16_init));
 }