writer/msl: Fix swizzling on packed vectors

Metal 1.x does not support swizzling on packed_vec types.
Use array-index for single element selection (permitted on LHS and RHS of assignment)
Cast the packed_vec to a vec for multiple element swizzles (not permitted as the LHS of an assignment).

Fixed: tint:1249
Change-Id: I70cbb0c22a935b06b3905d24484bdc2edfb95fc2
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/67060
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Ben Clayton <bclayton@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/docs/origin-trial-changes.md b/docs/origin-trial-changes.md
index bb96497..4e577a3 100644
--- a/docs/origin-trial-changes.md
+++ b/docs/origin-trial-changes.md
@@ -8,6 +8,10 @@
 * Deprecated texture builtin functions that accepted a `read` access controlled storage texture have been removed.
 * Storage textures must now only use the `write` access control.
 
+### Fixes
+
+* Swizzling of `vec3` types in `storage` and `uniform` buffers has been fixed for Metal 1.x. [tint:1249](https://crbug.com/tint/1249)
+
 ## Changes for M95
 
 ### New Features
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 2c90761..ecc63ca 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1953,28 +1953,55 @@
 bool GeneratorImpl::EmitMemberAccessor(
     std::ostream& out,
     const ast::MemberAccessorExpression* expr) {
-  bool paren_lhs =
-      !expr->structure
-           ->IsAnyOf<ast::ArrayAccessorExpression, ast::CallExpression,
-                     ast::IdentifierExpression, ast::MemberAccessorExpression,
-                     ast::TypeConstructorExpression>();
-  if (paren_lhs) {
-    out << "(";
-  }
-  if (!EmitExpression(out, expr->structure)) {
-    return false;
-  }
-  if (paren_lhs) {
-    out << ")";
-  }
+  auto write_lhs = [&] {
+    bool paren_lhs =
+        !expr->structure
+             ->IsAnyOf<ast::ArrayAccessorExpression, ast::CallExpression,
+                       ast::IdentifierExpression, ast::MemberAccessorExpression,
+                       ast::TypeConstructorExpression>();
+    if (paren_lhs) {
+      out << "(";
+    }
+    if (!EmitExpression(out, expr->structure)) {
+      return false;
+    }
+    if (paren_lhs) {
+      out << ")";
+    }
+    return true;
+  };
 
-  out << ".";
+  auto& sem = program_->Sem();
 
-  // Swizzles get written out directly
-  if (program_->Sem().Get(expr)->Is<sem::Swizzle>()) {
-    out << program_->Symbols().NameFor(expr->member->symbol);
-  } else if (!EmitExpression(out, expr->member)) {
-    return false;
+  if (auto* swizzle = sem.Get(expr)->As<sem::Swizzle>()) {
+    // Metal 1.x does not support swizzling of packed vector types.
+    // For single element swizzles, we can use the index operator.
+    // For multi-element swizzles, we need to cast to a regular vector type
+    // first. Note that we do not currently allow assignments to swizzles, so
+    // the casting which will convert the l-value to r-value is fine.
+    if (swizzle->Indices().size() == 1) {
+      if (!write_lhs()) {
+        return false;
+      }
+      out << "[" << swizzle->Indices()[0] << "]";
+    } else {
+      if (!EmitType(out, sem.Get(expr->structure)->Type()->UnwrapRef(), "")) {
+        return false;
+      }
+      out << "(";
+      if (!write_lhs()) {
+        return false;
+      }
+      out << ")." << program_->Symbols().NameFor(expr->member->symbol);
+    }
+  } else {
+    if (!write_lhs()) {
+      return false;
+    }
+    out << ".";
+    if (!EmitExpression(out, expr->member)) {
+      return false;
+    }
   }
 
   return true;
diff --git a/src/writer/msl/generator_impl_function_test.cc b/src/writer/msl/generator_impl_function_test.cc
index af27b79..c384e5f 100644
--- a/src/writer/msl/generator_impl_function_test.cc
+++ b/src/writer/msl/generator_impl_function_test.cc
@@ -147,7 +147,7 @@
 };
 
 float frag_main_inner(float4 coord) {
-  return coord.x;
+  return coord[0];
 }
 
 fragment tint_symbol frag_main(float4 coord [[position]]) {
@@ -457,7 +457,7 @@
 };
 
 float sub_func(constant UBO& ubo, float param) {
-  return ubo.coord.x;
+  return ubo.coord[0];
 }
 
 fragment void frag_main(constant UBO& ubo [[buffer(0)]]) {
diff --git a/src/writer/msl/generator_impl_member_accessor_test.cc b/src/writer/msl/generator_impl_member_accessor_test.cc
index 9623a2b..b511cab 100644
--- a/src/writer/msl/generator_impl_member_accessor_test.cc
+++ b/src/writer/msl/generator_impl_member_accessor_test.cc
@@ -43,7 +43,7 @@
   GeneratorImpl& gen = Build();
   std::stringstream out;
   ASSERT_TRUE(gen.EmitExpression(out, expr)) << gen.error();
-  EXPECT_EQ(out.str(), "my_vec.xyz");
+  EXPECT_EQ(out.str(), "float4(my_vec).xyz");
 }
 
 TEST_F(MslGeneratorImplTest, EmitExpression_MemberAccessor_Swizzle_gbr) {
@@ -55,7 +55,7 @@
   GeneratorImpl& gen = Build();
   std::stringstream out;
   ASSERT_TRUE(gen.EmitExpression(out, expr)) << gen.error();
-  EXPECT_EQ(out.str(), "my_vec.gbr");
+  EXPECT_EQ(out.str(), "float4(my_vec).gbr");
 }
 
 }  // namespace
diff --git a/test/access/let/matrix.spvasm.expected.msl b/test/access/let/matrix.spvasm.expected.msl
index 2123a38..74a4b93 100644
--- a/test/access/let/matrix.spvasm.expected.msl
+++ b/test/access/let/matrix.spvasm.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 void main_1() {
-  float const x_24 = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f))[1u].y;
+  float const x_24 = float3x3(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f), float3(7.0f, 8.0f, 9.0f))[1u][1];
   return;
 }
 
diff --git a/test/access/let/vector.spvasm.expected.msl b/test/access/let/vector.spvasm.expected.msl
index d644226..354e9b1 100644
--- a/test/access/let/vector.spvasm.expected.msl
+++ b/test/access/let/vector.spvasm.expected.msl
@@ -2,9 +2,9 @@
 
 using namespace metal;
 void main_1() {
-  float const x_11 = float3(1.0f, 2.0f, 3.0f).y;
-  float2 const x_13 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).z);
-  float3 const x_14 = float3(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y);
+  float const x_11 = float3(1.0f, 2.0f, 3.0f)[1];
+  float2 const x_13 = float2(float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[2]);
+  float3 const x_14 = float3(float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[2], float3(1.0f, 2.0f, 3.0f)[1]);
   return;
 }
 
diff --git a/test/access/let/vector.wgsl.expected.msl b/test/access/let/vector.wgsl.expected.msl
index e690077..13a9b75 100644
--- a/test/access/let/vector.wgsl.expected.msl
+++ b/test/access/let/vector.wgsl.expected.msl
@@ -3,9 +3,9 @@
 using namespace metal;
 kernel void tint_symbol() {
   float3 const v = float3(1.0f, 2.0f, 3.0f);
-  float const scalar = v.y;
-  float2 const swizzle2 = v.xz;
-  float3 const swizzle3 = v.xzy;
+  float const scalar = v[1];
+  float2 const swizzle2 = float3(v).xz;
+  float3 const swizzle3 = float3(v).xzy;
   return;
 }
 
diff --git a/test/access/var/matrix.spvasm.expected.msl b/test/access/var/matrix.spvasm.expected.msl
index e22abd0..ae11058 100644
--- a/test/access/var/matrix.spvasm.expected.msl
+++ b/test/access/var/matrix.spvasm.expected.msl
@@ -4,7 +4,7 @@
 void main_1() {
   float3x3 m = float3x3(float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f), float3(0.0f, 0.0f, 0.0f));
   float3 const x_15 = m[1];
-  float const x_16 = x_15.y;
+  float const x_16 = x_15[1];
   return;
 }
 
diff --git a/test/access/var/vector.spvasm.expected.msl b/test/access/var/vector.spvasm.expected.msl
index a0bb9e4..a6963f9 100644
--- a/test/access/var/vector.spvasm.expected.msl
+++ b/test/access/var/vector.spvasm.expected.msl
@@ -3,11 +3,11 @@
 using namespace metal;
 void main_1() {
   float3 v = float3(0.0f, 0.0f, 0.0f);
-  float const x_14 = v.y;
+  float const x_14 = v[1];
   float3 const x_16 = v;
-  float2 const x_17 = float2(x_16.x, x_16.z);
+  float2 const x_17 = float2(x_16[0], x_16[2]);
   float3 const x_18 = v;
-  float3 const x_19 = float3(x_18.x, x_18.z, x_18.y);
+  float3 const x_19 = float3(x_18[0], x_18[2], x_18[1]);
   return;
 }
 
diff --git a/test/access/var/vector.wgsl.expected.msl b/test/access/var/vector.wgsl.expected.msl
index 542eae7..e965ea7 100644
--- a/test/access/var/vector.wgsl.expected.msl
+++ b/test/access/var/vector.wgsl.expected.msl
@@ -3,9 +3,9 @@
 using namespace metal;
 kernel void tint_symbol() {
   float3 v = 0.0f;
-  float const scalar = v.y;
-  float2 const swizzle2 = v.xz;
-  float3 const swizzle3 = v.xzy;
+  float const scalar = v[1];
+  float2 const swizzle2 = float3(v).xz;
+  float3 const swizzle3 = float3(v).xzy;
   return;
 }
 
diff --git a/test/bug/dawn/947.wgsl.expected.msl b/test/bug/dawn/947.wgsl.expected.msl
index 11bf563..ff00746 100644
--- a/test/bug/dawn/947.wgsl.expected.msl
+++ b/test/bug/dawn/947.wgsl.expected.msl
@@ -27,7 +27,7 @@
   tint_array_wrapper texcoord = {.arr={float2(-0.5f, 0.0f), float2(1.5f, 0.0f), float2(0.5f, 2.0f)}};
   VertexOutputs output = {};
   output.position = float4(((texcoord.arr[VertexIndex] * 2.0f) - float2(1.0f, 1.0f)), 0.0f, 1.0f);
-  bool flipY = (uniforms.u_scale.y < 0.0f);
+  bool flipY = (uniforms.u_scale[1] < 0.0f);
   if (flipY) {
     output.texcoords = ((((texcoord.arr[VertexIndex] * uniforms.u_scale) + uniforms.u_offset) * float2(1.0f, -1.0f)) + float2(0.0f, 1.0f));
   } else {
diff --git a/test/bug/tint/1046.wgsl.expected.msl b/test/bug/tint/1046.wgsl.expected.msl
index 5f5c846..ac5baa1 100644
--- a/test/bug/tint/1046.wgsl.expected.msl
+++ b/test/bug/tint/1046.wgsl.expected.msl
@@ -42,7 +42,7 @@
   } else {
     if ((uniforms.color_source == 1u)) {
       color = tint_symbol.normal;
-      color.a = 1.0f;
+      color[3] = 1.0f;
     } else {
       if ((uniforms.color_source == 2u)) {
         color = uniforms.color;
diff --git a/test/bug/tint/1088.spvasm.expected.msl b/test/bug/tint/1088.spvasm.expected.msl
index 6010645..5a11505 100644
--- a/test/bug/tint/1088.spvasm.expected.msl
+++ b/test/bug/tint/1088.spvasm.expected.msl
@@ -36,24 +36,24 @@
   float4 q = 0.0f;
   float3 p = 0.0f;
   float3 const x_13 = *(tint_symbol_5);
-  q = float4(x_13.x, x_13.y, x_13.z, 1.0f);
+  q = float4(x_13[0], x_13[1], x_13[2], 1.0f);
   float4 const x_21 = q;
-  p = float3(x_21.x, x_21.y, x_21.z);
-  float const x_27 = p.x;
+  p = float3(x_21[0], x_21[1], x_21[2]);
+  float const x_27 = p[0];
   float const x_41 = x_14.test.arr[0].el;
-  float const x_45 = (*(tint_symbol_5)).y;
+  float const x_45 = (*(tint_symbol_5))[1];
   float const x_49 = x_14.time;
-  p.x = (x_27 + sin(((x_41 * x_45) + x_49)));
-  float const x_55 = p.y;
+  p[0] = (x_27 + sin(((x_41 * x_45) + x_49)));
+  float const x_55 = p[1];
   float const x_57 = x_14.time;
-  p.y = (x_55 + sin((x_57 + 4.0f)));
+  p[1] = (x_55 + sin((x_57 + 4.0f)));
   float4x4 const x_69 = x_14.worldViewProjection;
   float3 const x_70 = p;
-  *(tint_symbol_6) = (x_69 * float4(x_70.x, x_70.y, x_70.z, 1.0f));
+  *(tint_symbol_6) = (x_69 * float4(x_70[0], x_70[1], x_70[2], 1.0f));
   float2 const x_83 = *(tint_symbol_7);
   *(tint_symbol_8) = x_83;
-  float const x_87 = (*(tint_symbol_6)).y;
-  (*(tint_symbol_6)).y = (x_87 * -1.0f);
+  float const x_87 = (*(tint_symbol_6))[1];
+  (*(tint_symbol_6))[1] = (x_87 * -1.0f);
   return;
 }
 
diff --git a/test/bug/tint/1113.wgsl.expected.msl b/test/bug/tint/1113.wgsl.expected.msl
index 663d47f..52cc00c 100644
--- a/test/bug/tint/1113.wgsl.expected.msl
+++ b/test/bug/tint/1113.wgsl.expected.msl
@@ -53,20 +53,20 @@
 };
 
 float3 toVoxelPos(constant Uniforms& uniforms, float3 position) {
-  float3 bbMin = float3(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
-  float3 bbMax = float3(uniforms.bbMax.x, uniforms.bbMax.y, uniforms.bbMax.z);
+  float3 bbMin = float3(uniforms.bbMin[0], uniforms.bbMin[1], uniforms.bbMin[2]);
+  float3 bbMax = float3(uniforms.bbMax[0], uniforms.bbMax[1], uniforms.bbMax[2]);
   float3 bbSize = (bbMax - bbMin);
-  float cubeSize = fmax(fmax(bbSize.x, bbSize.y), bbSize.z);
+  float cubeSize = fmax(fmax(bbSize[0], bbSize[1]), bbSize[2]);
   float gridSize = float(uniforms.gridSize);
-  float gx = ((gridSize * (position.x - uniforms.bbMin.x)) / cubeSize);
-  float gy = ((gridSize * (position.y - uniforms.bbMin.y)) / cubeSize);
-  float gz = ((gridSize * (position.z - uniforms.bbMin.z)) / cubeSize);
+  float gx = ((gridSize * (position[0] - uniforms.bbMin[0])) / cubeSize);
+  float gy = ((gridSize * (position[1] - uniforms.bbMin[1])) / cubeSize);
+  float gz = ((gridSize * (position[2] - uniforms.bbMin[2])) / cubeSize);
   return float3(gx, gy, gz);
 }
 
 uint toIndex1D(uint gridSize, float3 voxelPos) {
   uint3 icoord = uint3(voxelPos);
-  return ((icoord.x + (gridSize * icoord.y)) + ((gridSize * gridSize) * icoord.z));
+  return ((icoord[0] + (gridSize * icoord[1])) + ((gridSize * gridSize) * icoord[2]));
 }
 
 uint3 toIndex3D(uint gridSize, uint index) {
@@ -91,7 +91,7 @@
 }
 
 void main_count_inner(constant Uniforms& uniforms, device Dbg& dbg, device AU32s& counters, device U32s& indices, device F32s& positions, device AI32s& LUT, uint3 GlobalInvocationID) {
-  uint triangleIndex = GlobalInvocationID.x;
+  uint triangleIndex = GlobalInvocationID[0];
   if ((triangleIndex >= uniforms.numTriangles)) {
     return;
   }
@@ -108,9 +108,9 @@
   uint acefg = atomic_fetch_add_explicit(&(counters.values[voxelIndex]), 1u, memory_order_relaxed);
   if ((triangleIndex == 0u)) {
     dbg.value0 = uniforms.gridSize;
-    dbg.value_f32_0 = center.x;
-    dbg.value_f32_1 = center.y;
-    dbg.value_f32_2 = center.z;
+    dbg.value_f32_0 = center[0];
+    dbg.value_f32_1 = center[1];
+    dbg.value_f32_2 = center[2];
   }
 }
 
@@ -120,7 +120,7 @@
 }
 
 void main_create_lut_inner(constant Uniforms& uniforms, device Dbg& dbg, device AU32s& counters, device U32s& indices, device F32s& positions, device AI32s& LUT, uint3 GlobalInvocationID) {
-  uint voxelIndex = GlobalInvocationID.x;
+  uint voxelIndex = GlobalInvocationID[0];
   doIgnore(uniforms, dbg, counters, indices, positions, LUT);
   uint maxVoxels = ((uniforms.gridSize * uniforms.gridSize) * uniforms.gridSize);
   if ((voxelIndex >= maxVoxels)) {
@@ -140,7 +140,7 @@
 }
 
 void main_sort_triangles_inner(constant Uniforms& uniforms, device Dbg& dbg, device AU32s& counters, device U32s& indices, device F32s& positions, device AI32s& LUT, uint3 GlobalInvocationID) {
-  uint triangleIndex = GlobalInvocationID.x;
+  uint triangleIndex = GlobalInvocationID[0];
   doIgnore(uniforms, dbg, counters, indices, positions, LUT);
   if ((triangleIndex >= uniforms.numTriangles)) {
     return;
diff --git a/test/bug/tint/1121.wgsl.expected.msl b/test/bug/tint/1121.wgsl.expected.msl
index c7eb13c..9592e5a 100644
--- a/test/bug/tint/1121.wgsl.expected.msl
+++ b/test/bug/tint/1121.wgsl.expected.msl
@@ -53,20 +53,20 @@
 };
 
 void tint_symbol_inner(constant Config& config, constant Uniforms& uniforms, device LightsBuffer& lightsBuffer, device Tiles& tileLightId, uint3 GlobalInvocationID) {
-  uint index = GlobalInvocationID.x;
+  uint index = GlobalInvocationID[0];
   if ((index >= config.numLights)) {
     return;
   }
-  lightsBuffer.lights[index].position.y = ((lightsBuffer.lights[index].position.y - 0.100000001f) + (0.001f * (float(index) - (64.0f * floor((float(index) / 64.0f))))));
-  if ((lightsBuffer.lights[index].position.y < uniforms.min.y)) {
-    lightsBuffer.lights[index].position.y = uniforms.max.y;
+  lightsBuffer.lights[index].position[1] = ((lightsBuffer.lights[index].position[1] - 0.100000001f) + (0.001f * (float(index) - (64.0f * floor((float(index) / 64.0f))))));
+  if ((lightsBuffer.lights[index].position[1] < uniforms.min[1])) {
+    lightsBuffer.lights[index].position[1] = uniforms.max[1];
   }
   float4x4 M = uniforms.projectionMatrix;
   float viewNear = (-(M[3][2]) / (-1.0f + M[2][2]));
   float viewFar = (-(M[3][2]) / (1.0f + M[2][2]));
   float4 lightPos = lightsBuffer.lights[index].position;
   lightPos = (uniforms.viewMatrix * lightPos);
-  lightPos = (lightPos / lightPos.w);
+  lightPos = (lightPos / lightPos[3]);
   float lightRadius = lightsBuffer.lights[index].radius;
   float4 boxMin = (lightPos - float4(float3(lightRadius), 0.0f));
   float4 boxMax = (lightPos + float4(float3(lightRadius), 0.0f));
@@ -79,33 +79,33 @@
   for(int y_1 = 0; (y_1 < TILE_COUNT_Y); y_1 = as_type<int>((as_type<uint>(y_1) + as_type<uint>(1)))) {
     for(int x_1 = 0; (x_1 < TILE_COUNT_X); x_1 = as_type<int>((as_type<uint>(x_1) + as_type<uint>(1)))) {
       int2 tilePixel0Idx = int2(as_type<int>((as_type<uint>(x_1) * as_type<uint>(TILE_SIZE))), as_type<int>((as_type<uint>(y_1) * as_type<uint>(TILE_SIZE))));
-      float2 floorCoord = (((2.0f * float2(tilePixel0Idx)) / uniforms.fullScreenSize.xy) - float2(1.0f));
-      float2 ceilCoord = (((2.0f * float2(as_type<int2>((as_type<uint2>(tilePixel0Idx) + as_type<uint2>(int2(TILE_SIZE)))))) / uniforms.fullScreenSize.xy) - float2(1.0f));
-      float2 viewFloorCoord = float2((((-(viewNear) * floorCoord.x) - (M[2][0] * viewNear)) / M[0][0]), (((-(viewNear) * floorCoord.y) - (M[2][1] * viewNear)) / M[1][1]));
-      float2 viewCeilCoord = float2((((-(viewNear) * ceilCoord.x) - (M[2][0] * viewNear)) / M[0][0]), (((-(viewNear) * ceilCoord.y) - (M[2][1] * viewNear)) / M[1][1]));
-      frustumPlanes.arr[0] = float4(1.0f, 0.0f, (-(viewFloorCoord.x) / viewNear), 0.0f);
-      frustumPlanes.arr[1] = float4(-1.0f, 0.0f, (viewCeilCoord.x / viewNear), 0.0f);
-      frustumPlanes.arr[2] = float4(0.0f, 1.0f, (-(viewFloorCoord.y) / viewNear), 0.0f);
-      frustumPlanes.arr[3] = float4(0.0f, -1.0f, (viewCeilCoord.y / viewNear), 0.0f);
+      float2 floorCoord = (((2.0f * float2(tilePixel0Idx)) / float4(uniforms.fullScreenSize).xy) - float2(1.0f));
+      float2 ceilCoord = (((2.0f * float2(as_type<int2>((as_type<uint2>(tilePixel0Idx) + as_type<uint2>(int2(TILE_SIZE)))))) / float4(uniforms.fullScreenSize).xy) - float2(1.0f));
+      float2 viewFloorCoord = float2((((-(viewNear) * floorCoord[0]) - (M[2][0] * viewNear)) / M[0][0]), (((-(viewNear) * floorCoord[1]) - (M[2][1] * viewNear)) / M[1][1]));
+      float2 viewCeilCoord = float2((((-(viewNear) * ceilCoord[0]) - (M[2][0] * viewNear)) / M[0][0]), (((-(viewNear) * ceilCoord[1]) - (M[2][1] * viewNear)) / M[1][1]));
+      frustumPlanes.arr[0] = float4(1.0f, 0.0f, (-(viewFloorCoord[0]) / viewNear), 0.0f);
+      frustumPlanes.arr[1] = float4(-1.0f, 0.0f, (viewCeilCoord[0] / viewNear), 0.0f);
+      frustumPlanes.arr[2] = float4(0.0f, 1.0f, (-(viewFloorCoord[1]) / viewNear), 0.0f);
+      frustumPlanes.arr[3] = float4(0.0f, -1.0f, (viewCeilCoord[1] / viewNear), 0.0f);
       float dp = 0.0f;
       for(uint i = 0u; (i < 6u); i = (i + 1u)) {
         float4 p = 0.0f;
-        if ((frustumPlanes.arr[i].x > 0.0f)) {
-          p.x = boxMax.x;
+        if ((frustumPlanes.arr[i][0] > 0.0f)) {
+          p[0] = boxMax[0];
         } else {
-          p.x = boxMin.x;
+          p[0] = boxMin[0];
         }
-        if ((frustumPlanes.arr[i].y > 0.0f)) {
-          p.y = boxMax.y;
+        if ((frustumPlanes.arr[i][1] > 0.0f)) {
+          p[1] = boxMax[1];
         } else {
-          p.y = boxMin.y;
+          p[1] = boxMin[1];
         }
-        if ((frustumPlanes.arr[i].z > 0.0f)) {
-          p.z = boxMax.z;
+        if ((frustumPlanes.arr[i][2] > 0.0f)) {
+          p[2] = boxMax[2];
         } else {
-          p.z = boxMin.z;
+          p[2] = boxMin[2];
         }
-        p.w = 1.0f;
+        p[3] = 1.0f;
         dp = (dp + fmin(0.0f, dot(p, frustumPlanes.arr[i])));
       }
       if ((dp >= 0.0f)) {
@@ -117,7 +117,7 @@
         if ((offset >= config.numTileLightSlot)) {
           continue;
         }
-        tileLightId.data.arr[tileId].lightId.arr[offset] = GlobalInvocationID.x;
+        tileLightId.data.arr[tileId].lightId.arr[offset] = GlobalInvocationID[0];
       }
     }
   }
diff --git a/test/bug/tint/219.spvasm.expected.msl b/test/bug/tint/219.spvasm.expected.msl
index 103a45b..8caf787 100644
--- a/test/bug/tint/219.spvasm.expected.msl
+++ b/test/bug/tint/219.spvasm.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 float x_200(thread float2* const x_201) {
-  float const x_212 = (*(x_201)).x;
+  float const x_212 = (*(x_201))[0];
   return x_212;
 }
 
diff --git a/test/bug/tint/403.wgsl.expected.msl b/test/bug/tint/403.wgsl.expected.msl
index 9f88b26..8e87d26 100644
--- a/test/bug/tint/403.wgsl.expected.msl
+++ b/test/bug/tint/403.wgsl.expected.msl
@@ -23,7 +23,7 @@
   indexable = tint_symbol_2;
   float2 const x_51 = indexable.arr[x_46];
   float2 const x_52 = (float2x2((x_23[0u] + x_28[0u]), (x_23[1u] + x_28[1u])) * x_51);
-  return float4(x_52.x, x_52.y, 0.0f, 1.0f);
+  return float4(x_52[0], x_52[1], 0.0f, 1.0f);
 }
 
 vertex tint_symbol_1 tint_symbol(uint gl_VertexIndex [[vertex_id]], constant vertexUniformBuffer1& x_20 [[buffer(0)]], constant vertexUniformBuffer2& x_26 [[buffer(1)]]) {
diff --git a/test/bug/tint/413.spvasm.expected.msl b/test/bug/tint/413.spvasm.expected.msl
index 982307b..d62ec29 100644
--- a/test/bug/tint/413.spvasm.expected.msl
+++ b/test/bug/tint/413.spvasm.expected.msl
@@ -5,8 +5,8 @@
   uint4 srcValue = 0u;
   uint4 const x_18 = tint_symbol_1.read(uint2(int2(0, 0)), 0);
   srcValue = x_18;
-  uint const x_22 = srcValue.x;
-  srcValue.x = (x_22 + as_type<uint>(1));
+  uint const x_22 = srcValue[0];
+  srcValue[0] = (x_22 + as_type<uint>(1));
   uint4 const x_27 = srcValue;
   tint_symbol_2.write(x_27, uint2(int2(0, 0)));
   return;
diff --git a/test/bug/tint/453.wgsl.expected.msl b/test/bug/tint/453.wgsl.expected.msl
index 728fc2f..d51ef16 100644
--- a/test/bug/tint/453.wgsl.expected.msl
+++ b/test/bug/tint/453.wgsl.expected.msl
@@ -5,10 +5,10 @@
   uint4 srcValue = 0u;
   uint4 const x_22 = tint_symbol_1.read(uint2(int2(0, 0)), 0);
   srcValue = x_22;
-  uint const x_24 = srcValue.x;
+  uint const x_24 = srcValue[0];
   uint const x_25 = (x_24 + 1u);
   uint4 const x_27 = srcValue;
-  tint_symbol_2.write(x_27.xxxx, uint2(int2(0, 0)));
+  tint_symbol_2.write(uint4(x_27).xxxx, uint2(int2(0, 0)));
   return;
 }
 
diff --git a/test/bug/tint/534.wgsl.expected.msl b/test/bug/tint/534.wgsl.expected.msl
index e294678..584bdc7 100644
--- a/test/bug/tint/534.wgsl.expected.msl
+++ b/test/bug/tint/534.wgsl.expected.msl
@@ -17,10 +17,10 @@
 
 void tint_symbol_inner(constant Uniforms& uniforms, device OutputBuf& output, uint3 GlobalInvocationID, texture2d<float, access::sample> tint_symbol_1, texture2d<float, access::sample> tint_symbol_2) {
   int2 size = int2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
-  int2 dstTexCoord = int2(GlobalInvocationID.xy);
+  int2 dstTexCoord = int2(uint3(GlobalInvocationID).xy);
   int2 srcTexCoord = dstTexCoord;
   if ((uniforms.dstTextureFlipY == 1u)) {
-    srcTexCoord.y = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(size.y) - as_type<uint>(dstTexCoord.y)))) - as_type<uint>(1)));
+    srcTexCoord[1] = as_type<int>((as_type<uint>(as_type<int>((as_type<uint>(size[1]) - as_type<uint>(dstTexCoord[1])))) - as_type<uint>(1)));
   }
   float4 srcColor = tint_symbol_1.read(uint2(srcTexCoord), 0);
   float4 dstColor = tint_symbol_2.read(uint2(dstTexCoord), 0);
@@ -31,7 +31,7 @@
     srcColorBits[i] = ConvertToFp16FloatValue(srcColor[i]);
     success = (success && (srcColorBits[i] == dstColorBits[i]));
   }
-  uint outputIndex = ((GlobalInvocationID.y * uint(size.x)) + GlobalInvocationID.x);
+  uint outputIndex = ((GlobalInvocationID[1] * uint(size[0])) + GlobalInvocationID[0]);
   if (success) {
     output.result[outputIndex] = uint(1);
   } else {
diff --git a/test/bug/tint/744.wgsl.expected.msl b/test/bug/tint/744.wgsl.expected.msl
index 1bdfd21..1a3cffa 100644
--- a/test/bug/tint/744.wgsl.expected.msl
+++ b/test/bug/tint/744.wgsl.expected.msl
@@ -11,16 +11,16 @@
 };
 
 void tint_symbol_inner(constant Uniforms& uniforms, const device Matrix& firstMatrix, const device Matrix& secondMatrix, device Matrix& resultMatrix, uint3 global_id) {
-  uint2 const resultCell = uint2(global_id.y, global_id.x);
-  uint const dimInner = uniforms.aShape.y;
-  uint const dimOutter = uniforms.outShape.y;
+  uint2 const resultCell = uint2(global_id[1], global_id[0]);
+  uint const dimInner = uniforms.aShape[1];
+  uint const dimOutter = uniforms.outShape[1];
   uint result = 0u;
   for(uint i = 0u; (i < dimInner); i = (i + 1u)) {
-    uint const a = (i + (resultCell.x * dimInner));
-    uint const b = (resultCell.y + (i * dimOutter));
+    uint const a = (i + (resultCell[0] * dimInner));
+    uint const b = (resultCell[1] + (i * dimOutter));
     result = (result + (firstMatrix.numbers[a] * secondMatrix.numbers[b]));
   }
-  uint const index = (resultCell.y + (resultCell.x * dimOutter));
+  uint const index = (resultCell[1] + (resultCell[0] * dimOutter));
   resultMatrix.numbers[index] = result;
 }
 
diff --git a/test/bug/tint/749.spvasm.expected.msl b/test/bug/tint/749.spvasm.expected.msl
index dd020c9..7717716 100644
--- a/test/bug/tint/749.spvasm.expected.msl
+++ b/test/bug/tint/749.spvasm.expected.msl
@@ -22,7 +22,7 @@
   int const x_932 = temp;
   temp = 0;
   temp = x_932;
-  float3 const x_523 = float3(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).z);
+  float3 const x_523 = float3(float3(1.0f, 2.0f, 3.0f)[2], float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[2]);
   int const x_933 = *(i);
   *(i) = 0;
   *(i) = x_933;
@@ -30,7 +30,7 @@
   int const x_934 = *(j);
   *(j) = 0;
   *(j) = x_934;
-  float3 const x_524 = float3(x_523.y, x_523.x, x_523.y);
+  float3 const x_524 = float3(x_523[1], x_523[0], x_523[1]);
   int const x_935 = temp;
   temp = 0;
   temp = x_935;
@@ -46,7 +46,7 @@
   int const x_938 = *(j);
   *(j) = 0;
   *(j) = x_938;
-  float3 const x_525 = float3(x_523.z, float3(1.0f, 2.0f, 3.0f).x, x_523.y);
+  float3 const x_525 = float3(x_523[2], float3(1.0f, 2.0f, 3.0f)[0], x_523[1]);
   int const x_939 = *(i);
   *(i) = 0;
   *(i) = x_939;
@@ -58,7 +58,7 @@
   int const x_941 = *(i);
   *(i) = 0;
   *(i) = x_941;
-  float3 const x_526 = float3(x_525.x, x_525.z, x_525.z);
+  float3 const x_526 = float3(x_525[0], x_525[2], x_525[2]);
   int const x_942 = (*(tint_symbol_81)).numbers.arr[x_30_save];
   (*(tint_symbol_81)).numbers.arr[x_30_save] = 0;
   (*(tint_symbol_81)).numbers.arr[x_30_save] = x_942;
@@ -69,16 +69,16 @@
   QuicksortObject const tint_symbol_3 = {.numbers=tint_symbol_2};
   *(tint_symbol_81) = tint_symbol_3;
   *(tint_symbol_81) = x_943;
-  float2 const x_527 = float2(x_526.x, x_526.x);
+  float2 const x_527 = float2(x_526[0], x_526[0]);
   int const x_36_save = x_32;
-  float3 const x_528 = float3(x_524.x, x_524.z, x_524.x);
+  float3 const x_528 = float3(x_524[0], x_524[2], x_524[0]);
   (*(tint_symbol_81)).numbers.arr[x_36_save] = x_35;
   QuicksortObject const x_944 = *(tint_symbol_81);
   tint_array_wrapper const tint_symbol_4 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_5 = {.numbers=tint_symbol_4};
   *(tint_symbol_81) = tint_symbol_5;
   *(tint_symbol_81) = x_944;
-  float3 const x_529 = float3(x_526.y, x_526.z, x_526.x);
+  float3 const x_529 = float3(x_526[1], x_526[2], x_526[0]);
   int const x_945 = *(i);
   *(i) = 0;
   *(i) = x_945;
@@ -86,7 +86,7 @@
   int const x_946 = temp;
   temp = 0;
   temp = x_946;
-  float2 const x_530 = float2(x_529.z, x_529.y);
+  float2 const x_530 = float2(x_529[2], x_529[1]);
   int const x_947 = (*(tint_symbol_81)).numbers.arr[x_34_save];
   (*(tint_symbol_81)).numbers.arr[x_34_save] = 0;
   (*(tint_symbol_81)).numbers.arr[x_34_save] = x_947;
@@ -94,7 +94,7 @@
   int const x_948 = *(j);
   *(j) = 0;
   *(j) = x_948;
-  float3 const x_531 = float3(x_527.x, x_526.y, x_526.x);
+  float3 const x_531 = float3(x_527[0], x_526[1], x_526[0]);
   int const x_949 = (*(tint_symbol_81)).numbers.arr[x_36_save];
   (*(tint_symbol_81)).numbers.arr[x_36_save] = 0;
   (*(tint_symbol_81)).numbers.arr[x_36_save] = x_949;
@@ -103,7 +103,7 @@
   QuicksortObject const tint_symbol_7 = {.numbers=tint_symbol_6};
   *(tint_symbol_81) = tint_symbol_7;
   *(tint_symbol_81) = x_950;
-  float3 const x_532 = float3(x_528.x, x_528.y, x_528.x);
+  float3 const x_532 = float3(x_528[0], x_528[1], x_528[0]);
   int const x_951 = (*(tint_symbol_81)).numbers.arr[x_34_save];
   (*(tint_symbol_81)).numbers.arr[x_34_save] = 0;
   (*(tint_symbol_81)).numbers.arr[x_34_save] = x_951;
@@ -136,7 +136,7 @@
   int const x_955 = param_3;
   param_3 = 0;
   param_3 = x_955;
-  float3 const x_534 = float3(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).z);
+  float3 const x_534 = float3(float3(1.0f, 2.0f, 3.0f)[2], float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[2]);
   int const x_956 = param_1;
   param_1 = 0;
   param_1 = x_956;
@@ -148,13 +148,13 @@
   int const x_958 = j_1;
   j_1 = 0;
   j_1 = x_958;
-  float3 const x_535 = float3(x_534.y, x_534.z, x_534.y);
+  float3 const x_535 = float3(x_534[1], x_534[2], x_534[1]);
   int const x_959 = *(l);
   *(l) = 0;
   *(l) = x_959;
   i_1 = as_type<int>((as_type<uint>(x_45) - as_type<uint>(as_type<int>(1u))));
   int const x_49 = *(l);
-  float3 const x_536 = float3(x_534.x, x_534.z, x_535.x);
+  float3 const x_536 = float3(x_534[0], x_534[2], x_535[0]);
   j_1 = 10;
   QuicksortObject const x_960 = *(tint_symbol_82);
   tint_array_wrapper const tint_symbol_8 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
@@ -172,7 +172,7 @@
     int const x_963 = pivot;
     pivot = 0;
     pivot = x_963;
-    x_537 = float2(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).z);
+    x_537 = float2(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[2]);
     QuicksortObject const x_964 = *(tint_symbol_82);
     tint_array_wrapper const tint_symbol_10 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_11 = {.numbers=tint_symbol_10};
@@ -188,7 +188,7 @@
     int const x_967 = j_1;
     j_1 = 0;
     j_1 = x_967;
-    x_538 = float3(x_534.x, x_537.y, x_534.z);
+    x_538 = float3(x_534[0], x_537[1], x_534[2]);
     int const x_968 = param;
     param = 0;
     param = x_968;
@@ -204,7 +204,7 @@
     int const x_970 = *(h);
     *(h) = 0;
     *(h) = x_970;
-    float3 const x_539 = float3(x_537.x, x_535.z, x_537.x);
+    float3 const x_539 = float3(x_537[0], x_535[2], x_537[0]);
     int const x_971 = param_1;
     param_1 = 0;
     param_1 = x_971;
@@ -215,19 +215,19 @@
     *(tint_symbol_82) = tint_symbol_13;
     *(tint_symbol_82) = x_972;
     int const x_63 = pivot;
-    float2 const x_540 = float2(float3(1.0f, 2.0f, 3.0f).y, x_534.z);
+    float2 const x_540 = float2(float3(1.0f, 2.0f, 3.0f)[1], x_534[2]);
     int const x_973 = i_1;
     i_1 = 0;
     i_1 = x_973;
     int const x_974 = *(l);
     *(l) = 0;
     *(l) = x_974;
-    float3 const x_541 = float3(x_534.y, x_534.x, x_534.y);
+    float3 const x_541 = float3(x_534[1], x_534[0], x_534[1]);
     int const x_975 = pivot;
     pivot = 0;
     pivot = x_975;
     if ((x_62 <= x_63)) {
-      float3 const x_542 = float3(x_541.z, x_541.x, x_541.x);
+      float3 const x_542 = float3(x_541[2], x_541[0], x_541[0]);
       int const x_976 = param_3;
       param_3 = 0;
       param_3 = x_976;
@@ -235,7 +235,7 @@
       int const x_977 = pivot;
       pivot = 0;
       pivot = x_977;
-      float2 const x_543 = float2(x_539.x, x_541.y);
+      float2 const x_543 = float2(x_539[0], x_541[1]);
       int const x_978 = i_1;
       i_1 = 0;
       i_1 = x_978;
@@ -246,9 +246,9 @@
       int const x_980 = *(l);
       *(l) = 0;
       *(l) = x_980;
-      float3 const x_544 = float3(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y, x_540.x);
+      float3 const x_544 = float3(float3(1.0f, 2.0f, 3.0f)[2], float3(1.0f, 2.0f, 3.0f)[1], x_540[0]);
       int const x_70 = i_1;
-      float2 const x_545 = float2(x_537.y, x_538.x);
+      float2 const x_545 = float2(x_537[1], x_538[0]);
       int const x_981 = param;
       param = 0;
       param = x_981;
@@ -256,7 +256,7 @@
       int const x_982 = param;
       param = 0;
       param = x_982;
-      float2 const x_546 = float2(x_545.x, x_545.x);
+      float2 const x_546 = float2(x_545[0], x_545[0]);
       int const x_983 = i_1;
       i_1 = 0;
       i_1 = x_983;
@@ -283,7 +283,7 @@
       int const x_988 = *(h);
       *(h) = 0;
       *(h) = x_988;
-      float3 const x_547 = float3(x_539.x, x_541.z, x_541.z);
+      float3 const x_547 = float3(x_539[0], x_541[2], x_541[2]);
       int const x_989 = (*(tint_symbol_82)).numbers.arr[x_61_save];
       (*(tint_symbol_82)).numbers.arr[x_61_save] = 0;
       (*(tint_symbol_82)).numbers.arr[x_61_save] = x_989;
@@ -294,7 +294,7 @@
       int const x_991 = param_1;
       param_1 = 0;
       param_1 = x_991;
-      float3 const x_548 = float3(x_541.y, x_541.z, x_541.x);
+      float3 const x_548 = float3(x_541[1], x_541[2], x_541[0]);
       int const x_992 = (*(tint_symbol_82)).numbers.arr[x_61_save];
       (*(tint_symbol_82)).numbers.arr[x_61_save] = 0;
       (*(tint_symbol_82)).numbers.arr[x_61_save] = x_992;
@@ -304,7 +304,7 @@
   int const x_993 = (*(tint_symbol_82)).numbers.arr[x_42_save];
   (*(tint_symbol_82)).numbers.arr[x_42_save] = 0;
   (*(tint_symbol_82)).numbers.arr[x_42_save] = x_993;
-  float2 const x_549 = float2(x_534.x, x_534.y);
+  float2 const x_549 = float2(x_534[0], x_534[1]);
   QuicksortObject const x_994 = *(tint_symbol_82);
   tint_array_wrapper const tint_symbol_16 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_17 = {.numbers=tint_symbol_16};
@@ -321,17 +321,17 @@
   int const x_997 = j_1;
   j_1 = 0;
   j_1 = x_997;
-  float2 const x_550 = float2(x_534.x, x_534.x);
+  float2 const x_550 = float2(x_534[0], x_534[0]);
   int const x_998 = param_1;
   param_1 = 0;
   param_1 = x_998;
   param_2 = x_79;
-  float2 const x_551 = float2(x_534.y, x_536.x);
+  float2 const x_551 = float2(x_534[1], x_536[0]);
   int const x_999 = pivot;
   pivot = 0;
   pivot = x_999;
   int const x_81 = *(h);
-  float2 const x_552 = float2(x_550.x, x_549.y);
+  float2 const x_552 = float2(x_550[0], x_549[1]);
   int const x_1000 = *(h);
   *(h) = 0;
   *(h) = x_1000;
@@ -339,7 +339,7 @@
   int const x_1001 = i_1;
   i_1 = 0;
   i_1 = x_1001;
-  float2 const x_553 = float2(x_549.y, x_552.x);
+  float2 const x_553 = float2(x_549[1], x_552[0]);
   int const x_1002 = *(h);
   *(h) = 0;
   *(h) = x_1002;
@@ -347,7 +347,7 @@
   int const x_1003 = *(l);
   *(l) = 0;
   *(l) = x_1003;
-  float2 const x_554 = float2(x_536.z, float3(1.0f, 2.0f, 3.0f).y);
+  float2 const x_554 = float2(x_536[2], float3(1.0f, 2.0f, 3.0f)[1]);
   int const x_1004 = param_1;
   param_1 = 0;
   param_1 = x_1004;
@@ -355,7 +355,7 @@
   int const x_1005 = param;
   param = 0;
   param = x_1005;
-  float2 const x_555 = float2(x_534.y, x_534.x);
+  float2 const x_555 = float2(x_534[1], x_534[0]);
   int const x_1006 = j_1;
   j_1 = 0;
   j_1 = x_1006;
@@ -379,7 +379,7 @@
   tint_array_wrapper const tint_symbol_18 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   stack = tint_symbol_18;
   stack = x_1008;
-  float2 const x_556 = float2(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).y);
+  float2 const x_556 = float2(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[1]);
   int const x_1009 = param_5;
   param_5 = 0;
   param_5 = x_1009;
@@ -388,7 +388,7 @@
   p = 0;
   p = x_1010;
   int const x_93 = top;
-  float2 const x_557 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).x);
+  float2 const x_557 = float2(float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[0]);
   int const x_1011 = p;
   p = 0;
   p = x_1011;
@@ -396,7 +396,7 @@
   int const x_1012 = top;
   top = 0;
   top = x_1012;
-  float2 const x_558 = float2(x_556.y, x_557.y);
+  float2 const x_558 = float2(x_556[1], x_557[1]);
   int const x_1013 = param_4;
   param_4 = 0;
   param_4 = x_1013;
@@ -404,7 +404,7 @@
   int const x_1014 = h_1;
   h_1 = 0;
   h_1 = x_1014;
-  float3 const x_559 = float3(x_557.y, x_557.x, x_557.x);
+  float3 const x_559 = float3(x_557[1], x_557[0], x_557[0]);
   int const x_1015 = param_4;
   param_4 = 0;
   param_4 = x_1015;
@@ -414,13 +414,13 @@
   QuicksortObject const tint_symbol_20 = {.numbers=tint_symbol_19};
   *(tint_symbol_83) = tint_symbol_20;
   *(tint_symbol_83) = x_1016;
-  float3 const x_560 = float3(x_559.y, x_559.x, x_557.x);
+  float3 const x_560 = float3(x_559[1], x_559[0], x_557[0]);
   int const x_96_save = x_94;
   tint_array_wrapper const x_1017 = stack;
   tint_array_wrapper const tint_symbol_21 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   stack = tint_symbol_21;
   stack = x_1017;
-  float3 const x_561 = float3(x_556.y, x_556.y, x_556.y);
+  float3 const x_561 = float3(x_556[1], x_556[1], x_556[1]);
   int const x_1018 = l_1;
   l_1 = 0;
   l_1 = 0;
@@ -432,7 +432,7 @@
   int const x_1020 = param_4;
   param_4 = 0;
   param_4 = x_1020;
-  float3 const x_562 = float3(float3(1.0f, 2.0f, 3.0f).z, x_558.y, float3(1.0f, 2.0f, 3.0f).y);
+  float3 const x_562 = float3(float3(1.0f, 2.0f, 3.0f)[2], x_558[1], float3(1.0f, 2.0f, 3.0f)[1]);
   int const x_1021 = stack.arr[x_96_save];
   stack.arr[x_96_save] = 0;
   stack.arr[x_96_save] = x_1021;
@@ -440,7 +440,7 @@
   int const x_1022 = stack.arr[x_96_save];
   stack.arr[x_96_save] = 0;
   stack.arr[x_96_save] = x_1022;
-  float3 const x_563 = float3(x_559.x, x_559.z, x_556.y);
+  float3 const x_563 = float3(x_559[0], x_559[2], x_556[1]);
   top = x_98;
   int const x_1023 = param_4;
   param_4 = 0;
@@ -449,7 +449,7 @@
   int const x_1024 = param_4;
   param_4 = 0;
   param_4 = x_1024;
-  float3 const x_564 = float3(x_558.x, x_561.x, x_558.y);
+  float3 const x_564 = float3(x_558[0], x_561[0], x_558[1]);
   int const x_1025 = l_1;
   l_1 = 0;
   l_1 = x_1025;
@@ -457,13 +457,13 @@
   int const x_1026 = param_5;
   param_5 = 0;
   param_5 = x_1026;
-  float2 const x_565 = float2(x_564.z, x_564.z);
+  float2 const x_565 = float2(x_564[2], x_564[2]);
   int const x_1027 = p;
   p = 0;
   p = x_1027;
   stack.arr[x_100_save] = x_99;
   while (true) {
-    float3 const x_566 = float3(x_563.x, x_563.x, x_563.x);
+    float3 const x_566 = float3(x_563[0], x_563[0], x_563[0]);
     int const x_1028 = h_1;
     h_1 = 0;
     h_1 = x_1028;
@@ -476,7 +476,7 @@
     tint_array_wrapper const tint_symbol_23 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     stack = tint_symbol_23;
     stack = x_1030;
-    float2 const x_567 = float2(x_558.x, x_564.z);
+    float2 const x_567 = float2(x_558[0], x_564[2]);
     int const x_1031 = param_4;
     param_4 = 0;
     param_4 = x_1031;
@@ -489,16 +489,16 @@
     QuicksortObject const tint_symbol_25 = {.numbers=tint_symbol_24};
     *(tint_symbol_83) = tint_symbol_25;
     *(tint_symbol_83) = x_1032;
-    float3 const x_568 = float3(x_559.y, x_559.x, x_563.y);
+    float3 const x_568 = float3(x_559[1], x_559[0], x_563[1]);
     int const x_1033 = param_4;
     param_4 = 0;
     param_4 = x_1033;
     int const x_108 = top;
-    float3 const x_569 = float3(x_565.x, x_567.y, x_565.x);
+    float3 const x_569 = float3(x_565[0], x_567[1], x_565[0]);
     int const x_1034 = h_1;
     h_1 = 0;
     h_1 = x_1034;
-    float2 const x_570 = float2(x_556.x, x_556.x);
+    float2 const x_570 = float2(x_556[0], x_556[0]);
     int const x_1035 = p;
     p = 0;
     p = x_1035;
@@ -515,7 +515,7 @@
     tint_array_wrapper const tint_symbol_26 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     stack = tint_symbol_26;
     stack = x_1038;
-    float3 const x_571 = float3(x_559.y, x_559.x, x_564.y);
+    float3 const x_571 = float3(x_559[1], x_559[0], x_564[1]);
     int const x_1039 = l_1;
     l_1 = 0;
     l_1 = x_1039;
@@ -524,7 +524,7 @@
     tint_array_wrapper const tint_symbol_27 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     stack = tint_symbol_27;
     stack = x_1040;
-    float2 const x_572 = float2(x_562.y, x_561.y);
+    float2 const x_572 = float2(x_562[1], x_561[1]);
     int const x_1041 = p;
     p = 0;
     p = x_1041;
@@ -535,17 +535,17 @@
     int const x_1043 = stack.arr[x_100_save];
     stack.arr[x_100_save] = 0;
     stack.arr[x_100_save] = x_1043;
-    float2 const x_573 = float2(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).z);
+    float2 const x_573 = float2(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[2]);
     top = as_type<int>((as_type<uint>(x_112) - as_type<uint>(1)));
     int const x_1044 = param_5;
     param_5 = 0;
     param_5 = x_1044;
-    float3 const x_574 = float3(x_570.y, x_565.x, x_570.y);
+    float3 const x_574 = float3(x_570[1], x_565[0], x_570[1]);
     int const x_1045 = h_1;
     h_1 = 0;
     h_1 = x_1045;
     int const x_114_save = x_112;
-    float2 const x_575 = float2(x_564.y, x_564.z);
+    float2 const x_575 = float2(x_564[1], x_564[2]);
     int const x_1046 = stack.arr[x_100_save];
     stack.arr[x_100_save] = 0;
     stack.arr[x_100_save] = x_1046;
@@ -553,7 +553,7 @@
     int const x_1047 = p;
     p = 0;
     p = x_1047;
-    float3 const x_576 = float3(x_573.y, x_573.y, x_565.x);
+    float3 const x_576 = float3(x_573[1], x_573[1], x_565[0]);
     int const x_1048 = param_5;
     param_5 = 0;
     param_5 = x_1048;
@@ -566,15 +566,15 @@
     int const x_1050 = stack.arr[x_110_save];
     stack.arr[x_110_save] = 0;
     stack.arr[x_110_save] = x_1050;
-    float2 const x_577 = float2(x_569.y, x_569.z);
+    float2 const x_577 = float2(x_569[1], x_569[2]);
     int const x_120 = h_1;
-    float2 const x_578 = float2(x_558.x, float3(1.0f, 2.0f, 3.0f).y);
+    float2 const x_578 = float2(x_558[0], float3(1.0f, 2.0f, 3.0f)[1]);
     param_5 = x_120;
     int const x_1051 = stack.arr[x_100_save];
     stack.arr[x_100_save] = 0;
     stack.arr[x_100_save] = x_1051;
     int const x_121 = performPartition_i1_i1_(&(param_4), &(param_5), tint_symbol_83);
-    float2 const x_579 = float2(x_567.x, x_568.x);
+    float2 const x_579 = float2(x_567[0], x_568[0]);
     int const x_1052 = param_5;
     param_5 = 0;
     param_5 = x_1052;
@@ -586,7 +586,7 @@
     int const x_1054 = h_1;
     h_1 = 0;
     h_1 = x_1054;
-    float2 const x_580 = float2(x_568.y, x_568.y);
+    float2 const x_580 = float2(x_568[1], x_568[1]);
     int const x_1055 = l_1;
     l_1 = 0;
     l_1 = x_1055;
@@ -600,7 +600,7 @@
     int const x_1058 = h_1;
     h_1 = 0;
     h_1 = x_1058;
-    float2 const x_582 = float2(x_567.y, x_573.x);
+    float2 const x_582 = float2(x_567[1], x_573[0]);
     int const x_1059 = stack.arr[x_100_save];
     stack.arr[x_100_save] = 0;
     stack.arr[x_100_save] = x_1059;
@@ -609,7 +609,7 @@
       param_4 = 0;
       param_4 = x_1060;
       int const x_128 = top;
-      float2 const x_583 = float2(x_571.y, x_556.y);
+      float2 const x_583 = float2(x_571[1], x_556[1]);
       int const x_1061 = stack.arr[x_100_save];
       stack.arr[x_100_save] = 0;
       stack.arr[x_100_save] = x_1061;
@@ -617,13 +617,13 @@
       tint_array_wrapper const tint_symbol_28 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
       stack = tint_symbol_28;
       stack = x_1062;
-      float2 const x_584 = float2(x_569.z, x_569.y);
-      float3 const x_585 = float3(x_580.y, x_577.x, x_577.x);
+      float2 const x_584 = float2(x_569[2], x_569[1]);
+      float3 const x_585 = float3(x_580[1], x_577[0], x_577[0]);
       int const x_130 = l_1;
       int const x_1063 = stack.arr[x_114_save];
       stack.arr[x_114_save] = 0;
       stack.arr[x_114_save] = x_1063;
-      float2 const x_586 = float2(x_564.x, x_585.x);
+      float2 const x_586 = float2(x_564[0], x_585[0]);
       int const x_1064 = param_5;
       param_5 = 0;
       param_5 = x_1064;
@@ -631,7 +631,7 @@
       int const x_1065 = stack.arr[x_110_save];
       stack.arr[x_110_save] = 0;
       stack.arr[x_110_save] = x_1065;
-      float3 const x_587 = float3(x_566.y, x_566.y, x_563.x);
+      float3 const x_587 = float3(x_566[1], x_566[1], x_563[0]);
       int const x_1066 = param_5;
       param_5 = 0;
       param_5 = x_1066;
@@ -640,7 +640,7 @@
       int const x_1067 = stack.arr[x_100_save];
       stack.arr[x_100_save] = 0;
       stack.arr[x_100_save] = x_1067;
-      float2 const x_588 = float2(x_575.y, x_575.x);
+      float2 const x_588 = float2(x_575[1], x_575[0]);
       int const x_1068 = stack.arr[x_131_save];
       stack.arr[x_131_save] = 0;
       stack.arr[x_131_save] = x_1068;
@@ -648,7 +648,7 @@
       int const x_1069 = stack.arr[x_100_save];
       stack.arr[x_100_save] = 0;
       stack.arr[x_100_save] = x_1069;
-      float3 const x_589 = float3(x_576.z, x_588.y, x_576.z);
+      float3 const x_589 = float3(x_576[2], x_588[1], x_576[2]);
       int const x_1070 = h_1;
       h_1 = 0;
       h_1 = x_1070;
@@ -658,7 +658,7 @@
       stack = tint_symbol_29;
       stack = x_1071;
       int const x_134 = p;
-      float2 const x_590 = float2(x_576.x, x_573.y);
+      float2 const x_590 = float2(x_576[0], x_573[1]);
       int const x_1072 = stack.arr[x_114_save];
       stack.arr[x_114_save] = 0;
       stack.arr[x_114_save] = x_1072;
@@ -670,7 +670,7 @@
       int const x_1074 = stack.arr[x_96_save];
       stack.arr[x_96_save] = 0;
       stack.arr[x_96_save] = x_1074;
-      float2 const x_591 = float2(x_569.z, x_569.y);
+      float2 const x_591 = float2(x_569[2], x_569[1]);
       int const x_1075 = stack.arr[x_136_save];
       stack.arr[x_136_save] = 0;
       stack.arr[x_136_save] = x_1075;
@@ -678,7 +678,7 @@
     int const x_1076 = stack.arr[x_96_save];
     stack.arr[x_96_save] = 0;
     stack.arr[x_96_save] = x_1076;
-    float2 const x_592 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).y);
+    float2 const x_592 = float2(float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[1]);
     QuicksortObject const x_1077 = *(tint_symbol_83);
     tint_array_wrapper const tint_symbol_30 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_31 = {.numbers=tint_symbol_30};
@@ -688,11 +688,11 @@
     int const x_1078 = stack.arr[x_114_save];
     stack.arr[x_114_save] = 0;
     stack.arr[x_114_save] = x_1078;
-    float3 const x_593 = float3(x_571.z, x_556.x, x_556.y);
+    float3 const x_593 = float3(x_571[2], x_556[0], x_556[1]);
     int const x_1079 = p;
     p = 0;
     p = x_1079;
-    float3 const x_594 = float3(x_563.z, x_563.x, x_575.x);
+    float3 const x_594 = float3(x_563[2], x_563[0], x_575[0]);
     int const x_1080 = stack.arr[x_114_save];
     stack.arr[x_114_save] = 0;
     stack.arr[x_114_save] = x_1080;
@@ -700,7 +700,7 @@
     int const x_1081 = top;
     top = 0;
     top = x_1081;
-    float3 const x_595 = float3(x_560.z, x_568.x, x_560.x);
+    float3 const x_595 = float3(x_560[2], x_568[0], x_560[0]);
     int const x_1082 = stack.arr[x_100_save];
     stack.arr[x_100_save] = 0;
     stack.arr[x_100_save] = x_1082;
@@ -711,7 +711,7 @@
       int const x_1084 = stack.arr[x_114_save];
       stack.arr[x_114_save] = 0;
       stack.arr[x_114_save] = x_1084;
-      float2 const x_596 = float2(x_592.y, x_582.x);
+      float2 const x_596 = float2(x_592[1], x_582[0]);
       int const x_1085 = l_1;
       l_1 = 0;
       l_1 = x_1085;
@@ -719,7 +719,7 @@
       int const x_1086 = stack.arr[x_114_save];
       stack.arr[x_114_save] = 0;
       stack.arr[x_114_save] = x_1086;
-      float3 const x_597 = float3(x_562.y, x_560.y, x_560.y);
+      float3 const x_597 = float3(x_562[1], x_560[1], x_560[1]);
       int const x_144 = as_type<int>((as_type<uint>(x_143) + as_type<uint>(1)));
       int const x_1087 = param_5;
       param_5 = 0;
@@ -732,11 +732,11 @@
       int const x_1089 = param_5;
       param_5 = 0;
       param_5 = x_1089;
-      float3 const x_599 = float3(x_560.z, x_560.x, x_568.x);
+      float3 const x_599 = float3(x_560[2], x_560[0], x_568[0]);
       int const x_1090 = p;
       p = 0;
       p = x_1090;
-      float3 const x_600 = float3(x_556.x, x_580.x, x_580.x);
+      float3 const x_600 = float3(x_556[0], x_580[0], x_580[0]);
       int const x_1091 = stack.arr[x_100_save];
       stack.arr[x_100_save] = 0;
       stack.arr[x_100_save] = x_1091;
@@ -744,7 +744,7 @@
       int const x_1092 = stack.arr[x_110_save];
       stack.arr[x_110_save] = 0;
       stack.arr[x_110_save] = x_1092;
-      float2 const x_601 = float2(x_563.x, x_563.y);
+      float2 const x_601 = float2(x_563[0], x_563[1]);
       stack.arr[x_147_save] = as_type<int>((1u + as_type<uint>(x_145)));
       tint_array_wrapper const x_1093 = stack;
       tint_array_wrapper const tint_symbol_32 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
@@ -754,7 +754,7 @@
       int const x_1094 = stack.arr[x_114_save];
       stack.arr[x_114_save] = 0;
       stack.arr[x_114_save] = x_1094;
-      float2 const x_602 = float2(x_565.y, x_599.y);
+      float2 const x_602 = float2(x_565[1], x_599[1]);
       tint_array_wrapper const x_1095 = stack;
       tint_array_wrapper const tint_symbol_33 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
       stack = tint_symbol_33;
@@ -778,7 +778,7 @@
       int const x_1100 = stack.arr[x_114_save];
       stack.arr[x_114_save] = 0;
       stack.arr[x_114_save] = x_1100;
-      float3 const x_603 = float3(x_568.y, x_564.x, x_564.x);
+      float3 const x_603 = float3(x_568[1], x_564[0], x_564[0]);
       int const x_1101 = l_1;
       l_1 = 0;
       l_1 = x_1101;
@@ -790,7 +790,7 @@
       int const x_1103 = l_1;
       l_1 = 0;
       l_1 = x_1103;
-      float2 const x_604 = float2(x_563.z, x_564.x);
+      float2 const x_604 = float2(x_563[2], x_564[0]);
       QuicksortObject const x_1104 = *(tint_symbol_83);
       tint_array_wrapper const tint_symbol_34 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
       QuicksortObject const tint_symbol_35 = {.numbers=tint_symbol_34};
@@ -823,7 +823,7 @@
     QuicksortObject const tint_symbol_39 = {.numbers=tint_symbol_38};
     *(tint_symbol_84) = tint_symbol_39;
     *(tint_symbol_84) = x_722;
-    float2 const x_431 = float2(float3(1.0f, 2.0f, 3.0f).x, float3(1.0f, 2.0f, 3.0f).x);
+    float2 const x_431 = float2(float3(1.0f, 2.0f, 3.0f)[0], float3(1.0f, 2.0f, 3.0f)[0]);
     int const x_158 = i_2;
     float2 const x_723 = uv;
     uv = float2(0.0f, 0.0f);
@@ -831,7 +831,7 @@
     float3 const x_725 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_725;
-    float2 const x_432 = float2(x_431.y, x_431.y);
+    float2 const x_432 = float2(x_431[1], x_431[1]);
     QuicksortObject const x_726 = *(tint_symbol_84);
     tint_array_wrapper const tint_symbol_40 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_41 = {.numbers=tint_symbol_40};
@@ -843,7 +843,7 @@
   QuicksortObject const tint_symbol_43 = {.numbers=tint_symbol_42};
   *(tint_symbol_84) = tint_symbol_43;
   *(tint_symbol_84) = x_756;
-  float2 const x_446 = float2(float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).x);
+  float2 const x_446 = float2(float2(0.0f, 0.0f)[0], float2(0.0f, 0.0f)[0]);
   int const x_757 = i_2;
   i_2 = 0;
   i_2 = x_757;
@@ -857,12 +857,12 @@
   float2 const x_759 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_759;
-  float2 const x_447 = float2(float2(0.0f, 0.0f).y, float2(0.0f, 0.0f).y);
+  float2 const x_447 = float2(float2(0.0f, 0.0f)[1], float2(0.0f, 0.0f)[1]);
   float2 const x_760 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_760;
-  float2 const x_185 = float2(x_184.x, x_184.y);
-  float3 const x_448 = float3(x_185.y, x_446.y, x_446.y);
+  float2 const x_185 = float2(x_184[0], x_184[1]);
+  float3 const x_448 = float3(x_185[1], x_446[1], x_446[1]);
   QuicksortObject const x_761 = *(tint_symbol_84);
   tint_array_wrapper const tint_symbol_46 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_47 = {.numbers=tint_symbol_46};
@@ -877,7 +877,7 @@
   QuicksortObject const tint_symbol_49 = {.numbers=tint_symbol_48};
   *(tint_symbol_84) = tint_symbol_49;
   *(tint_symbol_84) = x_763;
-  float3 const x_449 = float3(x_184.y, float3(1.0f, 2.0f, 3.0f).z, x_184.w);
+  float3 const x_449 = float3(x_184[1], float3(1.0f, 2.0f, 3.0f)[2], x_184[3]);
   float3 const x_764 = color;
   color = float3(0.0f, 0.0f, 0.0f);
   color = x_764;
@@ -887,7 +887,7 @@
   QuicksortObject const tint_symbol_51 = {.numbers=tint_symbol_50};
   *(tint_symbol_84) = tint_symbol_51;
   *(tint_symbol_84) = x_765;
-  float2 const x_450 = float2(x_447.x, x_185.y);
+  float2 const x_450 = float2(x_447[0], x_185[1]);
   float3 const x_766 = color;
   color = float3(0.0f, 0.0f, 0.0f);
   float3 const x_767 = color;
@@ -899,7 +899,7 @@
   float3 const x_768 = color;
   color = float3(0.0f, 0.0f, 0.0f);
   color = x_768;
-  float3 const x_451 = float3(x_185.x, x_185.y, x_446.y);
+  float3 const x_451 = float3(x_185[0], x_185[1], x_446[1]);
   QuicksortObject const x_769 = *(tint_symbol_84);
   tint_array_wrapper const tint_symbol_52 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_53 = {.numbers=tint_symbol_52};
@@ -917,11 +917,11 @@
   int const x_772 = (*(tint_symbol_84)).numbers.arr[0u];
   (*(tint_symbol_84)).numbers.arr[0u] = 0;
   (*(tint_symbol_84)).numbers.arr[0u] = x_772;
-  float const x_206 = color.x;
-  float const x_773 = color.x;
-  color.x = 0.0f;
-  color.x = x_773;
-  float2 const x_452 = float2(float3(1.0f, 2.0f, 3.0f).z, float3(1.0f, 2.0f, 3.0f).y);
+  float const x_206 = color[0];
+  float const x_773 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_773;
+  float2 const x_452 = float2(float3(1.0f, 2.0f, 3.0f)[2], float3(1.0f, 2.0f, 3.0f)[1]);
   int const x_774 = i_2;
   i_2 = 0;
   i_2 = x_774;
@@ -930,20 +930,20 @@
   QuicksortObject const tint_symbol_57 = {.numbers=tint_symbol_56};
   *(tint_symbol_84) = tint_symbol_57;
   *(tint_symbol_84) = x_775;
-  float3 const x_453 = float3(x_451.x, x_450.x, x_450.y);
-  color.x = (x_206 + float(x_201));
+  float3 const x_453 = float3(x_451[0], x_450[0], x_450[1]);
+  color[0] = (x_206 + float(x_201));
   float2 const x_776 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_776;
   float2 const x_777 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_777;
-  float2 const x_454 = float2(x_184.y, x_184.y);
-  float const x_210 = uv.x;
-  float2 const x_455 = float2(x_192.y, x_192.x);
-  float const x_778 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_778;
+  float2 const x_454 = float2(x_184[1], x_184[1]);
+  float const x_210 = uv[0];
+  float2 const x_455 = float2(x_192[1], x_192[0]);
+  float const x_778 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_778;
   QuicksortObject const x_779 = *(tint_symbol_84);
   tint_array_wrapper const tint_symbol_58 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_59 = {.numbers=tint_symbol_58};
@@ -956,17 +956,17 @@
     int const x_781 = (*(tint_symbol_84)).numbers.arr[0u];
     (*(tint_symbol_84)).numbers.arr[0u] = 0;
     (*(tint_symbol_84)).numbers.arr[0u] = x_781;
-    float3 const x_456 = float3(float2(0.0f, 0.0f).y, x_448.y, x_448.y);
-    float const x_782 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_782;
+    float3 const x_456 = float3(float2(0.0f, 0.0f)[1], x_448[1], x_448[1]);
+    float const x_782 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_782;
     int const x_216 = (*(tint_symbol_84)).numbers.arr[1];
     QuicksortObject const x_783 = *(tint_symbol_84);
     tint_array_wrapper const tint_symbol_60 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_61 = {.numbers=tint_symbol_60};
     *(tint_symbol_84) = tint_symbol_61;
     *(tint_symbol_84) = x_783;
-    float2 const x_457 = float2(x_454.x, x_454.x);
+    float2 const x_457 = float2(x_454[0], x_454[0]);
     float2 const x_784 = uv;
     uv = float2(0.0f, 0.0f);
     uv = x_784;
@@ -975,7 +975,7 @@
     QuicksortObject const tint_symbol_63 = {.numbers=tint_symbol_62};
     *(tint_symbol_84) = tint_symbol_63;
     *(tint_symbol_84) = x_785;
-    float2 const x_458 = float2(float3(1.0f, 2.0f, 3.0f).z, float2(0.0f, 0.0f).y);
+    float2 const x_458 = float2(float3(1.0f, 2.0f, 3.0f)[2], float2(0.0f, 0.0f)[1]);
     int const x_786 = i_2;
     i_2 = 0;
     i_2 = x_786;
@@ -989,144 +989,144 @@
     float3 const x_789 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_789;
-    float3 const x_459 = float3(x_454.y, x_454.y, x_447.y);
+    float3 const x_459 = float3(x_454[1], x_454[1], x_447[1]);
     float const x_790 = color[0];
     color[0] = 0.0f;
     color[0] = x_790;
-    color.x = (float(x_216) + x_219);
+    color[0] = (float(x_216) + x_219);
     int const x_791 = (*(tint_symbol_84)).numbers.arr[0u];
     (*(tint_symbol_84)).numbers.arr[0u] = 0;
     (*(tint_symbol_84)).numbers.arr[0u] = x_791;
   }
-  float const x_792 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_792;
-  float const x_793 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_793;
-  float const x_223 = uv.x;
-  float const x_794 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_794;
-  float3 const x_460 = float3(x_453.z, x_453.y, x_453.y);
+  float const x_792 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_792;
+  float const x_793 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_793;
+  float const x_223 = uv[0];
+  float const x_794 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_794;
+  float3 const x_460 = float3(x_453[2], x_453[1], x_453[1]);
   float2 const x_795 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_795;
-  float const x_796 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_796;
-  float2 const x_461 = float2(float2(0.0f, 0.0f).y, float2(0.0f, 0.0f).y);
-  float const x_797 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_797;
+  float const x_796 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_796;
+  float2 const x_461 = float2(float2(0.0f, 0.0f)[1], float2(0.0f, 0.0f)[1]);
+  float const x_797 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_797;
   if ((x_223 > 0.5f)) {
-    float const x_798 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_798;
-    float2 const x_462 = float2(x_446.x, x_446.x);
-    float const x_799 = color.x;
-    color.x = 0.0f;
-    color.x = x_799;
-    float const x_800 = color.x;
-    color.x = 0.0f;
-    color.x = x_800;
-    float3 const x_463 = float3(x_453.x, x_453.z, x_461.y);
-    float const x_801 = color.x;
-    color.x = 0.0f;
-    color.x = x_801;
+    float const x_798 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_798;
+    float2 const x_462 = float2(x_446[0], x_446[0]);
+    float const x_799 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_799;
+    float const x_800 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_800;
+    float3 const x_463 = float3(x_453[0], x_453[2], x_461[1]);
+    float const x_801 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_801;
     int const x_230 = (*(tint_symbol_84)).numbers.arr[2u];
-    float const x_802 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_802;
-    float const x_803 = color.x;
-    color.x = 0.0f;
-    color.x = x_803;
+    float const x_802 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_802;
+    float const x_803 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_803;
     int const x_804 = (*(tint_symbol_84)).numbers.arr[2u];
     (*(tint_symbol_84)).numbers.arr[2u] = 0;
     (*(tint_symbol_84)).numbers.arr[2u] = x_804;
-    float2 const x_464 = float2(x_450.y, x_191.x);
-    float const x_805 = color.y;
-    color.y = 0.0f;
-    color.y = x_805;
-    float const x_234 = color.y;
+    float2 const x_464 = float2(x_450[1], x_191[0]);
+    float const x_805 = color[1];
+    color[1] = 0.0f;
+    color[1] = x_805;
+    float const x_234 = color[1];
     int const x_806 = (*(tint_symbol_84)).numbers.arr[2u];
     (*(tint_symbol_84)).numbers.arr[2u] = 0;
     (*(tint_symbol_84)).numbers.arr[2u] = x_806;
-    float2 const x_465 = float2(x_463.x, x_185.x);
-    float const x_807 = color.x;
-    color.x = 0.0f;
-    color.x = x_807;
+    float2 const x_465 = float2(x_463[0], x_185[0]);
+    float const x_807 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_807;
     int const x_808 = i_2;
     i_2 = 0;
     i_2 = x_808;
-    float2 const x_466 = float2(x_455.y, float2(0.0f, 0.0f).y);
+    float2 const x_466 = float2(x_455[1], float2(0.0f, 0.0f)[1]);
     int const x_809 = i_2;
     i_2 = 0;
     i_2 = x_809;
-    color.y = (float(x_230) + x_234);
-    float const x_810 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_810;
+    color[1] = (float(x_230) + x_234);
+    float const x_810 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_810;
   }
   int const x_811 = i_2;
   i_2 = 0;
   i_2 = x_811;
-  float2 const x_467 = float2(x_191.x, x_191.x);
-  float const x_812 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_812;
+  float2 const x_467 = float2(x_191[0], x_191[0]);
+  float const x_812 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_812;
   float const x_238 = uv[0];
   float3 const x_813 = color;
   color = float3(0.0f, 0.0f, 0.0f);
   color = x_813;
-  float const x_814 = color.x;
-  color.x = 0.0f;
-  color.x = x_814;
+  float const x_814 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_814;
   if ((x_238 > 0.75f)) {
-    float const x_815 = color.x;
-    color.x = 0.0f;
-    color.x = x_815;
+    float const x_815 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_815;
     int const x_245 = (*(tint_symbol_84)).numbers.arr[3];
-    float const x_816 = color.x;
-    color.x = 0.0f;
-    color.x = x_816;
+    float const x_816 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_816;
     QuicksortObject const x_817 = *(tint_symbol_84);
     tint_array_wrapper const tint_symbol_64 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_65 = {.numbers=tint_symbol_64};
     *(tint_symbol_84) = tint_symbol_65;
     *(tint_symbol_84) = x_817;
-    float3 const x_468 = float3(x_467.x, x_467.x, x_467.x);
+    float3 const x_468 = float3(x_467[0], x_467[0], x_467[0]);
     float const x_818 = uv[0];
     uv[0] = 0.0f;
     uv[0] = x_818;
-    float const x_819 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_819;
-    float const x_249 = color.z;
+    float const x_819 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_819;
+    float const x_249 = color[2];
     float3 const x_820 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_820;
-    float3 const x_469 = float3(x_467.x, x_191.y, x_467.y);
-    float const x_821 = color.z;
-    color.z = 0.0f;
-    color.z = x_821;
+    float3 const x_469 = float3(x_467[0], x_191[1], x_467[1]);
+    float const x_821 = color[2];
+    color[2] = 0.0f;
+    color[2] = x_821;
     int const x_822 = (*(tint_symbol_84)).numbers.arr[0u];
     (*(tint_symbol_84)).numbers.arr[0u] = 0;
     (*(tint_symbol_84)).numbers.arr[0u] = x_822;
-    float2 const x_470 = float2(float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).y);
-    float const x_823 = color.z;
-    color.z = 0.0f;
-    color.z = x_823;
-    color.z = (x_249 + float(x_245));
+    float2 const x_470 = float2(float2(0.0f, 0.0f)[0], float2(0.0f, 0.0f)[1]);
+    float const x_823 = color[2];
+    color[2] = 0.0f;
+    color[2] = x_823;
+    color[2] = (x_249 + float(x_245));
     float2 const x_824 = uv;
     uv = float2(0.0f, 0.0f);
     uv = x_824;
-    float2 const x_471 = float2(x_470.y, x_470.y);
+    float2 const x_471 = float2(x_470[1], x_470[1]);
   }
   float const x_825 = uv[0];
   uv[0] = 0.0f;
   uv[0] = x_825;
-  float3 const x_472 = float3(x_454.x, x_454.y, x_454.y);
+  float3 const x_472 = float3(x_454[0], x_454[1], x_454[1]);
   int const x_254 = (*(tint_symbol_84)).numbers.arr[4];
   float const x_826 = uv[0];
   uv[0] = 0.0f;
@@ -1134,178 +1134,178 @@
   float3 const x_827 = color;
   color = float3(0.0f, 0.0f, 0.0f);
   color = x_827;
-  float3 const x_473 = float3(x_446.y, x_453.x, x_453.x);
+  float3 const x_473 = float3(x_446[1], x_453[0], x_453[0]);
   int const x_828 = (*(tint_symbol_84)).numbers.arr[4];
   (*(tint_symbol_84)).numbers.arr[4] = 0;
   (*(tint_symbol_84)).numbers.arr[4] = x_828;
-  float2 const x_474 = float2(x_191.x, x_184.z);
-  float const x_829 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_829;
-  float const x_257 = color.y;
-  float const x_830 = color.y;
-  color.y = 0.0f;
-  color.y = x_830;
-  float2 const x_475 = float2(x_467.x, x_450.x);
-  float const x_831 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_831;
-  float const x_832 = color.x;
-  color.x = 0.0f;
-  color.x = x_832;
-  float2 const x_476 = float2(x_451.z, x_460.y);
-  color.y = (x_257 + float(x_254));
-  float3 const x_477 = float3(float2(0.0f, 0.0f).x, x_472.x, float2(0.0f, 0.0f).y);
-  float const x_833 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_833;
-  float const x_834 = color.x;
-  color.x = 0.0f;
-  color.x = x_834;
-  float2 const x_478 = float2(x_472.x, x_472.y);
-  float const x_835 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_835;
-  float const x_261 = uv.y;
+  float2 const x_474 = float2(x_191[0], x_184[2]);
+  float const x_829 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_829;
+  float const x_257 = color[1];
+  float const x_830 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_830;
+  float2 const x_475 = float2(x_467[0], x_450[0]);
+  float const x_831 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_831;
+  float const x_832 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_832;
+  float2 const x_476 = float2(x_451[2], x_460[1]);
+  color[1] = (x_257 + float(x_254));
+  float3 const x_477 = float3(float2(0.0f, 0.0f)[0], x_472[0], float2(0.0f, 0.0f)[1]);
+  float const x_833 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_833;
+  float const x_834 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_834;
+  float2 const x_478 = float2(x_472[0], x_472[1]);
+  float const x_835 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_835;
+  float const x_261 = uv[1];
   int const x_836 = i_2;
   i_2 = 0;
   i_2 = x_836;
-  float3 const x_479 = float3(float2(0.0f, 0.0f).y, x_454.y, float2(0.0f, 0.0f).x);
+  float3 const x_479 = float3(float2(0.0f, 0.0f)[1], x_454[1], float2(0.0f, 0.0f)[0]);
   int const x_837 = (*(tint_symbol_84)).numbers.arr[0u];
   (*(tint_symbol_84)).numbers.arr[0u] = 0;
   (*(tint_symbol_84)).numbers.arr[0u] = x_837;
-  float const x_838 = color.y;
-  color.y = 0.0f;
-  color.y = x_838;
-  float3 const x_480 = float3(x_446.x, x_446.x, float2(0.0f, 0.0f).y);
-  float const x_839 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_839;
+  float const x_838 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_838;
+  float3 const x_480 = float3(x_446[0], x_446[0], float2(0.0f, 0.0f)[1]);
+  float const x_839 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_839;
   if ((x_261 > 0.25f)) {
-    float2 const x_481 = float2(x_447.x, x_480.z);
+    float2 const x_481 = float2(x_447[0], x_480[2]);
     float3 const x_840 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_840;
     int const x_267 = (*(tint_symbol_84)).numbers.arr[5u];
-    float const x_841 = color.x;
-    color.x = 0.0f;
-    color.x = x_841;
+    float const x_841 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_841;
     int const x_842 = i_2;
     i_2 = 0;
     i_2 = x_842;
     int const x_843 = i_2;
     i_2 = 0;
     i_2 = x_843;
-    float const x_270 = color.x;
+    float const x_270 = color[0];
     float const x_844 = uv[0];
     uv[0] = 0.0f;
     uv[0] = x_844;
-    float3 const x_482 = float3(x_455.x, x_475.y, x_455.y);
+    float3 const x_482 = float3(x_455[0], x_475[1], x_455[1]);
     QuicksortObject const x_845 = *(tint_symbol_84);
     tint_array_wrapper const tint_symbol_66 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_67 = {.numbers=tint_symbol_66};
     *(tint_symbol_84) = tint_symbol_67;
     *(tint_symbol_84) = x_845;
-    float const x_846 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_846;
+    float const x_846 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_846;
     int const x_847 = i_2;
     i_2 = 0;
     i_2 = x_847;
-    float3 const x_483 = float3(x_184.w, x_184.w, x_192.x);
-    float const x_848 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_848;
-    color.x = (float(x_267) + x_270);
-    float3 const x_484 = float3(x_454.y, x_450.x, x_454.y);
-    float const x_849 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_849;
+    float3 const x_483 = float3(x_184[3], x_184[3], x_192[0]);
+    float const x_848 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_848;
+    color[0] = (float(x_267) + x_270);
+    float3 const x_484 = float3(x_454[1], x_450[0], x_454[1]);
+    float const x_849 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_849;
   }
-  float const x_850 = color.x;
-  color.x = 0.0f;
-  color.x = x_850;
-  float3 const x_485 = float3(x_467.x, x_450.y, x_450.x);
-  float const x_851 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_851;
+  float const x_850 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_850;
+  float3 const x_485 = float3(x_467[0], x_450[1], x_450[0]);
+  float const x_851 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_851;
   int const x_852 = (*(tint_symbol_84)).numbers.arr[4];
   (*(tint_symbol_84)).numbers.arr[4] = 0;
   (*(tint_symbol_84)).numbers.arr[4] = x_852;
-  float const x_274 = uv.y;
+  float const x_274 = uv[1];
   int const x_853 = (*(tint_symbol_84)).numbers.arr[0u];
   (*(tint_symbol_84)).numbers.arr[0u] = 0;
   (*(tint_symbol_84)).numbers.arr[0u] = x_853;
   if ((x_274 > 0.5f)) {
-    float const x_854 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_854;
-    float2 const x_486 = float2(x_480.y, x_455.y);
-    float const x_855 = color.y;
-    color.y = 0.0f;
-    color.y = x_855;
-    float2 const x_487 = float2(x_449.z, x_449.y);
-    float const x_856 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_856;
+    float const x_854 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_854;
+    float2 const x_486 = float2(x_480[1], x_455[1]);
+    float const x_855 = color[1];
+    color[1] = 0.0f;
+    color[1] = x_855;
+    float2 const x_487 = float2(x_449[2], x_449[1]);
+    float const x_856 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_856;
     int const x_280 = (*(tint_symbol_84)).numbers.arr[6u];
-    float const x_857 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_857;
+    float const x_857 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_857;
     int const x_858 = i_2;
     i_2 = 0;
     i_2 = x_858;
     int const x_859 = (*(tint_symbol_84)).numbers.arr[4];
     (*(tint_symbol_84)).numbers.arr[4] = 0;
     (*(tint_symbol_84)).numbers.arr[4] = x_859;
-    float2 const x_488 = float2(x_473.z, x_473.y);
-    float const x_283 = color.y;
+    float2 const x_488 = float2(x_473[2], x_473[1]);
+    float const x_283 = color[1];
     float2 const x_860 = uv;
     uv = float2(0.0f, 0.0f);
     uv = x_860;
-    float const x_861 = color.x;
-    color.x = 0.0f;
-    color.x = x_861;
-    float2 const x_489 = float2(x_475.y, x_475.x);
+    float const x_861 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_861;
+    float2 const x_489 = float2(x_475[1], x_475[0]);
     int const x_862 = (*(tint_symbol_84)).numbers.arr[6u];
     (*(tint_symbol_84)).numbers.arr[6u] = 0;
     (*(tint_symbol_84)).numbers.arr[6u] = x_862;
     int const x_863 = (*(tint_symbol_84)).numbers.arr[6u];
     (*(tint_symbol_84)).numbers.arr[6u] = 0;
     (*(tint_symbol_84)).numbers.arr[6u] = x_863;
-    float2 const x_490 = float2(x_480.z, x_480.z);
+    float2 const x_490 = float2(x_480[2], x_480[2]);
     QuicksortObject const x_864 = *(tint_symbol_84);
     tint_array_wrapper const tint_symbol_68 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_69 = {.numbers=tint_symbol_68};
     *(tint_symbol_84) = tint_symbol_69;
     *(tint_symbol_84) = x_864;
-    color.y = (float(x_280) + x_283);
-    float const x_865 = color.x;
-    color.x = 0.0f;
-    color.x = x_865;
-    float2 const x_491 = float2(float3(1.0f, 2.0f, 3.0f).y, x_454.x);
-    float const x_866 = color.y;
-    color.y = 0.0f;
-    color.y = x_866;
+    color[1] = (float(x_280) + x_283);
+    float const x_865 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_865;
+    float2 const x_491 = float2(float3(1.0f, 2.0f, 3.0f)[1], x_454[0]);
+    float const x_866 = color[1];
+    color[1] = 0.0f;
+    color[1] = x_866;
   }
-  float2 const x_492 = float2(x_455.y, x_455.y);
-  float const x_867 = color.x;
-  color.x = 0.0f;
-  color.x = x_867;
-  float const x_287 = uv.y;
+  float2 const x_492 = float2(x_455[1], x_455[1]);
+  float const x_867 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_867;
+  float const x_287 = uv[1];
   QuicksortObject const x_868 = *(tint_symbol_84);
   tint_array_wrapper const tint_symbol_70 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_71 = {.numbers=tint_symbol_70};
   *(tint_symbol_84) = tint_symbol_71;
   *(tint_symbol_84) = x_868;
-  float2 const x_493 = float2(x_475.x, x_475.y);
+  float2 const x_493 = float2(x_475[0], x_475[1]);
   float const x_869 = uv[0];
   uv[0] = 0.0f;
   uv[0] = x_869;
-  float const x_870 = color.y;
-  color.y = 0.0f;
-  color.y = x_870;
-  float3 const x_494 = float3(x_191.x, x_191.y, x_191.y);
+  float const x_870 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_870;
+  float3 const x_494 = float3(x_191[0], x_191[1], x_191[1]);
   int const x_871 = (*(tint_symbol_84)).numbers.arr[4];
   (*(tint_symbol_84)).numbers.arr[4] = 0;
   (*(tint_symbol_84)).numbers.arr[4] = x_871;
@@ -1313,63 +1313,63 @@
     float3 const x_872 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_872;
-    float const x_873 = color.x;
-    color.x = 0.0f;
-    color.x = x_873;
-    float3 const x_495 = float3(x_192.y, x_192.x, x_192.y);
+    float const x_873 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_873;
+    float3 const x_495 = float3(x_192[1], x_192[0], x_192[1]);
     float3 const x_874 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_874;
     int const x_293 = (*(tint_symbol_84)).numbers.arr[7];
-    float const x_875 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_875;
-    float3 const x_496 = float3(x_475.x, x_467.y, x_467.x);
-    float const x_876 = color.y;
-    color.y = 0.0f;
-    color.y = x_876;
-    float2 const x_497 = float2(x_477.x, x_461.y);
+    float const x_875 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_875;
+    float3 const x_496 = float3(x_475[0], x_467[1], x_467[0]);
+    float const x_876 = color[1];
+    color[1] = 0.0f;
+    color[1] = x_876;
+    float2 const x_497 = float2(x_477[0], x_461[1]);
     int const x_877 = (*(tint_symbol_84)).numbers.arr[0u];
     (*(tint_symbol_84)).numbers.arr[0u] = 0;
     (*(tint_symbol_84)).numbers.arr[0u] = x_877;
-    float const x_878 = color.y;
-    color.y = 0.0f;
-    color.y = x_878;
-    float3 const x_498 = float3(x_478.x, x_478.y, x_478.x);
-    float const x_879 = color.x;
-    color.x = 0.0f;
-    color.x = x_879;
-    float const x_296 = color.z;
-    float const x_880 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_880;
-    float2 const x_499 = float2(x_184.x, x_184.y);
-    float const x_881 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_881;
-    float const x_882 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_882;
-    float const x_883 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_883;
-    float3 const x_500 = float3(x_499.y, x_499.y, x_494.z);
-    float const x_884 = color.z;
-    color.z = 0.0f;
-    color.z = x_884;
-    color.z = (float(x_293) + x_296);
-    float const x_885 = color.y;
-    color.y = 0.0f;
-    color.y = x_885;
-    float2 const x_501 = float2(x_453.x, x_453.z);
-    float const x_886 = color.x;
-    color.x = 0.0f;
-    color.x = x_886;
+    float const x_878 = color[1];
+    color[1] = 0.0f;
+    color[1] = x_878;
+    float3 const x_498 = float3(x_478[0], x_478[1], x_478[0]);
+    float const x_879 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_879;
+    float const x_296 = color[2];
+    float const x_880 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_880;
+    float2 const x_499 = float2(x_184[0], x_184[1]);
+    float const x_881 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_881;
+    float const x_882 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_882;
+    float const x_883 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_883;
+    float3 const x_500 = float3(x_499[1], x_499[1], x_494[2]);
+    float const x_884 = color[2];
+    color[2] = 0.0f;
+    color[2] = x_884;
+    color[2] = (float(x_293) + x_296);
+    float const x_885 = color[1];
+    color[1] = 0.0f;
+    color[1] = x_885;
+    float2 const x_501 = float2(x_453[0], x_453[2]);
+    float const x_886 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_886;
   }
   int const x_887 = i_2;
   i_2 = 0;
   i_2 = x_887;
-  float2 const x_502 = float2(x_451.y, x_192.y);
+  float2 const x_502 = float2(x_451[1], x_192[1]);
   float2 const x_888 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_888;
@@ -1377,138 +1377,138 @@
   int const x_889 = i_2;
   i_2 = 0;
   i_2 = x_889;
-  float2 const x_503 = float2(x_185.x, x_451.z);
+  float2 const x_503 = float2(x_185[0], x_451[2]);
   int const x_890 = (*(tint_symbol_84)).numbers.arr[8];
   (*(tint_symbol_84)).numbers.arr[8] = 0;
   (*(tint_symbol_84)).numbers.arr[8] = x_890;
-  float const x_891 = color.y;
-  color.y = 0.0f;
-  color.y = x_891;
-  float2 const x_504 = float2(x_453.y, float2(0.0f, 0.0f).x);
-  float const x_892 = color.x;
-  color.x = 0.0f;
-  color.x = x_892;
-  float3 const x_505 = float3(x_504.x, x_504.y, x_504.x);
-  float const x_893 = color.z;
-  color.z = 0.0f;
-  color.z = x_893;
-  float const x_304 = color.z;
-  float const x_894 = color.x;
-  color.x = 0.0f;
-  color.x = x_894;
-  float2 const x_506 = float2(x_493.x, x_492.x);
+  float const x_891 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_891;
+  float2 const x_504 = float2(x_453[1], float2(0.0f, 0.0f)[0]);
+  float const x_892 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_892;
+  float3 const x_505 = float3(x_504[0], x_504[1], x_504[0]);
+  float const x_893 = color[2];
+  color[2] = 0.0f;
+  color[2] = x_893;
+  float const x_304 = color[2];
+  float const x_894 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_894;
+  float2 const x_506 = float2(x_493[0], x_492[0]);
   int const x_895 = (*(tint_symbol_84)).numbers.arr[4];
   (*(tint_symbol_84)).numbers.arr[4] = 0;
   (*(tint_symbol_84)).numbers.arr[4] = x_895;
-  float const x_896 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_896;
-  float2 const x_507 = float2(x_461.x, x_447.x);
-  float const x_897 = color.y;
-  color.y = 0.0f;
-  color.y = x_897;
-  color.z = (x_304 + float(x_301));
+  float const x_896 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_896;
+  float2 const x_507 = float2(x_461[0], x_447[0]);
+  float const x_897 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_897;
+  color[2] = (x_304 + float(x_301));
   float2 const x_898 = uv;
   uv = float2(0.0f, 0.0f);
   uv = x_898;
-  float const x_899 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_899;
-  float3 const x_508 = float3(x_461.y, x_461.x, x_506.y);
-  float const x_900 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_900;
-  float const x_308 = uv.x;
-  float const x_901 = color.y;
-  color.y = 0.0f;
-  color.y = x_901;
-  float3 const x_509 = float3(x_503.y, x_503.x, x_448.z);
-  float const x_902 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_902;
-  float const x_310 = uv.y;
-  float const x_903 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_903;
-  float const x_904 = color.z;
-  color.z = 0.0f;
-  color.z = x_904;
-  float3 const x_510 = float3(float3(1.0f, 2.0f, 3.0f).y, x_485.y, x_485.z);
-  float const x_905 = color.z;
-  color.z = 0.0f;
-  color.z = x_905;
+  float const x_899 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_899;
+  float3 const x_508 = float3(x_461[1], x_461[0], x_506[1]);
+  float const x_900 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_900;
+  float const x_308 = uv[0];
+  float const x_901 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_901;
+  float3 const x_509 = float3(x_503[1], x_503[0], x_448[2]);
+  float const x_902 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_902;
+  float const x_310 = uv[1];
+  float const x_903 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_903;
+  float const x_904 = color[2];
+  color[2] = 0.0f;
+  color[2] = x_904;
+  float3 const x_510 = float3(float3(1.0f, 2.0f, 3.0f)[1], x_485[1], x_485[2]);
+  float const x_905 = color[2];
+  color[2] = 0.0f;
+  color[2] = x_905;
   int const x_906 = i_2;
   i_2 = 0;
   i_2 = x_906;
-  float2 const x_511 = float2(x_485.z, x_485.y);
+  float2 const x_511 = float2(x_485[2], x_485[1]);
   float3 const x_907 = color;
   color = float3(0.0f, 0.0f, 0.0f);
   color = x_907;
-  float const x_908 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_908;
-  float3 const x_512 = float3(x_455.y, x_455.y, x_455.y);
+  float const x_908 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_908;
+  float3 const x_512 = float3(x_455[1], x_455[1], x_455[1]);
   int const x_909 = (*(tint_symbol_84)).numbers.arr[4];
   (*(tint_symbol_84)).numbers.arr[4] = 0;
   (*(tint_symbol_84)).numbers.arr[4] = x_909;
   if ((fabs((x_308 - x_310)) < 0.25f)) {
-    float const x_910 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_910;
+    float const x_910 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_910;
     QuicksortObject const x_911 = *(tint_symbol_84);
     tint_array_wrapper const tint_symbol_72 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
     QuicksortObject const tint_symbol_73 = {.numbers=tint_symbol_72};
     *(tint_symbol_84) = tint_symbol_73;
     *(tint_symbol_84) = x_911;
-    float3 const x_513 = float3(x_505.z, x_505.x, x_448.x);
+    float3 const x_513 = float3(x_505[2], x_505[0], x_448[0]);
     int const x_912 = (*(tint_symbol_84)).numbers.arr[8];
     (*(tint_symbol_84)).numbers.arr[8] = 0;
     (*(tint_symbol_84)).numbers.arr[8] = x_912;
     int const x_317 = (*(tint_symbol_84)).numbers.arr[9u];
-    float3 const x_514 = float3(x_474.y, x_474.y, x_474.y);
-    float const x_913 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_913;
-    float const x_320 = color.x;
-    float const x_914 = uv.y;
-    uv.y = 0.0f;
-    uv.y = x_914;
-    float2 const x_515 = float2(x_502.x, x_502.y);
-    float const x_915 = color.x;
-    color.x = 0.0f;
-    color.x = x_915;
+    float3 const x_514 = float3(x_474[1], x_474[1], x_474[1]);
+    float const x_913 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_913;
+    float const x_320 = color[0];
+    float const x_914 = uv[1];
+    uv[1] = 0.0f;
+    uv[1] = x_914;
+    float2 const x_515 = float2(x_502[0], x_502[1]);
+    float const x_915 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_915;
     float3 const x_916 = color;
     color = float3(0.0f, 0.0f, 0.0f);
     color = x_916;
-    float2 const x_516 = float2(x_452.x, x_452.x);
+    float2 const x_516 = float2(x_452[0], x_452[0]);
     float2 const x_917 = uv;
     uv = float2(0.0f, 0.0f);
     uv = x_917;
-    float const x_918 = uv.x;
-    uv.x = 0.0f;
-    uv.x = x_918;
-    float3 const x_517 = float3(float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).x, float2(0.0f, 0.0f).y);
-    color.x = (float(x_317) + x_320);
-    float const x_919 = color.x;
-    color.x = 0.0f;
-    color.x = x_919;
-    float3 const x_518 = float3(x_480.y, x_508.x, x_480.x);
-    float const x_920 = color.x;
-    color.x = 0.0f;
-    color.x = x_920;
+    float const x_918 = uv[0];
+    uv[0] = 0.0f;
+    uv[0] = x_918;
+    float3 const x_517 = float3(float2(0.0f, 0.0f)[0], float2(0.0f, 0.0f)[0], float2(0.0f, 0.0f)[1]);
+    color[0] = (float(x_317) + x_320);
+    float const x_919 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_919;
+    float3 const x_518 = float3(x_480[1], x_508[0], x_480[0]);
+    float const x_920 = color[0];
+    color[0] = 0.0f;
+    color[0] = x_920;
   }
-  float const x_921 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_921;
+  float const x_921 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_921;
   float3 const x_325 = color;
   float const x_922 = uv[0];
   uv[0] = 0.0f;
   uv[0] = x_922;
-  float3 const x_519 = float3(x_447.x, x_446.x, x_446.y);
+  float3 const x_519 = float3(x_447[0], x_446[0], x_446[1]);
   float3 const x_326 = normalize(x_325);
-  float const x_923 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_923;
+  float const x_923 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_923;
   QuicksortObject const x_924 = *(tint_symbol_84);
   tint_array_wrapper const tint_symbol_74 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_75 = {.numbers=tint_symbol_74};
@@ -1519,31 +1519,31 @@
   QuicksortObject const tint_symbol_77 = {.numbers=tint_symbol_76};
   *(tint_symbol_84) = tint_symbol_77;
   *(tint_symbol_84) = x_925;
-  float const x_926 = color.y;
-  color.y = 0.0f;
-  color.y = x_926;
-  float2 const x_520 = float2(x_506.y, x_519.y);
-  float const x_927 = color.y;
-  color.y = 0.0f;
-  color.y = x_927;
-  float4 const x_330 = float4(x_326.x, x_326.y, x_326.z, 1.0f);
-  float const x_928 = uv.y;
-  uv.y = 0.0f;
-  uv.y = x_928;
-  float3 const x_521 = float3(float3(1.0f, 2.0f, 3.0f).y, float3(1.0f, 2.0f, 3.0f).y, x_520.y);
-  float const x_929 = uv.x;
-  uv.x = 0.0f;
-  uv.x = x_929;
+  float const x_926 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_926;
+  float2 const x_520 = float2(x_506[1], x_519[1]);
+  float const x_927 = color[1];
+  color[1] = 0.0f;
+  color[1] = x_927;
+  float4 const x_330 = float4(x_326[0], x_326[1], x_326[2], 1.0f);
+  float const x_928 = uv[1];
+  uv[1] = 0.0f;
+  uv[1] = x_928;
+  float3 const x_521 = float3(float3(1.0f, 2.0f, 3.0f)[1], float3(1.0f, 2.0f, 3.0f)[1], x_520[1]);
+  float const x_929 = uv[0];
+  uv[0] = 0.0f;
+  uv[0] = x_929;
   *(tint_symbol_86) = x_330;
   QuicksortObject const x_930 = *(tint_symbol_84);
   tint_array_wrapper const tint_symbol_78 = {.arr={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
   QuicksortObject const tint_symbol_79 = {.numbers=tint_symbol_78};
   *(tint_symbol_84) = tint_symbol_79;
   *(tint_symbol_84) = x_930;
-  float3 const x_522 = float3(x_330.w, x_330.y, x_493.x);
-  float const x_931 = color.x;
-  color.x = 0.0f;
-  color.x = x_931;
+  float3 const x_522 = float3(x_330[3], x_330[1], x_493[0]);
+  float const x_931 = color[0];
+  color[0] = 0.0f;
+  color[0] = x_931;
   return;
 }
 
diff --git a/test/bug/tint/757.wgsl.expected.msl b/test/bug/tint/757.wgsl.expected.msl
index c40c608..809bed6 100644
--- a/test/bug/tint/757.wgsl.expected.msl
+++ b/test/bug/tint/757.wgsl.expected.msl
@@ -9,11 +9,11 @@
 };
 
 void tint_symbol_inner(device Result& result, uint3 GlobalInvocationID, texture2d_array<float, access::sample> tint_symbol_1) {
-  uint flatIndex = ((((2u * 2u) * GlobalInvocationID.z) + (2u * GlobalInvocationID.y)) + GlobalInvocationID.x);
+  uint flatIndex = ((((2u * 2u) * GlobalInvocationID[2]) + (2u * GlobalInvocationID[1])) + GlobalInvocationID[0]);
   flatIndex = (flatIndex * 1u);
-  float4 texel = tint_symbol_1.read(uint2(int2(GlobalInvocationID.xy)), 0, 0);
+  float4 texel = tint_symbol_1.read(uint2(int2(uint3(GlobalInvocationID).xy)), 0, 0);
   for(uint i = 0u; (i < 1u); i = (i + 1u)) {
-    result.values[(flatIndex + i)] = texel.r;
+    result.values[(flatIndex + i)] = texel[0];
   }
 }
 
diff --git a/test/bug/tint/824.wgsl.expected.msl b/test/bug/tint/824.wgsl.expected.msl
index 3aa26e2..906762b 100644
--- a/test/bug/tint/824.wgsl.expected.msl
+++ b/test/bug/tint/824.wgsl.expected.msl
@@ -18,7 +18,7 @@
 
 Output tint_symbol_inner(uint VertexIndex, uint InstanceIndex) {
   tint_array_wrapper zv = {.arr={float2(0.200000003f, 0.200000003f), float2(0.300000012f, 0.300000012f), float2(-0.100000001f, -0.100000001f), float2(1.100000024f, 1.100000024f)}};
-  float const z = zv.arr[InstanceIndex].x;
+  float const z = zv.arr[InstanceIndex][0];
   Output output = {};
   output.Position = float4(0.5f, 0.5f, z, 1.0f);
   tint_array_wrapper_1 colors = {.arr={float4(1.0f, 0.0f, 0.0f, 1.0f), float4(0.0f, 1.0f, 0.0f, 1.0f), float4(0.0f, 0.0f, 1.0f, 1.0f), float4(1.0f, 1.0f, 1.0f, 1.0f)}};
diff --git a/test/bug/tint/827.wgsl.expected.msl b/test/bug/tint/827.wgsl.expected.msl
index f9eea7a..b11495f 100644
--- a/test/bug/tint/827.wgsl.expected.msl
+++ b/test/bug/tint/827.wgsl.expected.msl
@@ -7,7 +7,7 @@
 
 constant uint width = 128u;
 void tint_symbol_inner(device Result& result, uint3 GlobalInvocationId, depth2d<float, access::sample> tint_symbol_1) {
-  result.values[((GlobalInvocationId.y * width) + GlobalInvocationId.x)] = tint_symbol_1.read(uint2(int2(int(GlobalInvocationId.x), int(GlobalInvocationId.y))), 0);
+  result.values[((GlobalInvocationId[1] * width) + GlobalInvocationId[0])] = tint_symbol_1.read(uint2(int2(int(GlobalInvocationId[0]), int(GlobalInvocationId[1]))), 0);
 }
 
 kernel void tint_symbol(depth2d<float, access::sample> tint_symbol_2 [[texture(0)]], uint3 GlobalInvocationId [[thread_position_in_grid]], device Result& result [[buffer(0)]]) {
diff --git a/test/bug/tint/913.wgsl.expected.msl b/test/bug/tint/913.wgsl.expected.msl
index a577524..aa299f6 100644
--- a/test/bug/tint/913.wgsl.expected.msl
+++ b/test/bug/tint/913.wgsl.expected.msl
@@ -19,25 +19,25 @@
 void tint_symbol_inner(constant Uniforms& uniforms, device OutputBuf& output, uint3 GlobalInvocationID, texture2d<float, access::sample> tint_symbol_1, texture2d<float, access::sample> tint_symbol_2) {
   int2 const srcSize = int2(tint_symbol_1.get_width(), tint_symbol_1.get_height());
   int2 const dstSize = int2(tint_symbol_2.get_width(), tint_symbol_2.get_height());
-  uint2 const dstTexCoord = uint2(GlobalInvocationID.xy);
+  uint2 const dstTexCoord = uint2(uint3(GlobalInvocationID).xy);
   float4 const nonCoveredColor = float4(0.0f, 1.0f, 0.0f, 1.0f);
   bool success = true;
-  if (((((dstTexCoord.x < uniforms.dstCopyOrigin.x) || (dstTexCoord.y < uniforms.dstCopyOrigin.y)) || (dstTexCoord.x >= (uniforms.dstCopyOrigin.x + uniforms.copySize.x))) || (dstTexCoord.y >= (uniforms.dstCopyOrigin.y + uniforms.copySize.y)))) {
+  if (((((dstTexCoord[0] < uniforms.dstCopyOrigin[0]) || (dstTexCoord[1] < uniforms.dstCopyOrigin[1])) || (dstTexCoord[0] >= (uniforms.dstCopyOrigin[0] + uniforms.copySize[0]))) || (dstTexCoord[1] >= (uniforms.dstCopyOrigin[1] + uniforms.copySize[1])))) {
     success = (success && all((tint_symbol_2.read(uint2(int2(dstTexCoord)), 0) == nonCoveredColor)));
   } else {
     uint2 srcTexCoord = ((dstTexCoord - uniforms.dstCopyOrigin) + uniforms.srcCopyOrigin);
     if ((uniforms.dstTextureFlipY == 1u)) {
-      srcTexCoord.y = ((uint(srcSize.y) - srcTexCoord.y) - 1u);
+      srcTexCoord[1] = ((uint(srcSize[1]) - srcTexCoord[1]) - 1u);
     }
     float4 const srcColor = tint_symbol_1.read(uint2(int2(srcTexCoord)), 0);
     float4 const dstColor = tint_symbol_2.read(uint2(int2(dstTexCoord)), 0);
     if ((uniforms.channelCount == 2u)) {
-      success = ((success && aboutEqual(dstColor.r, srcColor.r)) && aboutEqual(dstColor.g, srcColor.g));
+      success = ((success && aboutEqual(dstColor[0], srcColor[0])) && aboutEqual(dstColor[1], srcColor[1]));
     } else {
-      success = ((((success && aboutEqual(dstColor.r, srcColor.r)) && aboutEqual(dstColor.g, srcColor.g)) && aboutEqual(dstColor.b, srcColor.b)) && aboutEqual(dstColor.a, srcColor.a));
+      success = ((((success && aboutEqual(dstColor[0], srcColor[0])) && aboutEqual(dstColor[1], srcColor[1])) && aboutEqual(dstColor[2], srcColor[2])) && aboutEqual(dstColor[3], srcColor[3]));
     }
   }
-  uint const outputIndex = ((GlobalInvocationID.y * uint(dstSize.x)) + GlobalInvocationID.x);
+  uint const outputIndex = ((GlobalInvocationID[1] * uint(dstSize[0])) + GlobalInvocationID[0]);
   if (success) {
     output.result[outputIndex] = 1u;
   } else {
diff --git a/test/bug/tint/914.wgsl.expected.msl b/test/bug/tint/914.wgsl.expected.msl
index 426f200..d0f5a3e 100644
--- a/test/bug/tint/914.wgsl.expected.msl
+++ b/test/bug/tint/914.wgsl.expected.msl
@@ -58,10 +58,10 @@
     (*(tint_symbol_2)).arr[i].arr[i_1] = float();
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
-  uint const tileRow = (local_id.y * RowPerThread);
-  uint const tileCol = (local_id.x * ColPerThread);
-  uint const globalRow = (global_id.y * RowPerThread);
-  uint const globalCol = (global_id.x * ColPerThread);
+  uint const tileRow = (local_id[1] * RowPerThread);
+  uint const tileCol = (local_id[0] * ColPerThread);
+  uint const globalRow = (global_id[1] * RowPerThread);
+  uint const globalCol = (global_id[0] * ColPerThread);
   uint const numTiles = (((uniforms.dimInner - 1u) / TileInner) + 1u);
   tint_array_wrapper_2 acc = {};
   float ACached = 0.0f;
@@ -70,9 +70,9 @@
     acc.arr[index] = 0.0f;
   }
   uint const ColPerThreadA = (TileInner / 16u);
-  uint const tileColA = (local_id.x * ColPerThreadA);
+  uint const tileColA = (local_id[0] * ColPerThreadA);
   uint const RowPerThreadB = (TileInner / 16u);
-  uint const tileRowB = (local_id.y * RowPerThreadB);
+  uint const tileRowB = (local_id[1] * RowPerThreadB);
   for(uint t = 0u; (t < numTiles); t = (t + 1u)) {
     for(uint innerRow = 0u; (innerRow < RowPerThread); innerRow = (innerRow + 1u)) {
       for(uint innerCol = 0u; (innerCol < ColPerThreadA); innerCol = (innerCol + 1u)) {
diff --git a/test/bug/tint/922.wgsl.expected.msl b/test/bug/tint/922.wgsl.expected.msl
index e9b7764..c1aa861 100644
--- a/test/bug/tint/922.wgsl.expected.msl
+++ b/test/bug/tint/922.wgsl.expected.msl
@@ -56,7 +56,7 @@
   Mat4x3_ const x_e2 = m1;
   Mat4x3_ const x_e5 = m1;
   Mat4x3_ const x_e8 = m1;
-  return float3(x_e2.mx.x, x_e5.my.x, x_e8.mz.x);
+  return float3(x_e2.mx[0], x_e5.my[0], x_e8.mz[0]);
 }
 
 float3 Mat4x3GetCol1_(Mat4x3_ m2) {
@@ -65,7 +65,7 @@
   Mat4x3_ const x_e2 = m3;
   Mat4x3_ const x_e5 = m3;
   Mat4x3_ const x_e8 = m3;
-  return float3(x_e2.mx.y, x_e5.my.y, x_e8.mz.y);
+  return float3(x_e2.mx[1], x_e5.my[1], x_e8.mz[1]);
 }
 
 float3 Mat4x3GetCol2_(Mat4x3_ m4) {
@@ -74,7 +74,7 @@
   Mat4x3_ const x_e2 = m5;
   Mat4x3_ const x_e5 = m5;
   Mat4x3_ const x_e8 = m5;
-  return float3(x_e2.mx.z, x_e5.my.z, x_e8.mz.z);
+  return float3(x_e2.mx[2], x_e5.my[2], x_e8.mz[2]);
 }
 
 float3 Mat4x3GetCol3_(Mat4x3_ m6) {
@@ -83,7 +83,7 @@
   Mat4x3_ const x_e2 = m7;
   Mat4x3_ const x_e5 = m7;
   Mat4x3_ const x_e8 = m7;
-  return float3(x_e2.mx.w, x_e5.my.w, x_e8.mz.w);
+  return float3(x_e2.mx[3], x_e5.my[3], x_e8.mz[3]);
 }
 
 float4 Mul(Mat4x4_ m8, float4 v) {
@@ -248,13 +248,13 @@
   float4 const x_e50 = *(tint_symbol_8);
   *(tint_symbol_9) = x_e50;
   float4 const x_e52 = global1.u_Misc0_;
-  if ((x_e52.x == 2.0f)) {
+  if ((x_e52[0] == 2.0f)) {
     {
       float3 const x_e59 = *(tint_symbol_10);
       Mat4x2_ const x_e64 = global1.u_TexMtx.arr[0];
       float3 const x_e65 = *(tint_symbol_10);
       float2 const x_e68 = Mul2(x_e64, float4(x_e65, 1.0f));
-      *(tint_symbol_11) = x_e68.xy;
+      *(tint_symbol_11) = float2(x_e68).xy;
       return;
     }
   } else {
@@ -263,7 +263,7 @@
       Mat4x2_ const x_e79 = global1.u_TexMtx.arr[0];
       float2 const x_e80 = *(tint_symbol_12);
       float2 const x_e84 = Mul2(x_e79, float4(x_e80, 1.0f, 1.0f));
-      *(tint_symbol_11) = x_e84.xy;
+      *(tint_symbol_11) = float2(x_e84).xy;
       return;
     }
   }
diff --git a/test/bug/tint/942.wgsl.expected.msl b/test/bug/tint/942.wgsl.expected.msl
index 935fd20..510cfec 100644
--- a/test/bug/tint/942.wgsl.expected.msl
+++ b/test/bug/tint/942.wgsl.expected.msl
@@ -24,14 +24,14 @@
   threadgroup_barrier(mem_flags::mem_threadgroup);
   uint const filterOffset = ((params.filterDim - 1u) / 2u);
   int2 const dims = int2(tint_symbol_2.get_width(0), tint_symbol_2.get_height(0));
-  int2 const baseIndex = as_type<int2>((as_type<uint2>(int2(((WorkGroupID.xy * uint2(params.blockDim, 4u)) + (LocalInvocationID.xy * uint2(4u, 1u))))) - as_type<uint2>(int2(int(filterOffset), 0))));
+  int2 const baseIndex = as_type<int2>((as_type<uint2>(int2(((uint3(WorkGroupID).xy * uint2(params.blockDim, 4u)) + (uint3(LocalInvocationID).xy * uint2(4u, 1u))))) - as_type<uint2>(int2(int(filterOffset), 0))));
   for(uint r = 0u; (r < 4u); r = (r + 1u)) {
     for(uint c = 0u; (c < 4u); c = (c + 1u)) {
       int2 loadIndex = as_type<int2>((as_type<uint2>(baseIndex) + as_type<uint2>(int2(int(c), int(r)))));
       if ((flip.value != 0u)) {
-        loadIndex = loadIndex.yx;
+        loadIndex = int2(loadIndex).yx;
       }
-      (*(tint_symbol_1)).arr[r].arr[((4u * LocalInvocationID.x) + c)] = tint_symbol_2.sample(tint_symbol_3, ((float2(loadIndex) + float2(0.25f, 0.25f)) / float2(dims)), level(0.0f)).rgb;
+      (*(tint_symbol_1)).arr[r].arr[((4u * LocalInvocationID[0]) + c)] = float4(tint_symbol_2.sample(tint_symbol_3, ((float2(loadIndex) + float2(0.25f, 0.25f)) / float2(dims)), level(0.0f))).rgb;
     }
   }
   threadgroup_barrier(mem_flags::mem_threadgroup);
@@ -39,9 +39,9 @@
     for(uint c = 0u; (c < 4u); c = (c + 1u)) {
       int2 writeIndex = as_type<int2>((as_type<uint2>(baseIndex) + as_type<uint2>(int2(int(c), int(r)))));
       if ((flip.value != 0u)) {
-        writeIndex = writeIndex.yx;
+        writeIndex = int2(writeIndex).yx;
       }
-      uint const center = ((4u * LocalInvocationID.x) + c);
+      uint const center = ((4u * LocalInvocationID[0]) + c);
       if ((((center >= filterOffset) && (center < (256u - filterOffset))) && all((writeIndex < dims)))) {
         float3 acc = float3(0.0f, 0.0f, 0.0f);
         for(uint f = 0u; (f < params.filterDim); f = (f + 1u)) {
diff --git a/test/bug/tint/943.spvasm.expected.msl b/test/bug/tint/943.spvasm.expected.msl
index a8806ca..d3178ac 100644
--- a/test/bug/tint/943.spvasm.expected.msl
+++ b/test/bug/tint/943.spvasm.expected.msl
@@ -58,8 +58,8 @@
   int2 param_10 = 0;
   int2 param_11 = 0;
   float x_430 = 0.0f;
-  int const x_417 = x_48.aShape.y;
-  int const x_419 = x_48.aShape.z;
+  int const x_417 = x_48.aShape[1];
+  int const x_419 = x_48.aShape[2];
   batchASize = as_type<int>((as_type<uint>(x_417) * as_type<uint>(x_419)));
   int const x_421 = *(row);
   int const x_422 = *(col);
@@ -88,8 +88,8 @@
   int2 param_12 = 0;
   int2 param_13 = 0;
   float x_468 = 0.0f;
-  int const x_455 = x_48.bShape.y;
-  int const x_457 = x_48.bShape.z;
+  int const x_455 = x_48.bShape[1];
+  int const x_457 = x_48.bShape[2];
   batchBSize = as_type<int>((as_type<uint>(x_455) * as_type<uint>(x_457)));
   int const x_459 = *(row_1);
   int const x_460 = *(col_1);
@@ -115,8 +115,8 @@
 
 int getOutputFlatIndex_vi3_(constant Uniforms& x_48, thread int3* const coords) {
   int3 const x_99 = *(coords);
-  int const x_105 = x_48.outShapeStrides.x;
-  int const x_107 = x_48.outShapeStrides.y;
+  int const x_105 = x_48.outShapeStrides[0];
+  int const x_107 = x_48.outShapeStrides[1];
   return int(dot(float3(x_99), float3(int3(x_105, x_107, 1))));
 }
 
@@ -203,13 +203,13 @@
   int param_7 = 0;
   int param_8 = 0;
   float param_9 = 0.0f;
-  uint const x_132 = (*(tint_symbol_9)).y;
+  uint const x_132 = (*(tint_symbol_9))[1];
   tileRow = as_type<int>((as_type<uint>(as_type<int>(x_132)) * as_type<uint>(1)));
-  uint const x_137 = (*(tint_symbol_9)).x;
+  uint const x_137 = (*(tint_symbol_9))[0];
   tileCol = as_type<int>((as_type<uint>(as_type<int>(x_137)) * as_type<uint>(1)));
-  uint const x_143 = (*(tint_symbol_10)).y;
+  uint const x_143 = (*(tint_symbol_10))[1];
   globalRow = as_type<int>((as_type<uint>(as_type<int>(x_143)) * as_type<uint>(1)));
-  uint const x_148 = (*(tint_symbol_10)).x;
+  uint const x_148 = (*(tint_symbol_10))[0];
   globalCol = as_type<int>((as_type<uint>(as_type<int>(x_148)) * as_type<uint>(1)));
   int const x_152 = *(dimInner);
   numTiles = as_type<int>((as_type<uint>((as_type<int>((as_type<uint>(x_152) - as_type<uint>(1))) / 64)) + as_type<uint>(1)));
@@ -240,9 +240,9 @@
       innerRow = as_type<int>((as_type<uint>(x_183) + as_type<uint>(1)));
     }
   }
-  uint const x_187 = (*(tint_symbol_9)).x;
+  uint const x_187 = (*(tint_symbol_9))[0];
   tileColA = as_type<int>((as_type<uint>(as_type<int>(x_187)) * as_type<uint>(64)));
-  uint const x_192 = (*(tint_symbol_9)).y;
+  uint const x_192 = (*(tint_symbol_9))[1];
   tileRowB = as_type<int>((as_type<uint>(as_type<int>(x_192)) * as_type<uint>(1)));
   t = 0;
   while (true) {
@@ -464,13 +464,13 @@
   int param_18 = 0;
   int param_19 = 0;
   int param_20 = 0;
-  int const x_67 = x_48.aShape.y;
+  int const x_67 = x_48.aShape[1];
   *(tint_symbol_17) = x_67;
-  int const x_71 = x_48.aShape.z;
+  int const x_71 = x_48.aShape[2];
   *(tint_symbol_18) = x_71;
-  int const x_75 = x_48.bShape.z;
+  int const x_75 = x_48.bShape[2];
   *(tint_symbol_19) = x_75;
-  uint const x_505 = (*(tint_symbol_20)).z;
+  uint const x_505 = (*(tint_symbol_20))[2];
   *(tint_symbol_21) = as_type<int>(x_505);
   int const x_508 = *(tint_symbol_17);
   param_18 = x_508;
diff --git a/test/bug/tint/948.wgsl.expected.msl b/test/bug/tint/948.wgsl.expected.msl
index a0e0430..711b38f 100644
--- a/test/bug/tint/948.wgsl.expected.msl
+++ b/test/bug/tint/948.wgsl.expected.msl
@@ -51,7 +51,7 @@
   float4 const x_47 = tint_symbol_5.sample(tint_symbol_6, float2(x_44, 0.25f), bias(0.0f));
   float const x_51 = fX;
   float4 const x_54 = tint_symbol_5.sample(tint_symbol_6, float2(x_51, 0.5f), bias(0.0f));
-  return float4x4(float4(x_40.x, x_40.y, x_40.z, x_40.w), float4(x_47.x, x_47.y, x_47.z, x_47.w), float4(x_54.x, x_54.y, x_54.z, x_54.w), float4(float4(0.0f, 0.0f, 0.0f, 0.0f).x, float4(0.0f, 0.0f, 0.0f, 0.0f).y, float4(0.0f, 0.0f, 0.0f, 0.0f).z, float4(0.0f, 0.0f, 0.0f, 0.0f).w));
+  return float4x4(float4(x_40[0], x_40[1], x_40[2], x_40[3]), float4(x_47[0], x_47[1], x_47[2], x_47[3]), float4(x_54[0], x_54[1], x_54[2], x_54[3]), float4(float4(0.0f, 0.0f, 0.0f, 0.0f)[0], float4(0.0f, 0.0f, 0.0f, 0.0f)[1], float4(0.0f, 0.0f, 0.0f, 0.0f)[2], float4(0.0f, 0.0f, 0.0f, 0.0f)[3]));
 }
 
 void main_1(constant LeftOver& x_20, thread float2* const tint_symbol_7, texture2d<float, access::sample> tint_symbol_8, sampler tint_symbol_9, texture2d<float, access::sample> tint_symbol_10, texture2d<float, access::sample> tint_symbol_11, sampler tint_symbol_12, thread float* const tint_symbol_13, texture2d<float, access::sample> tint_symbol_14, sampler tint_symbol_15, texture2d<float, access::sample> tint_symbol_16, sampler tint_symbol_17, thread float4* const tint_symbol_18) {
@@ -76,8 +76,8 @@
   color = float4(0.0f, 0.0f, 0.0f, 0.0f);
   float2 const x_86 = *(tint_symbol_7);
   tileUV = fract(x_86);
-  float const x_91 = tileUV.y;
-  tileUV.y = (1.0f - x_91);
+  float const x_91 = tileUV[1];
+  tileUV[1] = (1.0f - x_91);
   float2 const x_95 = *(tint_symbol_7);
   tileID = floor(x_95);
   float2 const x_101 = x_20.spriteMapSize;
@@ -99,14 +99,14 @@
         float2 const x_150 = tileID;
         float2 const x_154 = x_20.stageSize;
         float4 const x_156 = tint_symbol_8.sample(tint_symbol_9, ((x_150 + float2(0.5f, 0.5f)) / x_154), bias(0.0f));
-        frameID_1 = x_156.x;
+        frameID_1 = x_156[0];
         break;
       }
       case 0: {
         float2 const x_136 = tileID;
         float2 const x_140 = x_20.stageSize;
         float4 const x_142 = tint_symbol_10.sample(tint_symbol_9, ((x_136 + float2(0.5f, 0.5f)) / x_140), bias(0.0f));
-        frameID_1 = x_142.x;
+        frameID_1 = x_142[0];
         break;
       }
       default: {
@@ -117,10 +117,10 @@
     float const x_169 = x_20.spriteCount;
     float4 const x_172 = tint_symbol_11.sample(tint_symbol_12, float2(((x_166 + 0.5f) / x_169), 0.0f), bias(0.0f));
     animationData = x_172;
-    float const x_174 = animationData.y;
+    float const x_174 = animationData[1];
     if ((x_174 > 0.0f)) {
       float const x_181 = x_20.time;
-      float const x_184 = animationData.z;
+      float const x_184 = animationData[2];
       *(tint_symbol_13) = fmod((x_181 * x_184), 1.0f);
       f = 0.0f;
       while (true) {
@@ -129,10 +129,10 @@
         } else {
           break;
         }
-        float const x_197 = animationData.y;
+        float const x_197 = animationData[1];
         float const x_198 = *(tint_symbol_13);
         if ((x_197 > x_198)) {
-          float const x_203 = animationData.x;
+          float const x_203 = animationData[0];
           frameID_1 = x_203;
           break;
         }
@@ -153,17 +153,17 @@
     frameData = x_225;
     float4 const x_228 = frameData[0];
     float2 const x_231 = x_20.spriteMapSize;
-    frameSize = (float2(x_228.w, x_228.z) / x_231);
+    frameSize = (float2(x_228[3], x_228[2]) / x_231);
     float4 const x_235 = frameData[0];
     float2 const x_237 = sheetUnits;
-    offset_1 = (float2(x_235.x, x_235.y) * x_237);
+    offset_1 = (float2(x_235[0], x_235[1]) * x_237);
     float4 const x_241 = frameData[2];
     float4 const x_244 = frameData[0];
-    ratio = (float2(x_241.x, x_241.y) / float2(x_244.w, x_244.z));
-    float const x_248 = frameData[2].z;
+    ratio = (float2(x_241[0], x_241[1]) / float2(x_244[3], x_244[2]));
+    float const x_248 = frameData[2][2];
     if ((x_248 == 1.0f)) {
       float2 const x_252 = tileUV;
-      tileUV = float2(x_252.y, x_252.x);
+      tileUV = float2(x_252[1], x_252[0]);
     }
     int const x_254 = i;
     if ((x_254 == 0)) {
@@ -178,16 +178,16 @@
       float2 const x_277 = offset_1;
       float4 const x_279 = tint_symbol_16.sample(tint_symbol_17, ((x_274 * x_275) + x_277));
       nc = x_279;
-      float const x_283 = color.w;
-      float const x_285 = nc.w;
+      float const x_283 = color[3];
+      float const x_285 = nc[3];
       alpha = fmin((x_283 + x_285), 1.0f);
       float4 const x_290 = color;
       float4 const x_292 = nc;
-      float const x_295 = nc.w;
-      mixed = mix(float3(x_290.x, x_290.y, x_290.z), float3(x_292.x, x_292.y, x_292.z), float3(x_295, x_295, x_295));
+      float const x_295 = nc[3];
+      mixed = mix(float3(x_290[0], x_290[1], x_290[2]), float3(x_292[0], x_292[1], x_292[2]), float3(x_295, x_295, x_295));
       float3 const x_298 = mixed;
       float const x_299 = alpha;
-      color = float4(x_298.x, x_298.y, x_298.z, x_299);
+      color = float4(x_298[0], x_298[1], x_298[2], x_299);
     }
     {
       int const x_304 = i;
@@ -196,9 +196,9 @@
   }
   float3 const x_310 = x_20.colorMul;
   float4 const x_311 = color;
-  float3 const x_313 = (float3(x_311.x, x_311.y, x_311.z) * x_310);
+  float3 const x_313 = (float3(x_311[0], x_311[1], x_311[2]) * x_310);
   float4 const x_314 = color;
-  color = float4(x_313.x, x_313.y, x_313.z, x_314.w);
+  color = float4(x_313[0], x_313[1], x_313[2], x_314[3]);
   float4 const x_318 = color;
   *(tint_symbol_18) = x_318;
   return;
diff --git a/test/bug/tint/949.wgsl.expected.msl b/test/bug/tint/949.wgsl.expected.msl
index 776865d..c3a16ec 100644
--- a/test/bug/tint/949.wgsl.expected.msl
+++ b/test/bug/tint/949.wgsl.expected.msl
@@ -76,19 +76,19 @@
   float3 const x_150 = dp1;
   dp1perp = cross(x_149, x_150);
   float3 const x_153 = dp2perp;
-  float const x_155 = duv1.x;
+  float const x_155 = duv1[0];
   float3 const x_157 = dp1perp;
-  float const x_159 = duv2.x;
+  float const x_159 = duv2[0];
   tangent = ((x_153 * x_155) + (x_157 * x_159));
   float3 const x_163 = dp2perp;
-  float const x_165 = duv1.y;
+  float const x_165 = duv1[1];
   float3 const x_167 = dp1perp;
-  float const x_169 = duv2.y;
+  float const x_169 = duv2[1];
   bitangent = ((x_163 * x_165) + (x_167 * x_169));
-  float const x_173 = (*(tangentSpaceParams)).x;
+  float const x_173 = (*(tangentSpaceParams))[0];
   float3 const x_174 = tangent;
   tangent = (x_174 * x_173);
-  float const x_177 = (*(tangentSpaceParams)).y;
+  float const x_177 = (*(tangentSpaceParams))[1];
   float3 const x_178 = bitangent;
   bitangent = (x_178 * x_177);
   float3 const x_181 = tangent;
@@ -103,7 +103,7 @@
   float const x_193 = invmax;
   float3 const x_194 = (x_192 * x_193);
   float3 const x_195 = *(normal_1);
-  return float3x3(float3(x_191.x, x_191.y, x_191.z), float3(x_194.x, x_194.y, x_194.z), float3(x_195.x, x_195.y, x_195.z));
+  return float3x3(float3(x_191[0], x_191[1], x_191[2]), float3(x_194[0], x_194[1], x_194[2]), float3(x_195[0], x_195[1], x_195[2]));
 }
 
 float3x3 transposeMat3_mf33_(thread float3x3* const inMatrix) {
@@ -117,19 +117,19 @@
   i1 = x_64;
   float3 const x_68 = (*(inMatrix))[2];
   i2 = x_68;
-  float const x_73 = i0.x;
-  float const x_75 = i1.x;
-  float const x_77 = i2.x;
+  float const x_73 = i0[0];
+  float const x_75 = i1[0];
+  float const x_77 = i2[0];
   float3 const x_78 = float3(x_73, x_75, x_77);
-  float const x_81 = i0.y;
-  float const x_83 = i1.y;
-  float const x_85 = i2.y;
+  float const x_81 = i0[1];
+  float const x_83 = i1[1];
+  float const x_85 = i2[1];
   float3 const x_86 = float3(x_81, x_83, x_85);
-  float const x_89 = i0.z;
-  float const x_91 = i1.z;
-  float const x_93 = i2.z;
+  float const x_89 = i0[2];
+  float const x_91 = i1[2];
+  float const x_93 = i2[2];
   float3 const x_94 = float3(x_89, x_91, x_93);
-  outMatrix = float3x3(float3(x_78.x, x_78.y, x_78.z), float3(x_86.x, x_86.y, x_86.z), float3(x_94.x, x_94.y, x_94.z));
+  outMatrix = float3x3(float3(x_78[0], x_78[1], x_78[2]), float3(x_86[0], x_86[1], x_86[2]), float3(x_94[0], x_94[1], x_94[2]));
   float3x3 const x_110 = outMatrix;
   return x_110;
 }
@@ -161,14 +161,14 @@
   float specComp = 0.0f;
   float3 const x_212 = *(vNormal);
   float4 const x_213 = *(lightData);
-  ndl = ((dot(x_212, float3(x_213.x, x_213.y, x_213.z)) * 0.5f) + 0.5f);
+  ndl = ((dot(x_212, float3(x_213[0], x_213[1], x_213[2])) * 0.5f) + 0.5f);
   float3 const x_220 = *(groundColor);
   float3 const x_221 = *(diffuseColor);
   float const x_222 = ndl;
   result.diffuse = mix(x_220, x_221, float3(x_222, x_222, x_222));
   float3 const x_227 = *(viewDirectionW);
   float4 const x_228 = *(lightData);
-  angleW = normalize((x_227 + float3(x_228.x, x_228.y, x_228.z)));
+  angleW = normalize((x_227 + float3(x_228[0], x_228[1], x_228[2])));
   float3 const x_233 = *(vNormal);
   float3 const x_234 = angleW;
   specComp = fmax(0.0f, dot(x_233, x_234));
@@ -243,10 +243,10 @@
   tempTextureRead = x_262;
   float4 const x_264 = tempTextureRead;
   float const x_273 = x_269.textureInfoName;
-  rgb = (float3(x_264.x, x_264.y, x_264.z) * x_273);
+  rgb = (float3(x_264[0], x_264[1], x_264[2]) * x_273);
   float3 const x_279 = x_269.u_cameraPosition;
   float4 const x_282 = *(tint_symbol_10);
-  output5 = normalize((x_279 - float3(x_282.x, x_282.y, x_282.z)));
+  output5 = normalize((x_279 - float3(x_282[0], x_282[1], x_282[2])));
   output4 = float4(0.0f, 0.0f, 0.0f, 0.0f);
   uvOffset = float2(0.0f, 0.0f);
   float const x_292 = x_269.u_bumpStrength;
@@ -263,9 +263,9 @@
   TBNUV = x_307;
   float4 const x_310 = *(tint_symbol_13);
   float const x_312 = normalScale;
-  param_3 = (float3(x_310.x, x_310.y, x_310.z) * x_312);
+  param_3 = (float3(x_310[0], x_310[1], x_310[2]) * x_312);
   float4 const x_317 = *(tint_symbol_10);
-  param_4 = float3(x_317.x, x_317.y, x_317.z);
+  param_4 = float3(x_317[0], x_317[1], x_317[2]);
   float2 const x_320 = TBNUV;
   param_5 = x_320;
   float2 const x_324 = x_269.tangentSpaceParameter0;
@@ -281,14 +281,14 @@
   float3 const x_334 = (x_331 * -(x_332));
   float3x3 const x_337 = invTBN;
   float3 const x_338 = output5;
-  parallaxLimit = (length(float2(x_334.x, x_334.y)) / ((x_337 * -(x_338))).z);
+  parallaxLimit = (length(float2(x_334[0], x_334[1])) / ((x_337 * -(x_338)))[2]);
   float const x_345 = x_269.u_parallaxScale;
   float const x_346 = parallaxLimit;
   parallaxLimit = (x_346 * x_345);
   float3x3 const x_349 = invTBN;
   float3 const x_350 = output5;
   float3 const x_352 = (x_349 * -(x_350));
-  vOffsetDir = normalize(float2(x_352.x, x_352.y));
+  vOffsetDir = normalize(float2(x_352[0], x_352[1]));
   float2 const x_356 = vOffsetDir;
   float const x_357 = parallaxLimit;
   vMaxOffset = (x_356 * x_357);
@@ -296,7 +296,7 @@
   float3 const x_362 = output5;
   float3x3 const x_365 = invTBN;
   float4 const x_366 = *(tint_symbol_13);
-  numSamples = (15.0f + (dot((x_361 * -(x_362)), (x_365 * float3(x_366.x, x_366.y, x_366.z))) * -11.0f));
+  numSamples = (15.0f + (dot((x_361 * -(x_362)), (x_365 * float3(x_366[0], x_366[1], x_366[2]))) * -11.0f));
   float const x_374 = numSamples;
   stepSize = (1.0f / x_374);
   currRayHeight = 1.0f;
@@ -314,7 +314,7 @@
     float2 const x_394 = *(tint_symbol_12);
     float2 const x_395 = vCurrOffset;
     float4 const x_397 = tint_symbol_8.sample(tint_symbol_9, (x_394 + x_395));
-    currSampledHeight = x_397.w;
+    currSampledHeight = x_397[3];
     float const x_400 = currSampledHeight;
     float const x_401 = currRayHeight;
     if ((x_400 > x_401)) {
@@ -363,11 +363,11 @@
   float const x_454 = x_269.u_bumpStrength;
   float3x3 const x_457 = TBN;
   param_8 = x_457;
-  param_9 = float3(x_452.x, x_452.y, x_452.z);
+  param_9 = float3(x_452[0], x_452[1], x_452[2]);
   param_10 = (1.0f / x_454);
   float3 const x_461 = perturbNormal_mf33_vf3_f1_(&(param_8), &(param_9), &(param_10));
   float4 const x_462 = output4;
-  output4 = float4(x_461.x, x_461.y, x_461.z, x_462.w);
+  output4 = float4(x_461[0], x_461[1], x_461[2], x_462[3]);
   float2 const x_465 = *(tint_symbol_12);
   float2 const x_466 = uvOffset;
   output6 = (x_465 + x_466);
@@ -375,17 +375,17 @@
   float4 const x_475 = tint_symbol_14.sample(tint_symbol_15, x_474);
   tempTextureRead1 = x_475;
   float4 const x_477 = tempTextureRead1;
-  rgb1 = float3(x_477.x, x_477.y, x_477.z);
+  rgb1 = float3(x_477[0], x_477[1], x_477[2]);
   float3 const x_481 = x_269.u_cameraPosition;
   float4 const x_482 = *(tint_symbol_10);
-  viewDirectionW_1 = normalize((x_481 - float3(x_482.x, x_482.y, x_482.z)));
+  viewDirectionW_1 = normalize((x_481 - float3(x_482[0], x_482[1], x_482[2])));
   shadow = 1.0f;
   float const x_488 = *(tint_symbol_5);
   glossiness_1 = (1.0f * x_488);
   diffuseBase = float3(0.0f, 0.0f, 0.0f);
   specularBase = float3(0.0f, 0.0f, 0.0f);
   float4 const x_494 = output4;
-  normalW = float3(x_494.x, x_494.y, x_494.z);
+  normalW = float3(x_494[0], x_494[1], x_494[2]);
   float3 const x_501 = viewDirectionW_1;
   param_11 = x_501;
   float3 const x_503 = normalW;
@@ -393,9 +393,9 @@
   float4 const x_507 = light0.vLightData;
   param_13 = x_507;
   float4 const x_510 = light0.vLightDiffuse;
-  param_14 = float3(x_510.x, x_510.y, x_510.z);
+  param_14 = float3(x_510[0], x_510[1], x_510[2]);
   float4 const x_514 = light0.vLightSpecular;
-  param_15 = float3(x_514.x, x_514.y, x_514.z);
+  param_15 = float3(x_514[0], x_514[1], x_514[2]);
   float3 const x_518 = light0.vLightGround;
   param_16 = x_518;
   float const x_520 = glossiness_1;
@@ -421,7 +421,7 @@
   float3 const x_544 = specularOutput;
   output3 = (x_543 + x_544);
   float3 const x_548 = output3;
-  *(tint_symbol_16) = float4(x_548.x, x_548.y, x_548.z, 1.0f);
+  *(tint_symbol_16) = float4(x_548[0], x_548[1], x_548[2], 1.0f);
   return;
 }
 
diff --git a/test/bug/tint/951.spvasm.expected.msl b/test/bug/tint/951.spvasm.expected.msl
index b8d78da..57b22d3 100644
--- a/test/bug/tint/951.spvasm.expected.msl
+++ b/test/bug/tint/951.spvasm.expected.msl
@@ -16,7 +16,7 @@
 };
 
 float getAAtOutCoords_(const device ssbA& x_20, thread uint3* const tint_symbol_2) {
-  uint const x_42 = (*(tint_symbol_2)).x;
+  uint const x_42 = (*(tint_symbol_2))[0];
   float const x_44 = x_20.A[x_42];
   return x_44;
 }
@@ -43,7 +43,7 @@
   float param = 0.0f;
   int param_1 = 0;
   float param_2 = 0.0f;
-  uint const x_61 = (*(tint_symbol_3)).x;
+  uint const x_61 = (*(tint_symbol_3))[0];
   index = as_type<int>(x_61);
   int const x_63 = index;
   int const x_70 = x_24.size;
diff --git a/test/bug/tint/977.spvasm.expected.msl b/test/bug/tint/977.spvasm.expected.msl
index fc98b33..c729f30 100644
--- a/test/bug/tint/977.spvasm.expected.msl
+++ b/test/bug/tint/977.spvasm.expected.msl
@@ -42,7 +42,7 @@
   int a_1 = 0;
   float param = 0.0f;
   float param_1 = 0.0f;
-  uint const x_54 = (*(tint_symbol_2)).x;
+  uint const x_54 = (*(tint_symbol_2))[0];
   index = as_type<int>(x_54);
   a_1 = -10;
   int const x_63 = index;
diff --git a/test/expressions/splat/with_swizzle/f32.wgsl.expected.msl b/test/expressions/splat/with_swizzle/f32.wgsl.expected.msl
index 64e4f8c..2f9ac2a 100644
--- a/test/expressions/splat/with_swizzle/f32.wgsl.expected.msl
+++ b/test/expressions/splat/with_swizzle/f32.wgsl.expected.msl
@@ -2,8 +2,8 @@
 
 using namespace metal;
 void f() {
-  float a = float2(1.0f).y;
-  float b = float3(1.0f).z;
-  float c = float4(1.0f).w;
+  float a = float2(1.0f)[1];
+  float b = float3(1.0f)[2];
+  float c = float4(1.0f)[3];
 }
 
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl b/test/expressions/swizzle/read/packed_vec3/f32.wgsl
new file mode 100644
index 0000000..81a9220
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl
@@ -0,0 +1,144 @@
+[[block]]
+struct S {
+    v: vec3<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> U : S;
+
+fn f() {
+    var    v = U.v;
+
+    var    x = U.v.x;
+    var    y = U.v.y;
+    var    z = U.v.z;
+
+    var   xx = U.v.xx;
+    var   xy = U.v.xy;
+    var   xz = U.v.xz;
+    var   yx = U.v.yx;
+    var   yy = U.v.yy;
+    var   yz = U.v.yz;
+    var   zx = U.v.zx;
+    var   zy = U.v.zy;
+    var   zz = U.v.zz;
+
+    var  xxx = U.v.xxx;
+    var  xxy = U.v.xxy;
+    var  xxz = U.v.xxz;
+    var  xyx = U.v.xyx;
+    var  xyy = U.v.xyy;
+    var  xyz = U.v.xyz;
+    var  xzx = U.v.xzx;
+    var  xzy = U.v.xzy;
+    var  xzz = U.v.xzz;
+
+    var  yxx = U.v.yxx;
+    var  yxy = U.v.yxy;
+    var  yxz = U.v.yxz;
+    var  yyx = U.v.yyx;
+    var  yyy = U.v.yyy;
+    var  yyz = U.v.yyz;
+    var  yzx = U.v.yzx;
+    var  yzy = U.v.yzy;
+    var  yzz = U.v.yzz;
+
+    var  zxx = U.v.zxx;
+    var  zxy = U.v.zxy;
+    var  zxz = U.v.zxz;
+    var  zyx = U.v.zyx;
+    var  zyy = U.v.zyy;
+    var  zyz = U.v.zyz;
+    var  zzx = U.v.zzx;
+    var  zzy = U.v.zzy;
+    var  zzz = U.v.zzz;
+
+    var xxxx = U.v.xxxx;
+    var xxxy = U.v.xxxy;
+    var xxxz = U.v.xxxz;
+    var xxyx = U.v.xxyx;
+    var xxyy = U.v.xxyy;
+    var xxyz = U.v.xxyz;
+    var xxzx = U.v.xxzx;
+    var xxzy = U.v.xxzy;
+    var xxzz = U.v.xxzz;
+
+    var xyxx = U.v.xyxx;
+    var xyxy = U.v.xyxy;
+    var xyxz = U.v.xyxz;
+    var xyyx = U.v.xyyx;
+    var xyyy = U.v.xyyy;
+    var xyyz = U.v.xyyz;
+    var xyzx = U.v.xyzx;
+    var xyzy = U.v.xyzy;
+    var xyzz = U.v.xyzz;
+
+    var xzxx = U.v.xzxx;
+    var xzxy = U.v.xzxy;
+    var xzxz = U.v.xzxz;
+    var xzyx = U.v.xzyx;
+    var xzyy = U.v.xzyy;
+    var xzyz = U.v.xzyz;
+    var xzzx = U.v.xzzx;
+    var xzzy = U.v.xzzy;
+    var xzzz = U.v.xzzz;
+
+    var yxxx = U.v.yxxx;
+    var yxxy = U.v.yxxy;
+    var yxxz = U.v.yxxz;
+    var yxyx = U.v.yxyx;
+    var yxyy = U.v.yxyy;
+    var yxyz = U.v.yxyz;
+    var yxzx = U.v.yxzx;
+    var yxzy = U.v.yxzy;
+    var yxzz = U.v.yxzz;
+
+    var yyxx = U.v.yyxx;
+    var yyxy = U.v.yyxy;
+    var yyxz = U.v.yyxz;
+    var yyyx = U.v.yyyx;
+    var yyyy = U.v.yyyy;
+    var yyyz = U.v.yyyz;
+    var yyzx = U.v.yyzx;
+    var yyzy = U.v.yyzy;
+    var yyzz = U.v.yyzz;
+
+    var yzxx = U.v.yzxx;
+    var yzxy = U.v.yzxy;
+    var yzxz = U.v.yzxz;
+    var yzyx = U.v.yzyx;
+    var yzyy = U.v.yzyy;
+    var yzyz = U.v.yzyz;
+    var yzzx = U.v.yzzx;
+    var yzzy = U.v.yzzy;
+    var yzzz = U.v.yzzz;
+
+    var zxxx = U.v.zxxx;
+    var zxxy = U.v.zxxy;
+    var zxxz = U.v.zxxz;
+    var zxyx = U.v.zxyx;
+    var zxyy = U.v.zxyy;
+    var zxyz = U.v.zxyz;
+    var zxzx = U.v.zxzx;
+    var zxzy = U.v.zxzy;
+    var zxzz = U.v.zxzz;
+
+    var zyxx = U.v.zyxx;
+    var zyxy = U.v.zyxy;
+    var zyxz = U.v.zyxz;
+    var zyyx = U.v.zyyx;
+    var zyyy = U.v.zyyy;
+    var zyyz = U.v.zyyz;
+    var zyzx = U.v.zyzx;
+    var zyzy = U.v.zyzy;
+    var zyzz = U.v.zyzz;
+
+    var zzxx = U.v.zzxx;
+    var zzxy = U.v.zzxy;
+    var zzxz = U.v.zzxz;
+    var zzyx = U.v.zzyx;
+    var zzyy = U.v.zzyy;
+    var zzyz = U.v.zzyz;
+    var zzzx = U.v.zzzx;
+    var zzzy = U.v.zzzy;
+    var zzzz = U.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.hlsl b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..a0fa0de
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,132 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+cbuffer cbuffer_U : register(b0, space0) {
+  uint4 U[1];
+};
+
+void f() {
+  float3 v = asfloat(U[0].xyz);
+  float x = asfloat(U[0].x);
+  float y = asfloat(U[0].y);
+  float z = asfloat(U[0].z);
+  float2 xx = asfloat(U[0].xyz).xx;
+  float2 xy = asfloat(U[0].xyz).xy;
+  float2 xz = asfloat(U[0].xyz).xz;
+  float2 yx = asfloat(U[0].xyz).yx;
+  float2 yy = asfloat(U[0].xyz).yy;
+  float2 yz = asfloat(U[0].xyz).yz;
+  float2 zx = asfloat(U[0].xyz).zx;
+  float2 zy = asfloat(U[0].xyz).zy;
+  float2 zz = asfloat(U[0].xyz).zz;
+  float3 xxx = asfloat(U[0].xyz).xxx;
+  float3 xxy = asfloat(U[0].xyz).xxy;
+  float3 xxz = asfloat(U[0].xyz).xxz;
+  float3 xyx = asfloat(U[0].xyz).xyx;
+  float3 xyy = asfloat(U[0].xyz).xyy;
+  float3 xyz = asfloat(U[0].xyz).xyz;
+  float3 xzx = asfloat(U[0].xyz).xzx;
+  float3 xzy = asfloat(U[0].xyz).xzy;
+  float3 xzz = asfloat(U[0].xyz).xzz;
+  float3 yxx = asfloat(U[0].xyz).yxx;
+  float3 yxy = asfloat(U[0].xyz).yxy;
+  float3 yxz = asfloat(U[0].xyz).yxz;
+  float3 yyx = asfloat(U[0].xyz).yyx;
+  float3 yyy = asfloat(U[0].xyz).yyy;
+  float3 yyz = asfloat(U[0].xyz).yyz;
+  float3 yzx = asfloat(U[0].xyz).yzx;
+  float3 yzy = asfloat(U[0].xyz).yzy;
+  float3 yzz = asfloat(U[0].xyz).yzz;
+  float3 zxx = asfloat(U[0].xyz).zxx;
+  float3 zxy = asfloat(U[0].xyz).zxy;
+  float3 zxz = asfloat(U[0].xyz).zxz;
+  float3 zyx = asfloat(U[0].xyz).zyx;
+  float3 zyy = asfloat(U[0].xyz).zyy;
+  float3 zyz = asfloat(U[0].xyz).zyz;
+  float3 zzx = asfloat(U[0].xyz).zzx;
+  float3 zzy = asfloat(U[0].xyz).zzy;
+  float3 zzz = asfloat(U[0].xyz).zzz;
+  float4 xxxx = asfloat(U[0].xyz).xxxx;
+  float4 xxxy = asfloat(U[0].xyz).xxxy;
+  float4 xxxz = asfloat(U[0].xyz).xxxz;
+  float4 xxyx = asfloat(U[0].xyz).xxyx;
+  float4 xxyy = asfloat(U[0].xyz).xxyy;
+  float4 xxyz = asfloat(U[0].xyz).xxyz;
+  float4 xxzx = asfloat(U[0].xyz).xxzx;
+  float4 xxzy = asfloat(U[0].xyz).xxzy;
+  float4 xxzz = asfloat(U[0].xyz).xxzz;
+  float4 xyxx = asfloat(U[0].xyz).xyxx;
+  float4 xyxy = asfloat(U[0].xyz).xyxy;
+  float4 xyxz = asfloat(U[0].xyz).xyxz;
+  float4 xyyx = asfloat(U[0].xyz).xyyx;
+  float4 xyyy = asfloat(U[0].xyz).xyyy;
+  float4 xyyz = asfloat(U[0].xyz).xyyz;
+  float4 xyzx = asfloat(U[0].xyz).xyzx;
+  float4 xyzy = asfloat(U[0].xyz).xyzy;
+  float4 xyzz = asfloat(U[0].xyz).xyzz;
+  float4 xzxx = asfloat(U[0].xyz).xzxx;
+  float4 xzxy = asfloat(U[0].xyz).xzxy;
+  float4 xzxz = asfloat(U[0].xyz).xzxz;
+  float4 xzyx = asfloat(U[0].xyz).xzyx;
+  float4 xzyy = asfloat(U[0].xyz).xzyy;
+  float4 xzyz = asfloat(U[0].xyz).xzyz;
+  float4 xzzx = asfloat(U[0].xyz).xzzx;
+  float4 xzzy = asfloat(U[0].xyz).xzzy;
+  float4 xzzz = asfloat(U[0].xyz).xzzz;
+  float4 yxxx = asfloat(U[0].xyz).yxxx;
+  float4 yxxy = asfloat(U[0].xyz).yxxy;
+  float4 yxxz = asfloat(U[0].xyz).yxxz;
+  float4 yxyx = asfloat(U[0].xyz).yxyx;
+  float4 yxyy = asfloat(U[0].xyz).yxyy;
+  float4 yxyz = asfloat(U[0].xyz).yxyz;
+  float4 yxzx = asfloat(U[0].xyz).yxzx;
+  float4 yxzy = asfloat(U[0].xyz).yxzy;
+  float4 yxzz = asfloat(U[0].xyz).yxzz;
+  float4 yyxx = asfloat(U[0].xyz).yyxx;
+  float4 yyxy = asfloat(U[0].xyz).yyxy;
+  float4 yyxz = asfloat(U[0].xyz).yyxz;
+  float4 yyyx = asfloat(U[0].xyz).yyyx;
+  float4 yyyy = asfloat(U[0].xyz).yyyy;
+  float4 yyyz = asfloat(U[0].xyz).yyyz;
+  float4 yyzx = asfloat(U[0].xyz).yyzx;
+  float4 yyzy = asfloat(U[0].xyz).yyzy;
+  float4 yyzz = asfloat(U[0].xyz).yyzz;
+  float4 yzxx = asfloat(U[0].xyz).yzxx;
+  float4 yzxy = asfloat(U[0].xyz).yzxy;
+  float4 yzxz = asfloat(U[0].xyz).yzxz;
+  float4 yzyx = asfloat(U[0].xyz).yzyx;
+  float4 yzyy = asfloat(U[0].xyz).yzyy;
+  float4 yzyz = asfloat(U[0].xyz).yzyz;
+  float4 yzzx = asfloat(U[0].xyz).yzzx;
+  float4 yzzy = asfloat(U[0].xyz).yzzy;
+  float4 yzzz = asfloat(U[0].xyz).yzzz;
+  float4 zxxx = asfloat(U[0].xyz).zxxx;
+  float4 zxxy = asfloat(U[0].xyz).zxxy;
+  float4 zxxz = asfloat(U[0].xyz).zxxz;
+  float4 zxyx = asfloat(U[0].xyz).zxyx;
+  float4 zxyy = asfloat(U[0].xyz).zxyy;
+  float4 zxyz = asfloat(U[0].xyz).zxyz;
+  float4 zxzx = asfloat(U[0].xyz).zxzx;
+  float4 zxzy = asfloat(U[0].xyz).zxzy;
+  float4 zxzz = asfloat(U[0].xyz).zxzz;
+  float4 zyxx = asfloat(U[0].xyz).zyxx;
+  float4 zyxy = asfloat(U[0].xyz).zyxy;
+  float4 zyxz = asfloat(U[0].xyz).zyxz;
+  float4 zyyx = asfloat(U[0].xyz).zyyx;
+  float4 zyyy = asfloat(U[0].xyz).zyyy;
+  float4 zyyz = asfloat(U[0].xyz).zyyz;
+  float4 zyzx = asfloat(U[0].xyz).zyzx;
+  float4 zyzy = asfloat(U[0].xyz).zyzy;
+  float4 zyzz = asfloat(U[0].xyz).zyzz;
+  float4 zzxx = asfloat(U[0].xyz).zzxx;
+  float4 zzxy = asfloat(U[0].xyz).zzxy;
+  float4 zzxz = asfloat(U[0].xyz).zzxz;
+  float4 zzyx = asfloat(U[0].xyz).zzyx;
+  float4 zzyy = asfloat(U[0].xyz).zzyy;
+  float4 zzyz = asfloat(U[0].xyz).zzyz;
+  float4 zzzx = asfloat(U[0].xyz).zzzx;
+  float4 zzzy = asfloat(U[0].xyz).zzzy;
+  float4 zzzz = asfloat(U[0].xyz).zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..b38da02
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.msl
@@ -0,0 +1,143 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, int N, int M>
+inline auto operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
+  return lhs * vec<T, N>(rhs);
+}
+
+template<typename T, int N, int M>
+inline auto operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
+  return vec<T, M>(lhs) * rhs;
+}
+
+struct S {
+  /* 0x0000 */ packed_float3 v;
+  /* 0x000c */ int8_t tint_pad[4];
+};
+
+void f(constant S& U) {
+  float3 v = U.v;
+  float x = U.v[0];
+  float y = U.v[1];
+  float z = U.v[2];
+  float2 xx = float3(U.v).xx;
+  float2 xy = float3(U.v).xy;
+  float2 xz = float3(U.v).xz;
+  float2 yx = float3(U.v).yx;
+  float2 yy = float3(U.v).yy;
+  float2 yz = float3(U.v).yz;
+  float2 zx = float3(U.v).zx;
+  float2 zy = float3(U.v).zy;
+  float2 zz = float3(U.v).zz;
+  float3 xxx = float3(U.v).xxx;
+  float3 xxy = float3(U.v).xxy;
+  float3 xxz = float3(U.v).xxz;
+  float3 xyx = float3(U.v).xyx;
+  float3 xyy = float3(U.v).xyy;
+  float3 xyz = float3(U.v).xyz;
+  float3 xzx = float3(U.v).xzx;
+  float3 xzy = float3(U.v).xzy;
+  float3 xzz = float3(U.v).xzz;
+  float3 yxx = float3(U.v).yxx;
+  float3 yxy = float3(U.v).yxy;
+  float3 yxz = float3(U.v).yxz;
+  float3 yyx = float3(U.v).yyx;
+  float3 yyy = float3(U.v).yyy;
+  float3 yyz = float3(U.v).yyz;
+  float3 yzx = float3(U.v).yzx;
+  float3 yzy = float3(U.v).yzy;
+  float3 yzz = float3(U.v).yzz;
+  float3 zxx = float3(U.v).zxx;
+  float3 zxy = float3(U.v).zxy;
+  float3 zxz = float3(U.v).zxz;
+  float3 zyx = float3(U.v).zyx;
+  float3 zyy = float3(U.v).zyy;
+  float3 zyz = float3(U.v).zyz;
+  float3 zzx = float3(U.v).zzx;
+  float3 zzy = float3(U.v).zzy;
+  float3 zzz = float3(U.v).zzz;
+  float4 xxxx = float3(U.v).xxxx;
+  float4 xxxy = float3(U.v).xxxy;
+  float4 xxxz = float3(U.v).xxxz;
+  float4 xxyx = float3(U.v).xxyx;
+  float4 xxyy = float3(U.v).xxyy;
+  float4 xxyz = float3(U.v).xxyz;
+  float4 xxzx = float3(U.v).xxzx;
+  float4 xxzy = float3(U.v).xxzy;
+  float4 xxzz = float3(U.v).xxzz;
+  float4 xyxx = float3(U.v).xyxx;
+  float4 xyxy = float3(U.v).xyxy;
+  float4 xyxz = float3(U.v).xyxz;
+  float4 xyyx = float3(U.v).xyyx;
+  float4 xyyy = float3(U.v).xyyy;
+  float4 xyyz = float3(U.v).xyyz;
+  float4 xyzx = float3(U.v).xyzx;
+  float4 xyzy = float3(U.v).xyzy;
+  float4 xyzz = float3(U.v).xyzz;
+  float4 xzxx = float3(U.v).xzxx;
+  float4 xzxy = float3(U.v).xzxy;
+  float4 xzxz = float3(U.v).xzxz;
+  float4 xzyx = float3(U.v).xzyx;
+  float4 xzyy = float3(U.v).xzyy;
+  float4 xzyz = float3(U.v).xzyz;
+  float4 xzzx = float3(U.v).xzzx;
+  float4 xzzy = float3(U.v).xzzy;
+  float4 xzzz = float3(U.v).xzzz;
+  float4 yxxx = float3(U.v).yxxx;
+  float4 yxxy = float3(U.v).yxxy;
+  float4 yxxz = float3(U.v).yxxz;
+  float4 yxyx = float3(U.v).yxyx;
+  float4 yxyy = float3(U.v).yxyy;
+  float4 yxyz = float3(U.v).yxyz;
+  float4 yxzx = float3(U.v).yxzx;
+  float4 yxzy = float3(U.v).yxzy;
+  float4 yxzz = float3(U.v).yxzz;
+  float4 yyxx = float3(U.v).yyxx;
+  float4 yyxy = float3(U.v).yyxy;
+  float4 yyxz = float3(U.v).yyxz;
+  float4 yyyx = float3(U.v).yyyx;
+  float4 yyyy = float3(U.v).yyyy;
+  float4 yyyz = float3(U.v).yyyz;
+  float4 yyzx = float3(U.v).yyzx;
+  float4 yyzy = float3(U.v).yyzy;
+  float4 yyzz = float3(U.v).yyzz;
+  float4 yzxx = float3(U.v).yzxx;
+  float4 yzxy = float3(U.v).yzxy;
+  float4 yzxz = float3(U.v).yzxz;
+  float4 yzyx = float3(U.v).yzyx;
+  float4 yzyy = float3(U.v).yzyy;
+  float4 yzyz = float3(U.v).yzyz;
+  float4 yzzx = float3(U.v).yzzx;
+  float4 yzzy = float3(U.v).yzzy;
+  float4 yzzz = float3(U.v).yzzz;
+  float4 zxxx = float3(U.v).zxxx;
+  float4 zxxy = float3(U.v).zxxy;
+  float4 zxxz = float3(U.v).zxxz;
+  float4 zxyx = float3(U.v).zxyx;
+  float4 zxyy = float3(U.v).zxyy;
+  float4 zxyz = float3(U.v).zxyz;
+  float4 zxzx = float3(U.v).zxzx;
+  float4 zxzy = float3(U.v).zxzy;
+  float4 zxzz = float3(U.v).zxzz;
+  float4 zyxx = float3(U.v).zyxx;
+  float4 zyxy = float3(U.v).zyxy;
+  float4 zyxz = float3(U.v).zyxz;
+  float4 zyyx = float3(U.v).zyyx;
+  float4 zyyy = float3(U.v).zyyy;
+  float4 zyyz = float3(U.v).zyyz;
+  float4 zyzx = float3(U.v).zyzx;
+  float4 zyzy = float3(U.v).zyzy;
+  float4 zyzz = float3(U.v).zyzz;
+  float4 zzxx = float3(U.v).zzxx;
+  float4 zzxy = float3(U.v).zzxy;
+  float4 zzxz = float3(U.v).zzxz;
+  float4 zzyx = float3(U.v).zzyx;
+  float4 zzyy = float3(U.v).zzyy;
+  float4 zzyz = float3(U.v).zzyz;
+  float4 zzzx = float3(U.v).zzzx;
+  float4 zzzy = float3(U.v).zzzy;
+  float4 zzzz = float3(U.v).zzzz;
+}
+
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.spvasm b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..eaadf00
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,772 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 508
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %U "U"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpName %v "v"
+               OpName %x "x"
+               OpName %y "y"
+               OpName %z "z"
+               OpName %xx "xx"
+               OpName %xy "xy"
+               OpName %xz "xz"
+               OpName %yx "yx"
+               OpName %yy "yy"
+               OpName %yz "yz"
+               OpName %zx "zx"
+               OpName %zy "zy"
+               OpName %zz "zz"
+               OpName %xxx "xxx"
+               OpName %xxy "xxy"
+               OpName %xxz "xxz"
+               OpName %xyx "xyx"
+               OpName %xyy "xyy"
+               OpName %xyz "xyz"
+               OpName %xzx "xzx"
+               OpName %xzy "xzy"
+               OpName %xzz "xzz"
+               OpName %yxx "yxx"
+               OpName %yxy "yxy"
+               OpName %yxz "yxz"
+               OpName %yyx "yyx"
+               OpName %yyy "yyy"
+               OpName %yyz "yyz"
+               OpName %yzx "yzx"
+               OpName %yzy "yzy"
+               OpName %yzz "yzz"
+               OpName %zxx "zxx"
+               OpName %zxy "zxy"
+               OpName %zxz "zxz"
+               OpName %zyx "zyx"
+               OpName %zyy "zyy"
+               OpName %zyz "zyz"
+               OpName %zzx "zzx"
+               OpName %zzy "zzy"
+               OpName %zzz "zzz"
+               OpName %xxxx "xxxx"
+               OpName %xxxy "xxxy"
+               OpName %xxxz "xxxz"
+               OpName %xxyx "xxyx"
+               OpName %xxyy "xxyy"
+               OpName %xxyz "xxyz"
+               OpName %xxzx "xxzx"
+               OpName %xxzy "xxzy"
+               OpName %xxzz "xxzz"
+               OpName %xyxx "xyxx"
+               OpName %xyxy "xyxy"
+               OpName %xyxz "xyxz"
+               OpName %xyyx "xyyx"
+               OpName %xyyy "xyyy"
+               OpName %xyyz "xyyz"
+               OpName %xyzx "xyzx"
+               OpName %xyzy "xyzy"
+               OpName %xyzz "xyzz"
+               OpName %xzxx "xzxx"
+               OpName %xzxy "xzxy"
+               OpName %xzxz "xzxz"
+               OpName %xzyx "xzyx"
+               OpName %xzyy "xzyy"
+               OpName %xzyz "xzyz"
+               OpName %xzzx "xzzx"
+               OpName %xzzy "xzzy"
+               OpName %xzzz "xzzz"
+               OpName %yxxx "yxxx"
+               OpName %yxxy "yxxy"
+               OpName %yxxz "yxxz"
+               OpName %yxyx "yxyx"
+               OpName %yxyy "yxyy"
+               OpName %yxyz "yxyz"
+               OpName %yxzx "yxzx"
+               OpName %yxzy "yxzy"
+               OpName %yxzz "yxzz"
+               OpName %yyxx "yyxx"
+               OpName %yyxy "yyxy"
+               OpName %yyxz "yyxz"
+               OpName %yyyx "yyyx"
+               OpName %yyyy "yyyy"
+               OpName %yyyz "yyyz"
+               OpName %yyzx "yyzx"
+               OpName %yyzy "yyzy"
+               OpName %yyzz "yyzz"
+               OpName %yzxx "yzxx"
+               OpName %yzxy "yzxy"
+               OpName %yzxz "yzxz"
+               OpName %yzyx "yzyx"
+               OpName %yzyy "yzyy"
+               OpName %yzyz "yzyz"
+               OpName %yzzx "yzzx"
+               OpName %yzzy "yzzy"
+               OpName %yzzz "yzzz"
+               OpName %zxxx "zxxx"
+               OpName %zxxy "zxxy"
+               OpName %zxxz "zxxz"
+               OpName %zxyx "zxyx"
+               OpName %zxyy "zxyy"
+               OpName %zxyz "zxyz"
+               OpName %zxzx "zxzx"
+               OpName %zxzy "zxzy"
+               OpName %zxzz "zxzz"
+               OpName %zyxx "zyxx"
+               OpName %zyxy "zyxy"
+               OpName %zyxz "zyxz"
+               OpName %zyyx "zyyx"
+               OpName %zyyy "zyyy"
+               OpName %zyyz "zyyz"
+               OpName %zyzx "zyzx"
+               OpName %zyzy "zyzy"
+               OpName %zyzz "zyzz"
+               OpName %zzxx "zzxx"
+               OpName %zzxy "zzxy"
+               OpName %zzxz "zzxz"
+               OpName %zzyx "zzyx"
+               OpName %zzyy "zzyy"
+               OpName %zzyz "zzyz"
+               OpName %zzzx "zzzx"
+               OpName %zzzy "zzzy"
+               OpName %zzzz "zzzz"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %U NonWritable
+               OpDecorate %U DescriptorSet 0
+               OpDecorate %U Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %S = OpTypeStruct %v3float
+%_ptr_Uniform_S = OpTypePointer Uniform %S
+          %U = OpVariable %_ptr_Uniform_S Uniform
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %19 = OpConstantNull %v3float
+%_ptr_Uniform_float = OpTypePointer Uniform %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %25 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %40 = OpConstantNull %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %187 = OpConstantNull %v4float
+%unused_entry_point = OpFunction %void None %6
+          %9 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %6
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v3float Function %19
+          %x = OpVariable %_ptr_Function_float Function %25
+          %y = OpVariable %_ptr_Function_float Function %25
+          %z = OpVariable %_ptr_Function_float Function %25
+         %xx = OpVariable %_ptr_Function_v2float Function %40
+         %xy = OpVariable %_ptr_Function_v2float Function %40
+         %xz = OpVariable %_ptr_Function_v2float Function %40
+         %yx = OpVariable %_ptr_Function_v2float Function %40
+         %yy = OpVariable %_ptr_Function_v2float Function %40
+         %yz = OpVariable %_ptr_Function_v2float Function %40
+         %zx = OpVariable %_ptr_Function_v2float Function %40
+         %zy = OpVariable %_ptr_Function_v2float Function %40
+         %zz = OpVariable %_ptr_Function_v2float Function %40
+        %xxx = OpVariable %_ptr_Function_v3float Function %19
+        %xxy = OpVariable %_ptr_Function_v3float Function %19
+        %xxz = OpVariable %_ptr_Function_v3float Function %19
+        %xyx = OpVariable %_ptr_Function_v3float Function %19
+        %xyy = OpVariable %_ptr_Function_v3float Function %19
+        %xyz = OpVariable %_ptr_Function_v3float Function %19
+        %xzx = OpVariable %_ptr_Function_v3float Function %19
+        %xzy = OpVariable %_ptr_Function_v3float Function %19
+        %xzz = OpVariable %_ptr_Function_v3float Function %19
+        %yxx = OpVariable %_ptr_Function_v3float Function %19
+        %yxy = OpVariable %_ptr_Function_v3float Function %19
+        %yxz = OpVariable %_ptr_Function_v3float Function %19
+        %yyx = OpVariable %_ptr_Function_v3float Function %19
+        %yyy = OpVariable %_ptr_Function_v3float Function %19
+        %yyz = OpVariable %_ptr_Function_v3float Function %19
+        %yzx = OpVariable %_ptr_Function_v3float Function %19
+        %yzy = OpVariable %_ptr_Function_v3float Function %19
+        %yzz = OpVariable %_ptr_Function_v3float Function %19
+        %zxx = OpVariable %_ptr_Function_v3float Function %19
+        %zxy = OpVariable %_ptr_Function_v3float Function %19
+        %zxz = OpVariable %_ptr_Function_v3float Function %19
+        %zyx = OpVariable %_ptr_Function_v3float Function %19
+        %zyy = OpVariable %_ptr_Function_v3float Function %19
+        %zyz = OpVariable %_ptr_Function_v3float Function %19
+        %zzx = OpVariable %_ptr_Function_v3float Function %19
+        %zzy = OpVariable %_ptr_Function_v3float Function %19
+        %zzz = OpVariable %_ptr_Function_v3float Function %19
+       %xxxx = OpVariable %_ptr_Function_v4float Function %187
+       %xxxy = OpVariable %_ptr_Function_v4float Function %187
+       %xxxz = OpVariable %_ptr_Function_v4float Function %187
+       %xxyx = OpVariable %_ptr_Function_v4float Function %187
+       %xxyy = OpVariable %_ptr_Function_v4float Function %187
+       %xxyz = OpVariable %_ptr_Function_v4float Function %187
+       %xxzx = OpVariable %_ptr_Function_v4float Function %187
+       %xxzy = OpVariable %_ptr_Function_v4float Function %187
+       %xxzz = OpVariable %_ptr_Function_v4float Function %187
+       %xyxx = OpVariable %_ptr_Function_v4float Function %187
+       %xyxy = OpVariable %_ptr_Function_v4float Function %187
+       %xyxz = OpVariable %_ptr_Function_v4float Function %187
+       %xyyx = OpVariable %_ptr_Function_v4float Function %187
+       %xyyy = OpVariable %_ptr_Function_v4float Function %187
+       %xyyz = OpVariable %_ptr_Function_v4float Function %187
+       %xyzx = OpVariable %_ptr_Function_v4float Function %187
+       %xyzy = OpVariable %_ptr_Function_v4float Function %187
+       %xyzz = OpVariable %_ptr_Function_v4float Function %187
+       %xzxx = OpVariable %_ptr_Function_v4float Function %187
+       %xzxy = OpVariable %_ptr_Function_v4float Function %187
+       %xzxz = OpVariable %_ptr_Function_v4float Function %187
+       %xzyx = OpVariable %_ptr_Function_v4float Function %187
+       %xzyy = OpVariable %_ptr_Function_v4float Function %187
+       %xzyz = OpVariable %_ptr_Function_v4float Function %187
+       %xzzx = OpVariable %_ptr_Function_v4float Function %187
+       %xzzy = OpVariable %_ptr_Function_v4float Function %187
+       %xzzz = OpVariable %_ptr_Function_v4float Function %187
+       %yxxx = OpVariable %_ptr_Function_v4float Function %187
+       %yxxy = OpVariable %_ptr_Function_v4float Function %187
+       %yxxz = OpVariable %_ptr_Function_v4float Function %187
+       %yxyx = OpVariable %_ptr_Function_v4float Function %187
+       %yxyy = OpVariable %_ptr_Function_v4float Function %187
+       %yxyz = OpVariable %_ptr_Function_v4float Function %187
+       %yxzx = OpVariable %_ptr_Function_v4float Function %187
+       %yxzy = OpVariable %_ptr_Function_v4float Function %187
+       %yxzz = OpVariable %_ptr_Function_v4float Function %187
+       %yyxx = OpVariable %_ptr_Function_v4float Function %187
+       %yyxy = OpVariable %_ptr_Function_v4float Function %187
+       %yyxz = OpVariable %_ptr_Function_v4float Function %187
+       %yyyx = OpVariable %_ptr_Function_v4float Function %187
+       %yyyy = OpVariable %_ptr_Function_v4float Function %187
+       %yyyz = OpVariable %_ptr_Function_v4float Function %187
+       %yyzx = OpVariable %_ptr_Function_v4float Function %187
+       %yyzy = OpVariable %_ptr_Function_v4float Function %187
+       %yyzz = OpVariable %_ptr_Function_v4float Function %187
+       %yzxx = OpVariable %_ptr_Function_v4float Function %187
+       %yzxy = OpVariable %_ptr_Function_v4float Function %187
+       %yzxz = OpVariable %_ptr_Function_v4float Function %187
+       %yzyx = OpVariable %_ptr_Function_v4float Function %187
+       %yzyy = OpVariable %_ptr_Function_v4float Function %187
+       %yzyz = OpVariable %_ptr_Function_v4float Function %187
+       %yzzx = OpVariable %_ptr_Function_v4float Function %187
+       %yzzy = OpVariable %_ptr_Function_v4float Function %187
+       %yzzz = OpVariable %_ptr_Function_v4float Function %187
+       %zxxx = OpVariable %_ptr_Function_v4float Function %187
+       %zxxy = OpVariable %_ptr_Function_v4float Function %187
+       %zxxz = OpVariable %_ptr_Function_v4float Function %187
+       %zxyx = OpVariable %_ptr_Function_v4float Function %187
+       %zxyy = OpVariable %_ptr_Function_v4float Function %187
+       %zxyz = OpVariable %_ptr_Function_v4float Function %187
+       %zxzx = OpVariable %_ptr_Function_v4float Function %187
+       %zxzy = OpVariable %_ptr_Function_v4float Function %187
+       %zxzz = OpVariable %_ptr_Function_v4float Function %187
+       %zyxx = OpVariable %_ptr_Function_v4float Function %187
+       %zyxy = OpVariable %_ptr_Function_v4float Function %187
+       %zyxz = OpVariable %_ptr_Function_v4float Function %187
+       %zyyx = OpVariable %_ptr_Function_v4float Function %187
+       %zyyy = OpVariable %_ptr_Function_v4float Function %187
+       %zyyz = OpVariable %_ptr_Function_v4float Function %187
+       %zyzx = OpVariable %_ptr_Function_v4float Function %187
+       %zyzy = OpVariable %_ptr_Function_v4float Function %187
+       %zyzz = OpVariable %_ptr_Function_v4float Function %187
+       %zzxx = OpVariable %_ptr_Function_v4float Function %187
+       %zzxy = OpVariable %_ptr_Function_v4float Function %187
+       %zzxz = OpVariable %_ptr_Function_v4float Function %187
+       %zzyx = OpVariable %_ptr_Function_v4float Function %187
+       %zzyy = OpVariable %_ptr_Function_v4float Function %187
+       %zzyz = OpVariable %_ptr_Function_v4float Function %187
+       %zzzx = OpVariable %_ptr_Function_v4float Function %187
+       %zzzy = OpVariable %_ptr_Function_v4float Function %187
+       %zzzz = OpVariable %_ptr_Function_v4float Function %187
+         %15 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %16 = OpLoad %v3float %15
+               OpStore %v %16
+         %21 = OpAccessChain %_ptr_Uniform_float %U %uint_0 %uint_0
+         %22 = OpLoad %float %21
+               OpStore %x %22
+         %27 = OpAccessChain %_ptr_Uniform_float %U %uint_0 %uint_1
+         %28 = OpLoad %float %27
+               OpStore %y %28
+         %31 = OpAccessChain %_ptr_Uniform_float %U %uint_0 %uint_2
+         %32 = OpLoad %float %31
+               OpStore %z %32
+         %34 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %36 = OpLoad %v3float %34
+         %37 = OpVectorShuffle %v2float %36 %36 0 0
+               OpStore %xx %37
+         %41 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %42 = OpLoad %v3float %41
+         %43 = OpVectorShuffle %v2float %42 %42 0 1
+               OpStore %xy %43
+         %45 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %46 = OpLoad %v3float %45
+         %47 = OpVectorShuffle %v2float %46 %46 0 2
+               OpStore %xz %47
+         %49 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %50 = OpLoad %v3float %49
+         %51 = OpVectorShuffle %v2float %50 %50 1 0
+               OpStore %yx %51
+         %53 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %54 = OpLoad %v3float %53
+         %55 = OpVectorShuffle %v2float %54 %54 1 1
+               OpStore %yy %55
+         %57 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %58 = OpLoad %v3float %57
+         %59 = OpVectorShuffle %v2float %58 %58 1 2
+               OpStore %yz %59
+         %61 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %62 = OpLoad %v3float %61
+         %63 = OpVectorShuffle %v2float %62 %62 2 0
+               OpStore %zx %63
+         %65 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %66 = OpLoad %v3float %65
+         %67 = OpVectorShuffle %v2float %66 %66 2 1
+               OpStore %zy %67
+         %69 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %70 = OpLoad %v3float %69
+         %71 = OpVectorShuffle %v2float %70 %70 2 2
+               OpStore %zz %71
+         %73 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %74 = OpLoad %v3float %73
+         %75 = OpVectorShuffle %v3float %74 %74 0 0 0
+               OpStore %xxx %75
+         %77 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %78 = OpLoad %v3float %77
+         %79 = OpVectorShuffle %v3float %78 %78 0 0 1
+               OpStore %xxy %79
+         %81 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %82 = OpLoad %v3float %81
+         %83 = OpVectorShuffle %v3float %82 %82 0 0 2
+               OpStore %xxz %83
+         %85 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %86 = OpLoad %v3float %85
+         %87 = OpVectorShuffle %v3float %86 %86 0 1 0
+               OpStore %xyx %87
+         %89 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %90 = OpLoad %v3float %89
+         %91 = OpVectorShuffle %v3float %90 %90 0 1 1
+               OpStore %xyy %91
+         %93 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %94 = OpLoad %v3float %93
+         %95 = OpVectorShuffle %v3float %94 %94 0 1 2
+               OpStore %xyz %95
+         %97 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+         %98 = OpLoad %v3float %97
+         %99 = OpVectorShuffle %v3float %98 %98 0 2 0
+               OpStore %xzx %99
+        %101 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %102 = OpLoad %v3float %101
+        %103 = OpVectorShuffle %v3float %102 %102 0 2 1
+               OpStore %xzy %103
+        %105 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %106 = OpLoad %v3float %105
+        %107 = OpVectorShuffle %v3float %106 %106 0 2 2
+               OpStore %xzz %107
+        %109 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %110 = OpLoad %v3float %109
+        %111 = OpVectorShuffle %v3float %110 %110 1 0 0
+               OpStore %yxx %111
+        %113 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %114 = OpLoad %v3float %113
+        %115 = OpVectorShuffle %v3float %114 %114 1 0 1
+               OpStore %yxy %115
+        %117 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %118 = OpLoad %v3float %117
+        %119 = OpVectorShuffle %v3float %118 %118 1 0 2
+               OpStore %yxz %119
+        %121 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %122 = OpLoad %v3float %121
+        %123 = OpVectorShuffle %v3float %122 %122 1 1 0
+               OpStore %yyx %123
+        %125 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %126 = OpLoad %v3float %125
+        %127 = OpVectorShuffle %v3float %126 %126 1 1 1
+               OpStore %yyy %127
+        %129 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %130 = OpLoad %v3float %129
+        %131 = OpVectorShuffle %v3float %130 %130 1 1 2
+               OpStore %yyz %131
+        %133 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %134 = OpLoad %v3float %133
+        %135 = OpVectorShuffle %v3float %134 %134 1 2 0
+               OpStore %yzx %135
+        %137 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %138 = OpLoad %v3float %137
+        %139 = OpVectorShuffle %v3float %138 %138 1 2 1
+               OpStore %yzy %139
+        %141 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %142 = OpLoad %v3float %141
+        %143 = OpVectorShuffle %v3float %142 %142 1 2 2
+               OpStore %yzz %143
+        %145 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %146 = OpLoad %v3float %145
+        %147 = OpVectorShuffle %v3float %146 %146 2 0 0
+               OpStore %zxx %147
+        %149 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %150 = OpLoad %v3float %149
+        %151 = OpVectorShuffle %v3float %150 %150 2 0 1
+               OpStore %zxy %151
+        %153 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %154 = OpLoad %v3float %153
+        %155 = OpVectorShuffle %v3float %154 %154 2 0 2
+               OpStore %zxz %155
+        %157 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %158 = OpLoad %v3float %157
+        %159 = OpVectorShuffle %v3float %158 %158 2 1 0
+               OpStore %zyx %159
+        %161 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %162 = OpLoad %v3float %161
+        %163 = OpVectorShuffle %v3float %162 %162 2 1 1
+               OpStore %zyy %163
+        %165 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %166 = OpLoad %v3float %165
+        %167 = OpVectorShuffle %v3float %166 %166 2 1 2
+               OpStore %zyz %167
+        %169 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %170 = OpLoad %v3float %169
+        %171 = OpVectorShuffle %v3float %170 %170 2 2 0
+               OpStore %zzx %171
+        %173 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %174 = OpLoad %v3float %173
+        %175 = OpVectorShuffle %v3float %174 %174 2 2 1
+               OpStore %zzy %175
+        %177 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %178 = OpLoad %v3float %177
+        %179 = OpVectorShuffle %v3float %178 %178 2 2 2
+               OpStore %zzz %179
+        %181 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %183 = OpLoad %v3float %181
+        %184 = OpVectorShuffle %v4float %183 %183 0 0 0 0
+               OpStore %xxxx %184
+        %188 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %189 = OpLoad %v3float %188
+        %190 = OpVectorShuffle %v4float %189 %189 0 0 0 1
+               OpStore %xxxy %190
+        %192 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %193 = OpLoad %v3float %192
+        %194 = OpVectorShuffle %v4float %193 %193 0 0 0 2
+               OpStore %xxxz %194
+        %196 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %197 = OpLoad %v3float %196
+        %198 = OpVectorShuffle %v4float %197 %197 0 0 1 0
+               OpStore %xxyx %198
+        %200 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %201 = OpLoad %v3float %200
+        %202 = OpVectorShuffle %v4float %201 %201 0 0 1 1
+               OpStore %xxyy %202
+        %204 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %205 = OpLoad %v3float %204
+        %206 = OpVectorShuffle %v4float %205 %205 0 0 1 2
+               OpStore %xxyz %206
+        %208 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %209 = OpLoad %v3float %208
+        %210 = OpVectorShuffle %v4float %209 %209 0 0 2 0
+               OpStore %xxzx %210
+        %212 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %213 = OpLoad %v3float %212
+        %214 = OpVectorShuffle %v4float %213 %213 0 0 2 1
+               OpStore %xxzy %214
+        %216 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %217 = OpLoad %v3float %216
+        %218 = OpVectorShuffle %v4float %217 %217 0 0 2 2
+               OpStore %xxzz %218
+        %220 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %221 = OpLoad %v3float %220
+        %222 = OpVectorShuffle %v4float %221 %221 0 1 0 0
+               OpStore %xyxx %222
+        %224 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %225 = OpLoad %v3float %224
+        %226 = OpVectorShuffle %v4float %225 %225 0 1 0 1
+               OpStore %xyxy %226
+        %228 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %229 = OpLoad %v3float %228
+        %230 = OpVectorShuffle %v4float %229 %229 0 1 0 2
+               OpStore %xyxz %230
+        %232 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %233 = OpLoad %v3float %232
+        %234 = OpVectorShuffle %v4float %233 %233 0 1 1 0
+               OpStore %xyyx %234
+        %236 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %237 = OpLoad %v3float %236
+        %238 = OpVectorShuffle %v4float %237 %237 0 1 1 1
+               OpStore %xyyy %238
+        %240 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %241 = OpLoad %v3float %240
+        %242 = OpVectorShuffle %v4float %241 %241 0 1 1 2
+               OpStore %xyyz %242
+        %244 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %245 = OpLoad %v3float %244
+        %246 = OpVectorShuffle %v4float %245 %245 0 1 2 0
+               OpStore %xyzx %246
+        %248 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %249 = OpLoad %v3float %248
+        %250 = OpVectorShuffle %v4float %249 %249 0 1 2 1
+               OpStore %xyzy %250
+        %252 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %253 = OpLoad %v3float %252
+        %254 = OpVectorShuffle %v4float %253 %253 0 1 2 2
+               OpStore %xyzz %254
+        %256 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %257 = OpLoad %v3float %256
+        %258 = OpVectorShuffle %v4float %257 %257 0 2 0 0
+               OpStore %xzxx %258
+        %260 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %261 = OpLoad %v3float %260
+        %262 = OpVectorShuffle %v4float %261 %261 0 2 0 1
+               OpStore %xzxy %262
+        %264 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %265 = OpLoad %v3float %264
+        %266 = OpVectorShuffle %v4float %265 %265 0 2 0 2
+               OpStore %xzxz %266
+        %268 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %269 = OpLoad %v3float %268
+        %270 = OpVectorShuffle %v4float %269 %269 0 2 1 0
+               OpStore %xzyx %270
+        %272 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %273 = OpLoad %v3float %272
+        %274 = OpVectorShuffle %v4float %273 %273 0 2 1 1
+               OpStore %xzyy %274
+        %276 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %277 = OpLoad %v3float %276
+        %278 = OpVectorShuffle %v4float %277 %277 0 2 1 2
+               OpStore %xzyz %278
+        %280 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %281 = OpLoad %v3float %280
+        %282 = OpVectorShuffle %v4float %281 %281 0 2 2 0
+               OpStore %xzzx %282
+        %284 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %285 = OpLoad %v3float %284
+        %286 = OpVectorShuffle %v4float %285 %285 0 2 2 1
+               OpStore %xzzy %286
+        %288 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %289 = OpLoad %v3float %288
+        %290 = OpVectorShuffle %v4float %289 %289 0 2 2 2
+               OpStore %xzzz %290
+        %292 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %293 = OpLoad %v3float %292
+        %294 = OpVectorShuffle %v4float %293 %293 1 0 0 0
+               OpStore %yxxx %294
+        %296 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %297 = OpLoad %v3float %296
+        %298 = OpVectorShuffle %v4float %297 %297 1 0 0 1
+               OpStore %yxxy %298
+        %300 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %301 = OpLoad %v3float %300
+        %302 = OpVectorShuffle %v4float %301 %301 1 0 0 2
+               OpStore %yxxz %302
+        %304 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %305 = OpLoad %v3float %304
+        %306 = OpVectorShuffle %v4float %305 %305 1 0 1 0
+               OpStore %yxyx %306
+        %308 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %309 = OpLoad %v3float %308
+        %310 = OpVectorShuffle %v4float %309 %309 1 0 1 1
+               OpStore %yxyy %310
+        %312 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %313 = OpLoad %v3float %312
+        %314 = OpVectorShuffle %v4float %313 %313 1 0 1 2
+               OpStore %yxyz %314
+        %316 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %317 = OpLoad %v3float %316
+        %318 = OpVectorShuffle %v4float %317 %317 1 0 2 0
+               OpStore %yxzx %318
+        %320 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %321 = OpLoad %v3float %320
+        %322 = OpVectorShuffle %v4float %321 %321 1 0 2 1
+               OpStore %yxzy %322
+        %324 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %325 = OpLoad %v3float %324
+        %326 = OpVectorShuffle %v4float %325 %325 1 0 2 2
+               OpStore %yxzz %326
+        %328 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %329 = OpLoad %v3float %328
+        %330 = OpVectorShuffle %v4float %329 %329 1 1 0 0
+               OpStore %yyxx %330
+        %332 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %333 = OpLoad %v3float %332
+        %334 = OpVectorShuffle %v4float %333 %333 1 1 0 1
+               OpStore %yyxy %334
+        %336 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %337 = OpLoad %v3float %336
+        %338 = OpVectorShuffle %v4float %337 %337 1 1 0 2
+               OpStore %yyxz %338
+        %340 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %341 = OpLoad %v3float %340
+        %342 = OpVectorShuffle %v4float %341 %341 1 1 1 0
+               OpStore %yyyx %342
+        %344 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %345 = OpLoad %v3float %344
+        %346 = OpVectorShuffle %v4float %345 %345 1 1 1 1
+               OpStore %yyyy %346
+        %348 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %349 = OpLoad %v3float %348
+        %350 = OpVectorShuffle %v4float %349 %349 1 1 1 2
+               OpStore %yyyz %350
+        %352 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %353 = OpLoad %v3float %352
+        %354 = OpVectorShuffle %v4float %353 %353 1 1 2 0
+               OpStore %yyzx %354
+        %356 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %357 = OpLoad %v3float %356
+        %358 = OpVectorShuffle %v4float %357 %357 1 1 2 1
+               OpStore %yyzy %358
+        %360 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %361 = OpLoad %v3float %360
+        %362 = OpVectorShuffle %v4float %361 %361 1 1 2 2
+               OpStore %yyzz %362
+        %364 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %365 = OpLoad %v3float %364
+        %366 = OpVectorShuffle %v4float %365 %365 1 2 0 0
+               OpStore %yzxx %366
+        %368 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %369 = OpLoad %v3float %368
+        %370 = OpVectorShuffle %v4float %369 %369 1 2 0 1
+               OpStore %yzxy %370
+        %372 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %373 = OpLoad %v3float %372
+        %374 = OpVectorShuffle %v4float %373 %373 1 2 0 2
+               OpStore %yzxz %374
+        %376 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %377 = OpLoad %v3float %376
+        %378 = OpVectorShuffle %v4float %377 %377 1 2 1 0
+               OpStore %yzyx %378
+        %380 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %381 = OpLoad %v3float %380
+        %382 = OpVectorShuffle %v4float %381 %381 1 2 1 1
+               OpStore %yzyy %382
+        %384 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %385 = OpLoad %v3float %384
+        %386 = OpVectorShuffle %v4float %385 %385 1 2 1 2
+               OpStore %yzyz %386
+        %388 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %389 = OpLoad %v3float %388
+        %390 = OpVectorShuffle %v4float %389 %389 1 2 2 0
+               OpStore %yzzx %390
+        %392 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %393 = OpLoad %v3float %392
+        %394 = OpVectorShuffle %v4float %393 %393 1 2 2 1
+               OpStore %yzzy %394
+        %396 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %397 = OpLoad %v3float %396
+        %398 = OpVectorShuffle %v4float %397 %397 1 2 2 2
+               OpStore %yzzz %398
+        %400 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %401 = OpLoad %v3float %400
+        %402 = OpVectorShuffle %v4float %401 %401 2 0 0 0
+               OpStore %zxxx %402
+        %404 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %405 = OpLoad %v3float %404
+        %406 = OpVectorShuffle %v4float %405 %405 2 0 0 1
+               OpStore %zxxy %406
+        %408 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %409 = OpLoad %v3float %408
+        %410 = OpVectorShuffle %v4float %409 %409 2 0 0 2
+               OpStore %zxxz %410
+        %412 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %413 = OpLoad %v3float %412
+        %414 = OpVectorShuffle %v4float %413 %413 2 0 1 0
+               OpStore %zxyx %414
+        %416 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %417 = OpLoad %v3float %416
+        %418 = OpVectorShuffle %v4float %417 %417 2 0 1 1
+               OpStore %zxyy %418
+        %420 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %421 = OpLoad %v3float %420
+        %422 = OpVectorShuffle %v4float %421 %421 2 0 1 2
+               OpStore %zxyz %422
+        %424 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %425 = OpLoad %v3float %424
+        %426 = OpVectorShuffle %v4float %425 %425 2 0 2 0
+               OpStore %zxzx %426
+        %428 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %429 = OpLoad %v3float %428
+        %430 = OpVectorShuffle %v4float %429 %429 2 0 2 1
+               OpStore %zxzy %430
+        %432 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %433 = OpLoad %v3float %432
+        %434 = OpVectorShuffle %v4float %433 %433 2 0 2 2
+               OpStore %zxzz %434
+        %436 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %437 = OpLoad %v3float %436
+        %438 = OpVectorShuffle %v4float %437 %437 2 1 0 0
+               OpStore %zyxx %438
+        %440 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %441 = OpLoad %v3float %440
+        %442 = OpVectorShuffle %v4float %441 %441 2 1 0 1
+               OpStore %zyxy %442
+        %444 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %445 = OpLoad %v3float %444
+        %446 = OpVectorShuffle %v4float %445 %445 2 1 0 2
+               OpStore %zyxz %446
+        %448 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %449 = OpLoad %v3float %448
+        %450 = OpVectorShuffle %v4float %449 %449 2 1 1 0
+               OpStore %zyyx %450
+        %452 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %453 = OpLoad %v3float %452
+        %454 = OpVectorShuffle %v4float %453 %453 2 1 1 1
+               OpStore %zyyy %454
+        %456 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %457 = OpLoad %v3float %456
+        %458 = OpVectorShuffle %v4float %457 %457 2 1 1 2
+               OpStore %zyyz %458
+        %460 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %461 = OpLoad %v3float %460
+        %462 = OpVectorShuffle %v4float %461 %461 2 1 2 0
+               OpStore %zyzx %462
+        %464 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %465 = OpLoad %v3float %464
+        %466 = OpVectorShuffle %v4float %465 %465 2 1 2 1
+               OpStore %zyzy %466
+        %468 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %469 = OpLoad %v3float %468
+        %470 = OpVectorShuffle %v4float %469 %469 2 1 2 2
+               OpStore %zyzz %470
+        %472 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %473 = OpLoad %v3float %472
+        %474 = OpVectorShuffle %v4float %473 %473 2 2 0 0
+               OpStore %zzxx %474
+        %476 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %477 = OpLoad %v3float %476
+        %478 = OpVectorShuffle %v4float %477 %477 2 2 0 1
+               OpStore %zzxy %478
+        %480 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %481 = OpLoad %v3float %480
+        %482 = OpVectorShuffle %v4float %481 %481 2 2 0 2
+               OpStore %zzxz %482
+        %484 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %485 = OpLoad %v3float %484
+        %486 = OpVectorShuffle %v4float %485 %485 2 2 1 0
+               OpStore %zzyx %486
+        %488 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %489 = OpLoad %v3float %488
+        %490 = OpVectorShuffle %v4float %489 %489 2 2 1 1
+               OpStore %zzyy %490
+        %492 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %493 = OpLoad %v3float %492
+        %494 = OpVectorShuffle %v4float %493 %493 2 2 1 2
+               OpStore %zzyz %494
+        %496 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %497 = OpLoad %v3float %496
+        %498 = OpVectorShuffle %v4float %497 %497 2 2 2 0
+               OpStore %zzzx %498
+        %500 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %501 = OpLoad %v3float %500
+        %502 = OpVectorShuffle %v4float %501 %501 2 2 2 1
+               OpStore %zzzy %502
+        %504 = OpAccessChain %_ptr_Uniform_v3float %U %uint_0
+        %505 = OpLoad %v3float %504
+        %506 = OpVectorShuffle %v4float %505 %505 2 2 2 2
+               OpStore %zzzz %506
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..1e01c44
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,130 @@
+[[block]]
+struct S {
+  v : vec3<f32>;
+};
+
+[[group(0), binding(0)]] var<uniform> U : S;
+
+fn f() {
+  var v = U.v;
+  var x = U.v.x;
+  var y = U.v.y;
+  var z = U.v.z;
+  var xx = U.v.xx;
+  var xy = U.v.xy;
+  var xz = U.v.xz;
+  var yx = U.v.yx;
+  var yy = U.v.yy;
+  var yz = U.v.yz;
+  var zx = U.v.zx;
+  var zy = U.v.zy;
+  var zz = U.v.zz;
+  var xxx = U.v.xxx;
+  var xxy = U.v.xxy;
+  var xxz = U.v.xxz;
+  var xyx = U.v.xyx;
+  var xyy = U.v.xyy;
+  var xyz = U.v.xyz;
+  var xzx = U.v.xzx;
+  var xzy = U.v.xzy;
+  var xzz = U.v.xzz;
+  var yxx = U.v.yxx;
+  var yxy = U.v.yxy;
+  var yxz = U.v.yxz;
+  var yyx = U.v.yyx;
+  var yyy = U.v.yyy;
+  var yyz = U.v.yyz;
+  var yzx = U.v.yzx;
+  var yzy = U.v.yzy;
+  var yzz = U.v.yzz;
+  var zxx = U.v.zxx;
+  var zxy = U.v.zxy;
+  var zxz = U.v.zxz;
+  var zyx = U.v.zyx;
+  var zyy = U.v.zyy;
+  var zyz = U.v.zyz;
+  var zzx = U.v.zzx;
+  var zzy = U.v.zzy;
+  var zzz = U.v.zzz;
+  var xxxx = U.v.xxxx;
+  var xxxy = U.v.xxxy;
+  var xxxz = U.v.xxxz;
+  var xxyx = U.v.xxyx;
+  var xxyy = U.v.xxyy;
+  var xxyz = U.v.xxyz;
+  var xxzx = U.v.xxzx;
+  var xxzy = U.v.xxzy;
+  var xxzz = U.v.xxzz;
+  var xyxx = U.v.xyxx;
+  var xyxy = U.v.xyxy;
+  var xyxz = U.v.xyxz;
+  var xyyx = U.v.xyyx;
+  var xyyy = U.v.xyyy;
+  var xyyz = U.v.xyyz;
+  var xyzx = U.v.xyzx;
+  var xyzy = U.v.xyzy;
+  var xyzz = U.v.xyzz;
+  var xzxx = U.v.xzxx;
+  var xzxy = U.v.xzxy;
+  var xzxz = U.v.xzxz;
+  var xzyx = U.v.xzyx;
+  var xzyy = U.v.xzyy;
+  var xzyz = U.v.xzyz;
+  var xzzx = U.v.xzzx;
+  var xzzy = U.v.xzzy;
+  var xzzz = U.v.xzzz;
+  var yxxx = U.v.yxxx;
+  var yxxy = U.v.yxxy;
+  var yxxz = U.v.yxxz;
+  var yxyx = U.v.yxyx;
+  var yxyy = U.v.yxyy;
+  var yxyz = U.v.yxyz;
+  var yxzx = U.v.yxzx;
+  var yxzy = U.v.yxzy;
+  var yxzz = U.v.yxzz;
+  var yyxx = U.v.yyxx;
+  var yyxy = U.v.yyxy;
+  var yyxz = U.v.yyxz;
+  var yyyx = U.v.yyyx;
+  var yyyy = U.v.yyyy;
+  var yyyz = U.v.yyyz;
+  var yyzx = U.v.yyzx;
+  var yyzy = U.v.yyzy;
+  var yyzz = U.v.yyzz;
+  var yzxx = U.v.yzxx;
+  var yzxy = U.v.yzxy;
+  var yzxz = U.v.yzxz;
+  var yzyx = U.v.yzyx;
+  var yzyy = U.v.yzyy;
+  var yzyz = U.v.yzyz;
+  var yzzx = U.v.yzzx;
+  var yzzy = U.v.yzzy;
+  var yzzz = U.v.yzzz;
+  var zxxx = U.v.zxxx;
+  var zxxy = U.v.zxxy;
+  var zxxz = U.v.zxxz;
+  var zxyx = U.v.zxyx;
+  var zxyy = U.v.zxyy;
+  var zxyz = U.v.zxyz;
+  var zxzx = U.v.zxzx;
+  var zxzy = U.v.zxzy;
+  var zxzz = U.v.zxzz;
+  var zyxx = U.v.zyxx;
+  var zyxy = U.v.zyxy;
+  var zyxz = U.v.zyxz;
+  var zyyx = U.v.zyyx;
+  var zyyy = U.v.zyyy;
+  var zyyz = U.v.zyyz;
+  var zyzx = U.v.zyzx;
+  var zyzy = U.v.zyzy;
+  var zyzz = U.v.zyzz;
+  var zzxx = U.v.zzxx;
+  var zzxy = U.v.zzxy;
+  var zzxz = U.v.zzxz;
+  var zzyx = U.v.zzyx;
+  var zzyy = U.v.zzyy;
+  var zzyz = U.v.zzyz;
+  var zzzx = U.v.zzzx;
+  var zzzy = U.v.zzzy;
+  var zzzz = U.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl b/test/expressions/swizzle/read/packed_vec3/i32.wgsl
new file mode 100644
index 0000000..114397b
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl
@@ -0,0 +1,144 @@
+[[block]]
+struct S {
+    v: vec3<i32>;
+};
+
+[[group(0), binding(0)]] var<uniform> U : S;
+
+fn f() {
+    var    v = U.v;
+
+    var    x = U.v.x;
+    var    y = U.v.y;
+    var    z = U.v.z;
+
+    var   xx = U.v.xx;
+    var   xy = U.v.xy;
+    var   xz = U.v.xz;
+    var   yx = U.v.yx;
+    var   yy = U.v.yy;
+    var   yz = U.v.yz;
+    var   zx = U.v.zx;
+    var   zy = U.v.zy;
+    var   zz = U.v.zz;
+
+    var  xxx = U.v.xxx;
+    var  xxy = U.v.xxy;
+    var  xxz = U.v.xxz;
+    var  xyx = U.v.xyx;
+    var  xyy = U.v.xyy;
+    var  xyz = U.v.xyz;
+    var  xzx = U.v.xzx;
+    var  xzy = U.v.xzy;
+    var  xzz = U.v.xzz;
+
+    var  yxx = U.v.yxx;
+    var  yxy = U.v.yxy;
+    var  yxz = U.v.yxz;
+    var  yyx = U.v.yyx;
+    var  yyy = U.v.yyy;
+    var  yyz = U.v.yyz;
+    var  yzx = U.v.yzx;
+    var  yzy = U.v.yzy;
+    var  yzz = U.v.yzz;
+
+    var  zxx = U.v.zxx;
+    var  zxy = U.v.zxy;
+    var  zxz = U.v.zxz;
+    var  zyx = U.v.zyx;
+    var  zyy = U.v.zyy;
+    var  zyz = U.v.zyz;
+    var  zzx = U.v.zzx;
+    var  zzy = U.v.zzy;
+    var  zzz = U.v.zzz;
+
+    var xxxx = U.v.xxxx;
+    var xxxy = U.v.xxxy;
+    var xxxz = U.v.xxxz;
+    var xxyx = U.v.xxyx;
+    var xxyy = U.v.xxyy;
+    var xxyz = U.v.xxyz;
+    var xxzx = U.v.xxzx;
+    var xxzy = U.v.xxzy;
+    var xxzz = U.v.xxzz;
+
+    var xyxx = U.v.xyxx;
+    var xyxy = U.v.xyxy;
+    var xyxz = U.v.xyxz;
+    var xyyx = U.v.xyyx;
+    var xyyy = U.v.xyyy;
+    var xyyz = U.v.xyyz;
+    var xyzx = U.v.xyzx;
+    var xyzy = U.v.xyzy;
+    var xyzz = U.v.xyzz;
+
+    var xzxx = U.v.xzxx;
+    var xzxy = U.v.xzxy;
+    var xzxz = U.v.xzxz;
+    var xzyx = U.v.xzyx;
+    var xzyy = U.v.xzyy;
+    var xzyz = U.v.xzyz;
+    var xzzx = U.v.xzzx;
+    var xzzy = U.v.xzzy;
+    var xzzz = U.v.xzzz;
+
+    var yxxx = U.v.yxxx;
+    var yxxy = U.v.yxxy;
+    var yxxz = U.v.yxxz;
+    var yxyx = U.v.yxyx;
+    var yxyy = U.v.yxyy;
+    var yxyz = U.v.yxyz;
+    var yxzx = U.v.yxzx;
+    var yxzy = U.v.yxzy;
+    var yxzz = U.v.yxzz;
+
+    var yyxx = U.v.yyxx;
+    var yyxy = U.v.yyxy;
+    var yyxz = U.v.yyxz;
+    var yyyx = U.v.yyyx;
+    var yyyy = U.v.yyyy;
+    var yyyz = U.v.yyyz;
+    var yyzx = U.v.yyzx;
+    var yyzy = U.v.yyzy;
+    var yyzz = U.v.yyzz;
+
+    var yzxx = U.v.yzxx;
+    var yzxy = U.v.yzxy;
+    var yzxz = U.v.yzxz;
+    var yzyx = U.v.yzyx;
+    var yzyy = U.v.yzyy;
+    var yzyz = U.v.yzyz;
+    var yzzx = U.v.yzzx;
+    var yzzy = U.v.yzzy;
+    var yzzz = U.v.yzzz;
+
+    var zxxx = U.v.zxxx;
+    var zxxy = U.v.zxxy;
+    var zxxz = U.v.zxxz;
+    var zxyx = U.v.zxyx;
+    var zxyy = U.v.zxyy;
+    var zxyz = U.v.zxyz;
+    var zxzx = U.v.zxzx;
+    var zxzy = U.v.zxzy;
+    var zxzz = U.v.zxzz;
+
+    var zyxx = U.v.zyxx;
+    var zyxy = U.v.zyxy;
+    var zyxz = U.v.zyxz;
+    var zyyx = U.v.zyyx;
+    var zyyy = U.v.zyyy;
+    var zyyz = U.v.zyyz;
+    var zyzx = U.v.zyzx;
+    var zyzy = U.v.zyzy;
+    var zyzz = U.v.zyzz;
+
+    var zzxx = U.v.zzxx;
+    var zzxy = U.v.zzxy;
+    var zzxz = U.v.zzxz;
+    var zzyx = U.v.zzyx;
+    var zzyy = U.v.zzyy;
+    var zzyz = U.v.zzyz;
+    var zzzx = U.v.zzzx;
+    var zzzy = U.v.zzzy;
+    var zzzz = U.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.hlsl b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..13b2315
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,132 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+cbuffer cbuffer_U : register(b0, space0) {
+  uint4 U[1];
+};
+
+void f() {
+  int3 v = asint(U[0].xyz);
+  int x = asint(U[0].x);
+  int y = asint(U[0].y);
+  int z = asint(U[0].z);
+  int2 xx = asint(U[0].xyz).xx;
+  int2 xy = asint(U[0].xyz).xy;
+  int2 xz = asint(U[0].xyz).xz;
+  int2 yx = asint(U[0].xyz).yx;
+  int2 yy = asint(U[0].xyz).yy;
+  int2 yz = asint(U[0].xyz).yz;
+  int2 zx = asint(U[0].xyz).zx;
+  int2 zy = asint(U[0].xyz).zy;
+  int2 zz = asint(U[0].xyz).zz;
+  int3 xxx = asint(U[0].xyz).xxx;
+  int3 xxy = asint(U[0].xyz).xxy;
+  int3 xxz = asint(U[0].xyz).xxz;
+  int3 xyx = asint(U[0].xyz).xyx;
+  int3 xyy = asint(U[0].xyz).xyy;
+  int3 xyz = asint(U[0].xyz).xyz;
+  int3 xzx = asint(U[0].xyz).xzx;
+  int3 xzy = asint(U[0].xyz).xzy;
+  int3 xzz = asint(U[0].xyz).xzz;
+  int3 yxx = asint(U[0].xyz).yxx;
+  int3 yxy = asint(U[0].xyz).yxy;
+  int3 yxz = asint(U[0].xyz).yxz;
+  int3 yyx = asint(U[0].xyz).yyx;
+  int3 yyy = asint(U[0].xyz).yyy;
+  int3 yyz = asint(U[0].xyz).yyz;
+  int3 yzx = asint(U[0].xyz).yzx;
+  int3 yzy = asint(U[0].xyz).yzy;
+  int3 yzz = asint(U[0].xyz).yzz;
+  int3 zxx = asint(U[0].xyz).zxx;
+  int3 zxy = asint(U[0].xyz).zxy;
+  int3 zxz = asint(U[0].xyz).zxz;
+  int3 zyx = asint(U[0].xyz).zyx;
+  int3 zyy = asint(U[0].xyz).zyy;
+  int3 zyz = asint(U[0].xyz).zyz;
+  int3 zzx = asint(U[0].xyz).zzx;
+  int3 zzy = asint(U[0].xyz).zzy;
+  int3 zzz = asint(U[0].xyz).zzz;
+  int4 xxxx = asint(U[0].xyz).xxxx;
+  int4 xxxy = asint(U[0].xyz).xxxy;
+  int4 xxxz = asint(U[0].xyz).xxxz;
+  int4 xxyx = asint(U[0].xyz).xxyx;
+  int4 xxyy = asint(U[0].xyz).xxyy;
+  int4 xxyz = asint(U[0].xyz).xxyz;
+  int4 xxzx = asint(U[0].xyz).xxzx;
+  int4 xxzy = asint(U[0].xyz).xxzy;
+  int4 xxzz = asint(U[0].xyz).xxzz;
+  int4 xyxx = asint(U[0].xyz).xyxx;
+  int4 xyxy = asint(U[0].xyz).xyxy;
+  int4 xyxz = asint(U[0].xyz).xyxz;
+  int4 xyyx = asint(U[0].xyz).xyyx;
+  int4 xyyy = asint(U[0].xyz).xyyy;
+  int4 xyyz = asint(U[0].xyz).xyyz;
+  int4 xyzx = asint(U[0].xyz).xyzx;
+  int4 xyzy = asint(U[0].xyz).xyzy;
+  int4 xyzz = asint(U[0].xyz).xyzz;
+  int4 xzxx = asint(U[0].xyz).xzxx;
+  int4 xzxy = asint(U[0].xyz).xzxy;
+  int4 xzxz = asint(U[0].xyz).xzxz;
+  int4 xzyx = asint(U[0].xyz).xzyx;
+  int4 xzyy = asint(U[0].xyz).xzyy;
+  int4 xzyz = asint(U[0].xyz).xzyz;
+  int4 xzzx = asint(U[0].xyz).xzzx;
+  int4 xzzy = asint(U[0].xyz).xzzy;
+  int4 xzzz = asint(U[0].xyz).xzzz;
+  int4 yxxx = asint(U[0].xyz).yxxx;
+  int4 yxxy = asint(U[0].xyz).yxxy;
+  int4 yxxz = asint(U[0].xyz).yxxz;
+  int4 yxyx = asint(U[0].xyz).yxyx;
+  int4 yxyy = asint(U[0].xyz).yxyy;
+  int4 yxyz = asint(U[0].xyz).yxyz;
+  int4 yxzx = asint(U[0].xyz).yxzx;
+  int4 yxzy = asint(U[0].xyz).yxzy;
+  int4 yxzz = asint(U[0].xyz).yxzz;
+  int4 yyxx = asint(U[0].xyz).yyxx;
+  int4 yyxy = asint(U[0].xyz).yyxy;
+  int4 yyxz = asint(U[0].xyz).yyxz;
+  int4 yyyx = asint(U[0].xyz).yyyx;
+  int4 yyyy = asint(U[0].xyz).yyyy;
+  int4 yyyz = asint(U[0].xyz).yyyz;
+  int4 yyzx = asint(U[0].xyz).yyzx;
+  int4 yyzy = asint(U[0].xyz).yyzy;
+  int4 yyzz = asint(U[0].xyz).yyzz;
+  int4 yzxx = asint(U[0].xyz).yzxx;
+  int4 yzxy = asint(U[0].xyz).yzxy;
+  int4 yzxz = asint(U[0].xyz).yzxz;
+  int4 yzyx = asint(U[0].xyz).yzyx;
+  int4 yzyy = asint(U[0].xyz).yzyy;
+  int4 yzyz = asint(U[0].xyz).yzyz;
+  int4 yzzx = asint(U[0].xyz).yzzx;
+  int4 yzzy = asint(U[0].xyz).yzzy;
+  int4 yzzz = asint(U[0].xyz).yzzz;
+  int4 zxxx = asint(U[0].xyz).zxxx;
+  int4 zxxy = asint(U[0].xyz).zxxy;
+  int4 zxxz = asint(U[0].xyz).zxxz;
+  int4 zxyx = asint(U[0].xyz).zxyx;
+  int4 zxyy = asint(U[0].xyz).zxyy;
+  int4 zxyz = asint(U[0].xyz).zxyz;
+  int4 zxzx = asint(U[0].xyz).zxzx;
+  int4 zxzy = asint(U[0].xyz).zxzy;
+  int4 zxzz = asint(U[0].xyz).zxzz;
+  int4 zyxx = asint(U[0].xyz).zyxx;
+  int4 zyxy = asint(U[0].xyz).zyxy;
+  int4 zyxz = asint(U[0].xyz).zyxz;
+  int4 zyyx = asint(U[0].xyz).zyyx;
+  int4 zyyy = asint(U[0].xyz).zyyy;
+  int4 zyyz = asint(U[0].xyz).zyyz;
+  int4 zyzx = asint(U[0].xyz).zyzx;
+  int4 zyzy = asint(U[0].xyz).zyzy;
+  int4 zyzz = asint(U[0].xyz).zyzz;
+  int4 zzxx = asint(U[0].xyz).zzxx;
+  int4 zzxy = asint(U[0].xyz).zzxy;
+  int4 zzxz = asint(U[0].xyz).zzxz;
+  int4 zzyx = asint(U[0].xyz).zzyx;
+  int4 zzyy = asint(U[0].xyz).zzyy;
+  int4 zzyz = asint(U[0].xyz).zzyz;
+  int4 zzzx = asint(U[0].xyz).zzzx;
+  int4 zzzy = asint(U[0].xyz).zzzy;
+  int4 zzzz = asint(U[0].xyz).zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..c308b3c
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.msl
@@ -0,0 +1,132 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ packed_int3 v;
+  /* 0x000c */ int8_t tint_pad[4];
+};
+
+void f(constant S& U) {
+  int3 v = U.v;
+  int x = U.v[0];
+  int y = U.v[1];
+  int z = U.v[2];
+  int2 xx = int3(U.v).xx;
+  int2 xy = int3(U.v).xy;
+  int2 xz = int3(U.v).xz;
+  int2 yx = int3(U.v).yx;
+  int2 yy = int3(U.v).yy;
+  int2 yz = int3(U.v).yz;
+  int2 zx = int3(U.v).zx;
+  int2 zy = int3(U.v).zy;
+  int2 zz = int3(U.v).zz;
+  int3 xxx = int3(U.v).xxx;
+  int3 xxy = int3(U.v).xxy;
+  int3 xxz = int3(U.v).xxz;
+  int3 xyx = int3(U.v).xyx;
+  int3 xyy = int3(U.v).xyy;
+  int3 xyz = int3(U.v).xyz;
+  int3 xzx = int3(U.v).xzx;
+  int3 xzy = int3(U.v).xzy;
+  int3 xzz = int3(U.v).xzz;
+  int3 yxx = int3(U.v).yxx;
+  int3 yxy = int3(U.v).yxy;
+  int3 yxz = int3(U.v).yxz;
+  int3 yyx = int3(U.v).yyx;
+  int3 yyy = int3(U.v).yyy;
+  int3 yyz = int3(U.v).yyz;
+  int3 yzx = int3(U.v).yzx;
+  int3 yzy = int3(U.v).yzy;
+  int3 yzz = int3(U.v).yzz;
+  int3 zxx = int3(U.v).zxx;
+  int3 zxy = int3(U.v).zxy;
+  int3 zxz = int3(U.v).zxz;
+  int3 zyx = int3(U.v).zyx;
+  int3 zyy = int3(U.v).zyy;
+  int3 zyz = int3(U.v).zyz;
+  int3 zzx = int3(U.v).zzx;
+  int3 zzy = int3(U.v).zzy;
+  int3 zzz = int3(U.v).zzz;
+  int4 xxxx = int3(U.v).xxxx;
+  int4 xxxy = int3(U.v).xxxy;
+  int4 xxxz = int3(U.v).xxxz;
+  int4 xxyx = int3(U.v).xxyx;
+  int4 xxyy = int3(U.v).xxyy;
+  int4 xxyz = int3(U.v).xxyz;
+  int4 xxzx = int3(U.v).xxzx;
+  int4 xxzy = int3(U.v).xxzy;
+  int4 xxzz = int3(U.v).xxzz;
+  int4 xyxx = int3(U.v).xyxx;
+  int4 xyxy = int3(U.v).xyxy;
+  int4 xyxz = int3(U.v).xyxz;
+  int4 xyyx = int3(U.v).xyyx;
+  int4 xyyy = int3(U.v).xyyy;
+  int4 xyyz = int3(U.v).xyyz;
+  int4 xyzx = int3(U.v).xyzx;
+  int4 xyzy = int3(U.v).xyzy;
+  int4 xyzz = int3(U.v).xyzz;
+  int4 xzxx = int3(U.v).xzxx;
+  int4 xzxy = int3(U.v).xzxy;
+  int4 xzxz = int3(U.v).xzxz;
+  int4 xzyx = int3(U.v).xzyx;
+  int4 xzyy = int3(U.v).xzyy;
+  int4 xzyz = int3(U.v).xzyz;
+  int4 xzzx = int3(U.v).xzzx;
+  int4 xzzy = int3(U.v).xzzy;
+  int4 xzzz = int3(U.v).xzzz;
+  int4 yxxx = int3(U.v).yxxx;
+  int4 yxxy = int3(U.v).yxxy;
+  int4 yxxz = int3(U.v).yxxz;
+  int4 yxyx = int3(U.v).yxyx;
+  int4 yxyy = int3(U.v).yxyy;
+  int4 yxyz = int3(U.v).yxyz;
+  int4 yxzx = int3(U.v).yxzx;
+  int4 yxzy = int3(U.v).yxzy;
+  int4 yxzz = int3(U.v).yxzz;
+  int4 yyxx = int3(U.v).yyxx;
+  int4 yyxy = int3(U.v).yyxy;
+  int4 yyxz = int3(U.v).yyxz;
+  int4 yyyx = int3(U.v).yyyx;
+  int4 yyyy = int3(U.v).yyyy;
+  int4 yyyz = int3(U.v).yyyz;
+  int4 yyzx = int3(U.v).yyzx;
+  int4 yyzy = int3(U.v).yyzy;
+  int4 yyzz = int3(U.v).yyzz;
+  int4 yzxx = int3(U.v).yzxx;
+  int4 yzxy = int3(U.v).yzxy;
+  int4 yzxz = int3(U.v).yzxz;
+  int4 yzyx = int3(U.v).yzyx;
+  int4 yzyy = int3(U.v).yzyy;
+  int4 yzyz = int3(U.v).yzyz;
+  int4 yzzx = int3(U.v).yzzx;
+  int4 yzzy = int3(U.v).yzzy;
+  int4 yzzz = int3(U.v).yzzz;
+  int4 zxxx = int3(U.v).zxxx;
+  int4 zxxy = int3(U.v).zxxy;
+  int4 zxxz = int3(U.v).zxxz;
+  int4 zxyx = int3(U.v).zxyx;
+  int4 zxyy = int3(U.v).zxyy;
+  int4 zxyz = int3(U.v).zxyz;
+  int4 zxzx = int3(U.v).zxzx;
+  int4 zxzy = int3(U.v).zxzy;
+  int4 zxzz = int3(U.v).zxzz;
+  int4 zyxx = int3(U.v).zyxx;
+  int4 zyxy = int3(U.v).zyxy;
+  int4 zyxz = int3(U.v).zyxz;
+  int4 zyyx = int3(U.v).zyyx;
+  int4 zyyy = int3(U.v).zyyy;
+  int4 zyyz = int3(U.v).zyyz;
+  int4 zyzx = int3(U.v).zyzx;
+  int4 zyzy = int3(U.v).zyzy;
+  int4 zyzz = int3(U.v).zyzz;
+  int4 zzxx = int3(U.v).zzxx;
+  int4 zzxy = int3(U.v).zzxy;
+  int4 zzxz = int3(U.v).zzxz;
+  int4 zzyx = int3(U.v).zzyx;
+  int4 zzyy = int3(U.v).zzyy;
+  int4 zzyz = int3(U.v).zzyz;
+  int4 zzzx = int3(U.v).zzzx;
+  int4 zzzy = int3(U.v).zzzy;
+  int4 zzzz = int3(U.v).zzzz;
+}
+
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.spvasm b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..a71db22
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,772 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 508
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %U "U"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpName %v "v"
+               OpName %x "x"
+               OpName %y "y"
+               OpName %z "z"
+               OpName %xx "xx"
+               OpName %xy "xy"
+               OpName %xz "xz"
+               OpName %yx "yx"
+               OpName %yy "yy"
+               OpName %yz "yz"
+               OpName %zx "zx"
+               OpName %zy "zy"
+               OpName %zz "zz"
+               OpName %xxx "xxx"
+               OpName %xxy "xxy"
+               OpName %xxz "xxz"
+               OpName %xyx "xyx"
+               OpName %xyy "xyy"
+               OpName %xyz "xyz"
+               OpName %xzx "xzx"
+               OpName %xzy "xzy"
+               OpName %xzz "xzz"
+               OpName %yxx "yxx"
+               OpName %yxy "yxy"
+               OpName %yxz "yxz"
+               OpName %yyx "yyx"
+               OpName %yyy "yyy"
+               OpName %yyz "yyz"
+               OpName %yzx "yzx"
+               OpName %yzy "yzy"
+               OpName %yzz "yzz"
+               OpName %zxx "zxx"
+               OpName %zxy "zxy"
+               OpName %zxz "zxz"
+               OpName %zyx "zyx"
+               OpName %zyy "zyy"
+               OpName %zyz "zyz"
+               OpName %zzx "zzx"
+               OpName %zzy "zzy"
+               OpName %zzz "zzz"
+               OpName %xxxx "xxxx"
+               OpName %xxxy "xxxy"
+               OpName %xxxz "xxxz"
+               OpName %xxyx "xxyx"
+               OpName %xxyy "xxyy"
+               OpName %xxyz "xxyz"
+               OpName %xxzx "xxzx"
+               OpName %xxzy "xxzy"
+               OpName %xxzz "xxzz"
+               OpName %xyxx "xyxx"
+               OpName %xyxy "xyxy"
+               OpName %xyxz "xyxz"
+               OpName %xyyx "xyyx"
+               OpName %xyyy "xyyy"
+               OpName %xyyz "xyyz"
+               OpName %xyzx "xyzx"
+               OpName %xyzy "xyzy"
+               OpName %xyzz "xyzz"
+               OpName %xzxx "xzxx"
+               OpName %xzxy "xzxy"
+               OpName %xzxz "xzxz"
+               OpName %xzyx "xzyx"
+               OpName %xzyy "xzyy"
+               OpName %xzyz "xzyz"
+               OpName %xzzx "xzzx"
+               OpName %xzzy "xzzy"
+               OpName %xzzz "xzzz"
+               OpName %yxxx "yxxx"
+               OpName %yxxy "yxxy"
+               OpName %yxxz "yxxz"
+               OpName %yxyx "yxyx"
+               OpName %yxyy "yxyy"
+               OpName %yxyz "yxyz"
+               OpName %yxzx "yxzx"
+               OpName %yxzy "yxzy"
+               OpName %yxzz "yxzz"
+               OpName %yyxx "yyxx"
+               OpName %yyxy "yyxy"
+               OpName %yyxz "yyxz"
+               OpName %yyyx "yyyx"
+               OpName %yyyy "yyyy"
+               OpName %yyyz "yyyz"
+               OpName %yyzx "yyzx"
+               OpName %yyzy "yyzy"
+               OpName %yyzz "yyzz"
+               OpName %yzxx "yzxx"
+               OpName %yzxy "yzxy"
+               OpName %yzxz "yzxz"
+               OpName %yzyx "yzyx"
+               OpName %yzyy "yzyy"
+               OpName %yzyz "yzyz"
+               OpName %yzzx "yzzx"
+               OpName %yzzy "yzzy"
+               OpName %yzzz "yzzz"
+               OpName %zxxx "zxxx"
+               OpName %zxxy "zxxy"
+               OpName %zxxz "zxxz"
+               OpName %zxyx "zxyx"
+               OpName %zxyy "zxyy"
+               OpName %zxyz "zxyz"
+               OpName %zxzx "zxzx"
+               OpName %zxzy "zxzy"
+               OpName %zxzz "zxzz"
+               OpName %zyxx "zyxx"
+               OpName %zyxy "zyxy"
+               OpName %zyxz "zyxz"
+               OpName %zyyx "zyyx"
+               OpName %zyyy "zyyy"
+               OpName %zyyz "zyyz"
+               OpName %zyzx "zyzx"
+               OpName %zyzy "zyzy"
+               OpName %zyzz "zyzz"
+               OpName %zzxx "zzxx"
+               OpName %zzxy "zzxy"
+               OpName %zzxz "zzxz"
+               OpName %zzyx "zzyx"
+               OpName %zzyy "zzyy"
+               OpName %zzyz "zzyz"
+               OpName %zzzx "zzzx"
+               OpName %zzzy "zzzy"
+               OpName %zzzz "zzzz"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %U NonWritable
+               OpDecorate %U DescriptorSet 0
+               OpDecorate %U Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+          %S = OpTypeStruct %v3int
+%_ptr_Uniform_S = OpTypePointer Uniform %S
+          %U = OpVariable %_ptr_Uniform_S Uniform
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v3int = OpTypePointer Uniform %v3int
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+         %19 = OpConstantNull %v3int
+%_ptr_Uniform_int = OpTypePointer Uniform %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %25 = OpConstantNull %int
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %40 = OpConstantNull %v2int
+      %v4int = OpTypeVector %int 4
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+        %187 = OpConstantNull %v4int
+%unused_entry_point = OpFunction %void None %6
+          %9 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %6
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v3int Function %19
+          %x = OpVariable %_ptr_Function_int Function %25
+          %y = OpVariable %_ptr_Function_int Function %25
+          %z = OpVariable %_ptr_Function_int Function %25
+         %xx = OpVariable %_ptr_Function_v2int Function %40
+         %xy = OpVariable %_ptr_Function_v2int Function %40
+         %xz = OpVariable %_ptr_Function_v2int Function %40
+         %yx = OpVariable %_ptr_Function_v2int Function %40
+         %yy = OpVariable %_ptr_Function_v2int Function %40
+         %yz = OpVariable %_ptr_Function_v2int Function %40
+         %zx = OpVariable %_ptr_Function_v2int Function %40
+         %zy = OpVariable %_ptr_Function_v2int Function %40
+         %zz = OpVariable %_ptr_Function_v2int Function %40
+        %xxx = OpVariable %_ptr_Function_v3int Function %19
+        %xxy = OpVariable %_ptr_Function_v3int Function %19
+        %xxz = OpVariable %_ptr_Function_v3int Function %19
+        %xyx = OpVariable %_ptr_Function_v3int Function %19
+        %xyy = OpVariable %_ptr_Function_v3int Function %19
+        %xyz = OpVariable %_ptr_Function_v3int Function %19
+        %xzx = OpVariable %_ptr_Function_v3int Function %19
+        %xzy = OpVariable %_ptr_Function_v3int Function %19
+        %xzz = OpVariable %_ptr_Function_v3int Function %19
+        %yxx = OpVariable %_ptr_Function_v3int Function %19
+        %yxy = OpVariable %_ptr_Function_v3int Function %19
+        %yxz = OpVariable %_ptr_Function_v3int Function %19
+        %yyx = OpVariable %_ptr_Function_v3int Function %19
+        %yyy = OpVariable %_ptr_Function_v3int Function %19
+        %yyz = OpVariable %_ptr_Function_v3int Function %19
+        %yzx = OpVariable %_ptr_Function_v3int Function %19
+        %yzy = OpVariable %_ptr_Function_v3int Function %19
+        %yzz = OpVariable %_ptr_Function_v3int Function %19
+        %zxx = OpVariable %_ptr_Function_v3int Function %19
+        %zxy = OpVariable %_ptr_Function_v3int Function %19
+        %zxz = OpVariable %_ptr_Function_v3int Function %19
+        %zyx = OpVariable %_ptr_Function_v3int Function %19
+        %zyy = OpVariable %_ptr_Function_v3int Function %19
+        %zyz = OpVariable %_ptr_Function_v3int Function %19
+        %zzx = OpVariable %_ptr_Function_v3int Function %19
+        %zzy = OpVariable %_ptr_Function_v3int Function %19
+        %zzz = OpVariable %_ptr_Function_v3int Function %19
+       %xxxx = OpVariable %_ptr_Function_v4int Function %187
+       %xxxy = OpVariable %_ptr_Function_v4int Function %187
+       %xxxz = OpVariable %_ptr_Function_v4int Function %187
+       %xxyx = OpVariable %_ptr_Function_v4int Function %187
+       %xxyy = OpVariable %_ptr_Function_v4int Function %187
+       %xxyz = OpVariable %_ptr_Function_v4int Function %187
+       %xxzx = OpVariable %_ptr_Function_v4int Function %187
+       %xxzy = OpVariable %_ptr_Function_v4int Function %187
+       %xxzz = OpVariable %_ptr_Function_v4int Function %187
+       %xyxx = OpVariable %_ptr_Function_v4int Function %187
+       %xyxy = OpVariable %_ptr_Function_v4int Function %187
+       %xyxz = OpVariable %_ptr_Function_v4int Function %187
+       %xyyx = OpVariable %_ptr_Function_v4int Function %187
+       %xyyy = OpVariable %_ptr_Function_v4int Function %187
+       %xyyz = OpVariable %_ptr_Function_v4int Function %187
+       %xyzx = OpVariable %_ptr_Function_v4int Function %187
+       %xyzy = OpVariable %_ptr_Function_v4int Function %187
+       %xyzz = OpVariable %_ptr_Function_v4int Function %187
+       %xzxx = OpVariable %_ptr_Function_v4int Function %187
+       %xzxy = OpVariable %_ptr_Function_v4int Function %187
+       %xzxz = OpVariable %_ptr_Function_v4int Function %187
+       %xzyx = OpVariable %_ptr_Function_v4int Function %187
+       %xzyy = OpVariable %_ptr_Function_v4int Function %187
+       %xzyz = OpVariable %_ptr_Function_v4int Function %187
+       %xzzx = OpVariable %_ptr_Function_v4int Function %187
+       %xzzy = OpVariable %_ptr_Function_v4int Function %187
+       %xzzz = OpVariable %_ptr_Function_v4int Function %187
+       %yxxx = OpVariable %_ptr_Function_v4int Function %187
+       %yxxy = OpVariable %_ptr_Function_v4int Function %187
+       %yxxz = OpVariable %_ptr_Function_v4int Function %187
+       %yxyx = OpVariable %_ptr_Function_v4int Function %187
+       %yxyy = OpVariable %_ptr_Function_v4int Function %187
+       %yxyz = OpVariable %_ptr_Function_v4int Function %187
+       %yxzx = OpVariable %_ptr_Function_v4int Function %187
+       %yxzy = OpVariable %_ptr_Function_v4int Function %187
+       %yxzz = OpVariable %_ptr_Function_v4int Function %187
+       %yyxx = OpVariable %_ptr_Function_v4int Function %187
+       %yyxy = OpVariable %_ptr_Function_v4int Function %187
+       %yyxz = OpVariable %_ptr_Function_v4int Function %187
+       %yyyx = OpVariable %_ptr_Function_v4int Function %187
+       %yyyy = OpVariable %_ptr_Function_v4int Function %187
+       %yyyz = OpVariable %_ptr_Function_v4int Function %187
+       %yyzx = OpVariable %_ptr_Function_v4int Function %187
+       %yyzy = OpVariable %_ptr_Function_v4int Function %187
+       %yyzz = OpVariable %_ptr_Function_v4int Function %187
+       %yzxx = OpVariable %_ptr_Function_v4int Function %187
+       %yzxy = OpVariable %_ptr_Function_v4int Function %187
+       %yzxz = OpVariable %_ptr_Function_v4int Function %187
+       %yzyx = OpVariable %_ptr_Function_v4int Function %187
+       %yzyy = OpVariable %_ptr_Function_v4int Function %187
+       %yzyz = OpVariable %_ptr_Function_v4int Function %187
+       %yzzx = OpVariable %_ptr_Function_v4int Function %187
+       %yzzy = OpVariable %_ptr_Function_v4int Function %187
+       %yzzz = OpVariable %_ptr_Function_v4int Function %187
+       %zxxx = OpVariable %_ptr_Function_v4int Function %187
+       %zxxy = OpVariable %_ptr_Function_v4int Function %187
+       %zxxz = OpVariable %_ptr_Function_v4int Function %187
+       %zxyx = OpVariable %_ptr_Function_v4int Function %187
+       %zxyy = OpVariable %_ptr_Function_v4int Function %187
+       %zxyz = OpVariable %_ptr_Function_v4int Function %187
+       %zxzx = OpVariable %_ptr_Function_v4int Function %187
+       %zxzy = OpVariable %_ptr_Function_v4int Function %187
+       %zxzz = OpVariable %_ptr_Function_v4int Function %187
+       %zyxx = OpVariable %_ptr_Function_v4int Function %187
+       %zyxy = OpVariable %_ptr_Function_v4int Function %187
+       %zyxz = OpVariable %_ptr_Function_v4int Function %187
+       %zyyx = OpVariable %_ptr_Function_v4int Function %187
+       %zyyy = OpVariable %_ptr_Function_v4int Function %187
+       %zyyz = OpVariable %_ptr_Function_v4int Function %187
+       %zyzx = OpVariable %_ptr_Function_v4int Function %187
+       %zyzy = OpVariable %_ptr_Function_v4int Function %187
+       %zyzz = OpVariable %_ptr_Function_v4int Function %187
+       %zzxx = OpVariable %_ptr_Function_v4int Function %187
+       %zzxy = OpVariable %_ptr_Function_v4int Function %187
+       %zzxz = OpVariable %_ptr_Function_v4int Function %187
+       %zzyx = OpVariable %_ptr_Function_v4int Function %187
+       %zzyy = OpVariable %_ptr_Function_v4int Function %187
+       %zzyz = OpVariable %_ptr_Function_v4int Function %187
+       %zzzx = OpVariable %_ptr_Function_v4int Function %187
+       %zzzy = OpVariable %_ptr_Function_v4int Function %187
+       %zzzz = OpVariable %_ptr_Function_v4int Function %187
+         %15 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %16 = OpLoad %v3int %15
+               OpStore %v %16
+         %21 = OpAccessChain %_ptr_Uniform_int %U %uint_0 %uint_0
+         %22 = OpLoad %int %21
+               OpStore %x %22
+         %27 = OpAccessChain %_ptr_Uniform_int %U %uint_0 %uint_1
+         %28 = OpLoad %int %27
+               OpStore %y %28
+         %31 = OpAccessChain %_ptr_Uniform_int %U %uint_0 %uint_2
+         %32 = OpLoad %int %31
+               OpStore %z %32
+         %34 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %36 = OpLoad %v3int %34
+         %37 = OpVectorShuffle %v2int %36 %36 0 0
+               OpStore %xx %37
+         %41 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %42 = OpLoad %v3int %41
+         %43 = OpVectorShuffle %v2int %42 %42 0 1
+               OpStore %xy %43
+         %45 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %46 = OpLoad %v3int %45
+         %47 = OpVectorShuffle %v2int %46 %46 0 2
+               OpStore %xz %47
+         %49 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %50 = OpLoad %v3int %49
+         %51 = OpVectorShuffle %v2int %50 %50 1 0
+               OpStore %yx %51
+         %53 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %54 = OpLoad %v3int %53
+         %55 = OpVectorShuffle %v2int %54 %54 1 1
+               OpStore %yy %55
+         %57 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %58 = OpLoad %v3int %57
+         %59 = OpVectorShuffle %v2int %58 %58 1 2
+               OpStore %yz %59
+         %61 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %62 = OpLoad %v3int %61
+         %63 = OpVectorShuffle %v2int %62 %62 2 0
+               OpStore %zx %63
+         %65 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %66 = OpLoad %v3int %65
+         %67 = OpVectorShuffle %v2int %66 %66 2 1
+               OpStore %zy %67
+         %69 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %70 = OpLoad %v3int %69
+         %71 = OpVectorShuffle %v2int %70 %70 2 2
+               OpStore %zz %71
+         %73 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %74 = OpLoad %v3int %73
+         %75 = OpVectorShuffle %v3int %74 %74 0 0 0
+               OpStore %xxx %75
+         %77 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %78 = OpLoad %v3int %77
+         %79 = OpVectorShuffle %v3int %78 %78 0 0 1
+               OpStore %xxy %79
+         %81 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %82 = OpLoad %v3int %81
+         %83 = OpVectorShuffle %v3int %82 %82 0 0 2
+               OpStore %xxz %83
+         %85 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %86 = OpLoad %v3int %85
+         %87 = OpVectorShuffle %v3int %86 %86 0 1 0
+               OpStore %xyx %87
+         %89 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %90 = OpLoad %v3int %89
+         %91 = OpVectorShuffle %v3int %90 %90 0 1 1
+               OpStore %xyy %91
+         %93 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %94 = OpLoad %v3int %93
+         %95 = OpVectorShuffle %v3int %94 %94 0 1 2
+               OpStore %xyz %95
+         %97 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+         %98 = OpLoad %v3int %97
+         %99 = OpVectorShuffle %v3int %98 %98 0 2 0
+               OpStore %xzx %99
+        %101 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %102 = OpLoad %v3int %101
+        %103 = OpVectorShuffle %v3int %102 %102 0 2 1
+               OpStore %xzy %103
+        %105 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %106 = OpLoad %v3int %105
+        %107 = OpVectorShuffle %v3int %106 %106 0 2 2
+               OpStore %xzz %107
+        %109 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %110 = OpLoad %v3int %109
+        %111 = OpVectorShuffle %v3int %110 %110 1 0 0
+               OpStore %yxx %111
+        %113 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %114 = OpLoad %v3int %113
+        %115 = OpVectorShuffle %v3int %114 %114 1 0 1
+               OpStore %yxy %115
+        %117 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %118 = OpLoad %v3int %117
+        %119 = OpVectorShuffle %v3int %118 %118 1 0 2
+               OpStore %yxz %119
+        %121 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %122 = OpLoad %v3int %121
+        %123 = OpVectorShuffle %v3int %122 %122 1 1 0
+               OpStore %yyx %123
+        %125 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %126 = OpLoad %v3int %125
+        %127 = OpVectorShuffle %v3int %126 %126 1 1 1
+               OpStore %yyy %127
+        %129 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %130 = OpLoad %v3int %129
+        %131 = OpVectorShuffle %v3int %130 %130 1 1 2
+               OpStore %yyz %131
+        %133 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %134 = OpLoad %v3int %133
+        %135 = OpVectorShuffle %v3int %134 %134 1 2 0
+               OpStore %yzx %135
+        %137 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %138 = OpLoad %v3int %137
+        %139 = OpVectorShuffle %v3int %138 %138 1 2 1
+               OpStore %yzy %139
+        %141 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %142 = OpLoad %v3int %141
+        %143 = OpVectorShuffle %v3int %142 %142 1 2 2
+               OpStore %yzz %143
+        %145 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %146 = OpLoad %v3int %145
+        %147 = OpVectorShuffle %v3int %146 %146 2 0 0
+               OpStore %zxx %147
+        %149 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %150 = OpLoad %v3int %149
+        %151 = OpVectorShuffle %v3int %150 %150 2 0 1
+               OpStore %zxy %151
+        %153 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %154 = OpLoad %v3int %153
+        %155 = OpVectorShuffle %v3int %154 %154 2 0 2
+               OpStore %zxz %155
+        %157 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %158 = OpLoad %v3int %157
+        %159 = OpVectorShuffle %v3int %158 %158 2 1 0
+               OpStore %zyx %159
+        %161 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %162 = OpLoad %v3int %161
+        %163 = OpVectorShuffle %v3int %162 %162 2 1 1
+               OpStore %zyy %163
+        %165 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %166 = OpLoad %v3int %165
+        %167 = OpVectorShuffle %v3int %166 %166 2 1 2
+               OpStore %zyz %167
+        %169 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %170 = OpLoad %v3int %169
+        %171 = OpVectorShuffle %v3int %170 %170 2 2 0
+               OpStore %zzx %171
+        %173 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %174 = OpLoad %v3int %173
+        %175 = OpVectorShuffle %v3int %174 %174 2 2 1
+               OpStore %zzy %175
+        %177 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %178 = OpLoad %v3int %177
+        %179 = OpVectorShuffle %v3int %178 %178 2 2 2
+               OpStore %zzz %179
+        %181 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %183 = OpLoad %v3int %181
+        %184 = OpVectorShuffle %v4int %183 %183 0 0 0 0
+               OpStore %xxxx %184
+        %188 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %189 = OpLoad %v3int %188
+        %190 = OpVectorShuffle %v4int %189 %189 0 0 0 1
+               OpStore %xxxy %190
+        %192 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %193 = OpLoad %v3int %192
+        %194 = OpVectorShuffle %v4int %193 %193 0 0 0 2
+               OpStore %xxxz %194
+        %196 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %197 = OpLoad %v3int %196
+        %198 = OpVectorShuffle %v4int %197 %197 0 0 1 0
+               OpStore %xxyx %198
+        %200 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %201 = OpLoad %v3int %200
+        %202 = OpVectorShuffle %v4int %201 %201 0 0 1 1
+               OpStore %xxyy %202
+        %204 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %205 = OpLoad %v3int %204
+        %206 = OpVectorShuffle %v4int %205 %205 0 0 1 2
+               OpStore %xxyz %206
+        %208 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %209 = OpLoad %v3int %208
+        %210 = OpVectorShuffle %v4int %209 %209 0 0 2 0
+               OpStore %xxzx %210
+        %212 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %213 = OpLoad %v3int %212
+        %214 = OpVectorShuffle %v4int %213 %213 0 0 2 1
+               OpStore %xxzy %214
+        %216 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %217 = OpLoad %v3int %216
+        %218 = OpVectorShuffle %v4int %217 %217 0 0 2 2
+               OpStore %xxzz %218
+        %220 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %221 = OpLoad %v3int %220
+        %222 = OpVectorShuffle %v4int %221 %221 0 1 0 0
+               OpStore %xyxx %222
+        %224 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %225 = OpLoad %v3int %224
+        %226 = OpVectorShuffle %v4int %225 %225 0 1 0 1
+               OpStore %xyxy %226
+        %228 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %229 = OpLoad %v3int %228
+        %230 = OpVectorShuffle %v4int %229 %229 0 1 0 2
+               OpStore %xyxz %230
+        %232 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %233 = OpLoad %v3int %232
+        %234 = OpVectorShuffle %v4int %233 %233 0 1 1 0
+               OpStore %xyyx %234
+        %236 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %237 = OpLoad %v3int %236
+        %238 = OpVectorShuffle %v4int %237 %237 0 1 1 1
+               OpStore %xyyy %238
+        %240 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %241 = OpLoad %v3int %240
+        %242 = OpVectorShuffle %v4int %241 %241 0 1 1 2
+               OpStore %xyyz %242
+        %244 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %245 = OpLoad %v3int %244
+        %246 = OpVectorShuffle %v4int %245 %245 0 1 2 0
+               OpStore %xyzx %246
+        %248 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %249 = OpLoad %v3int %248
+        %250 = OpVectorShuffle %v4int %249 %249 0 1 2 1
+               OpStore %xyzy %250
+        %252 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %253 = OpLoad %v3int %252
+        %254 = OpVectorShuffle %v4int %253 %253 0 1 2 2
+               OpStore %xyzz %254
+        %256 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %257 = OpLoad %v3int %256
+        %258 = OpVectorShuffle %v4int %257 %257 0 2 0 0
+               OpStore %xzxx %258
+        %260 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %261 = OpLoad %v3int %260
+        %262 = OpVectorShuffle %v4int %261 %261 0 2 0 1
+               OpStore %xzxy %262
+        %264 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %265 = OpLoad %v3int %264
+        %266 = OpVectorShuffle %v4int %265 %265 0 2 0 2
+               OpStore %xzxz %266
+        %268 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %269 = OpLoad %v3int %268
+        %270 = OpVectorShuffle %v4int %269 %269 0 2 1 0
+               OpStore %xzyx %270
+        %272 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %273 = OpLoad %v3int %272
+        %274 = OpVectorShuffle %v4int %273 %273 0 2 1 1
+               OpStore %xzyy %274
+        %276 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %277 = OpLoad %v3int %276
+        %278 = OpVectorShuffle %v4int %277 %277 0 2 1 2
+               OpStore %xzyz %278
+        %280 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %281 = OpLoad %v3int %280
+        %282 = OpVectorShuffle %v4int %281 %281 0 2 2 0
+               OpStore %xzzx %282
+        %284 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %285 = OpLoad %v3int %284
+        %286 = OpVectorShuffle %v4int %285 %285 0 2 2 1
+               OpStore %xzzy %286
+        %288 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %289 = OpLoad %v3int %288
+        %290 = OpVectorShuffle %v4int %289 %289 0 2 2 2
+               OpStore %xzzz %290
+        %292 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %293 = OpLoad %v3int %292
+        %294 = OpVectorShuffle %v4int %293 %293 1 0 0 0
+               OpStore %yxxx %294
+        %296 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %297 = OpLoad %v3int %296
+        %298 = OpVectorShuffle %v4int %297 %297 1 0 0 1
+               OpStore %yxxy %298
+        %300 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %301 = OpLoad %v3int %300
+        %302 = OpVectorShuffle %v4int %301 %301 1 0 0 2
+               OpStore %yxxz %302
+        %304 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %305 = OpLoad %v3int %304
+        %306 = OpVectorShuffle %v4int %305 %305 1 0 1 0
+               OpStore %yxyx %306
+        %308 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %309 = OpLoad %v3int %308
+        %310 = OpVectorShuffle %v4int %309 %309 1 0 1 1
+               OpStore %yxyy %310
+        %312 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %313 = OpLoad %v3int %312
+        %314 = OpVectorShuffle %v4int %313 %313 1 0 1 2
+               OpStore %yxyz %314
+        %316 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %317 = OpLoad %v3int %316
+        %318 = OpVectorShuffle %v4int %317 %317 1 0 2 0
+               OpStore %yxzx %318
+        %320 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %321 = OpLoad %v3int %320
+        %322 = OpVectorShuffle %v4int %321 %321 1 0 2 1
+               OpStore %yxzy %322
+        %324 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %325 = OpLoad %v3int %324
+        %326 = OpVectorShuffle %v4int %325 %325 1 0 2 2
+               OpStore %yxzz %326
+        %328 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %329 = OpLoad %v3int %328
+        %330 = OpVectorShuffle %v4int %329 %329 1 1 0 0
+               OpStore %yyxx %330
+        %332 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %333 = OpLoad %v3int %332
+        %334 = OpVectorShuffle %v4int %333 %333 1 1 0 1
+               OpStore %yyxy %334
+        %336 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %337 = OpLoad %v3int %336
+        %338 = OpVectorShuffle %v4int %337 %337 1 1 0 2
+               OpStore %yyxz %338
+        %340 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %341 = OpLoad %v3int %340
+        %342 = OpVectorShuffle %v4int %341 %341 1 1 1 0
+               OpStore %yyyx %342
+        %344 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %345 = OpLoad %v3int %344
+        %346 = OpVectorShuffle %v4int %345 %345 1 1 1 1
+               OpStore %yyyy %346
+        %348 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %349 = OpLoad %v3int %348
+        %350 = OpVectorShuffle %v4int %349 %349 1 1 1 2
+               OpStore %yyyz %350
+        %352 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %353 = OpLoad %v3int %352
+        %354 = OpVectorShuffle %v4int %353 %353 1 1 2 0
+               OpStore %yyzx %354
+        %356 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %357 = OpLoad %v3int %356
+        %358 = OpVectorShuffle %v4int %357 %357 1 1 2 1
+               OpStore %yyzy %358
+        %360 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %361 = OpLoad %v3int %360
+        %362 = OpVectorShuffle %v4int %361 %361 1 1 2 2
+               OpStore %yyzz %362
+        %364 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %365 = OpLoad %v3int %364
+        %366 = OpVectorShuffle %v4int %365 %365 1 2 0 0
+               OpStore %yzxx %366
+        %368 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %369 = OpLoad %v3int %368
+        %370 = OpVectorShuffle %v4int %369 %369 1 2 0 1
+               OpStore %yzxy %370
+        %372 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %373 = OpLoad %v3int %372
+        %374 = OpVectorShuffle %v4int %373 %373 1 2 0 2
+               OpStore %yzxz %374
+        %376 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %377 = OpLoad %v3int %376
+        %378 = OpVectorShuffle %v4int %377 %377 1 2 1 0
+               OpStore %yzyx %378
+        %380 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %381 = OpLoad %v3int %380
+        %382 = OpVectorShuffle %v4int %381 %381 1 2 1 1
+               OpStore %yzyy %382
+        %384 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %385 = OpLoad %v3int %384
+        %386 = OpVectorShuffle %v4int %385 %385 1 2 1 2
+               OpStore %yzyz %386
+        %388 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %389 = OpLoad %v3int %388
+        %390 = OpVectorShuffle %v4int %389 %389 1 2 2 0
+               OpStore %yzzx %390
+        %392 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %393 = OpLoad %v3int %392
+        %394 = OpVectorShuffle %v4int %393 %393 1 2 2 1
+               OpStore %yzzy %394
+        %396 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %397 = OpLoad %v3int %396
+        %398 = OpVectorShuffle %v4int %397 %397 1 2 2 2
+               OpStore %yzzz %398
+        %400 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %401 = OpLoad %v3int %400
+        %402 = OpVectorShuffle %v4int %401 %401 2 0 0 0
+               OpStore %zxxx %402
+        %404 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %405 = OpLoad %v3int %404
+        %406 = OpVectorShuffle %v4int %405 %405 2 0 0 1
+               OpStore %zxxy %406
+        %408 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %409 = OpLoad %v3int %408
+        %410 = OpVectorShuffle %v4int %409 %409 2 0 0 2
+               OpStore %zxxz %410
+        %412 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %413 = OpLoad %v3int %412
+        %414 = OpVectorShuffle %v4int %413 %413 2 0 1 0
+               OpStore %zxyx %414
+        %416 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %417 = OpLoad %v3int %416
+        %418 = OpVectorShuffle %v4int %417 %417 2 0 1 1
+               OpStore %zxyy %418
+        %420 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %421 = OpLoad %v3int %420
+        %422 = OpVectorShuffle %v4int %421 %421 2 0 1 2
+               OpStore %zxyz %422
+        %424 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %425 = OpLoad %v3int %424
+        %426 = OpVectorShuffle %v4int %425 %425 2 0 2 0
+               OpStore %zxzx %426
+        %428 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %429 = OpLoad %v3int %428
+        %430 = OpVectorShuffle %v4int %429 %429 2 0 2 1
+               OpStore %zxzy %430
+        %432 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %433 = OpLoad %v3int %432
+        %434 = OpVectorShuffle %v4int %433 %433 2 0 2 2
+               OpStore %zxzz %434
+        %436 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %437 = OpLoad %v3int %436
+        %438 = OpVectorShuffle %v4int %437 %437 2 1 0 0
+               OpStore %zyxx %438
+        %440 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %441 = OpLoad %v3int %440
+        %442 = OpVectorShuffle %v4int %441 %441 2 1 0 1
+               OpStore %zyxy %442
+        %444 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %445 = OpLoad %v3int %444
+        %446 = OpVectorShuffle %v4int %445 %445 2 1 0 2
+               OpStore %zyxz %446
+        %448 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %449 = OpLoad %v3int %448
+        %450 = OpVectorShuffle %v4int %449 %449 2 1 1 0
+               OpStore %zyyx %450
+        %452 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %453 = OpLoad %v3int %452
+        %454 = OpVectorShuffle %v4int %453 %453 2 1 1 1
+               OpStore %zyyy %454
+        %456 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %457 = OpLoad %v3int %456
+        %458 = OpVectorShuffle %v4int %457 %457 2 1 1 2
+               OpStore %zyyz %458
+        %460 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %461 = OpLoad %v3int %460
+        %462 = OpVectorShuffle %v4int %461 %461 2 1 2 0
+               OpStore %zyzx %462
+        %464 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %465 = OpLoad %v3int %464
+        %466 = OpVectorShuffle %v4int %465 %465 2 1 2 1
+               OpStore %zyzy %466
+        %468 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %469 = OpLoad %v3int %468
+        %470 = OpVectorShuffle %v4int %469 %469 2 1 2 2
+               OpStore %zyzz %470
+        %472 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %473 = OpLoad %v3int %472
+        %474 = OpVectorShuffle %v4int %473 %473 2 2 0 0
+               OpStore %zzxx %474
+        %476 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %477 = OpLoad %v3int %476
+        %478 = OpVectorShuffle %v4int %477 %477 2 2 0 1
+               OpStore %zzxy %478
+        %480 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %481 = OpLoad %v3int %480
+        %482 = OpVectorShuffle %v4int %481 %481 2 2 0 2
+               OpStore %zzxz %482
+        %484 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %485 = OpLoad %v3int %484
+        %486 = OpVectorShuffle %v4int %485 %485 2 2 1 0
+               OpStore %zzyx %486
+        %488 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %489 = OpLoad %v3int %488
+        %490 = OpVectorShuffle %v4int %489 %489 2 2 1 1
+               OpStore %zzyy %490
+        %492 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %493 = OpLoad %v3int %492
+        %494 = OpVectorShuffle %v4int %493 %493 2 2 1 2
+               OpStore %zzyz %494
+        %496 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %497 = OpLoad %v3int %496
+        %498 = OpVectorShuffle %v4int %497 %497 2 2 2 0
+               OpStore %zzzx %498
+        %500 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %501 = OpLoad %v3int %500
+        %502 = OpVectorShuffle %v4int %501 %501 2 2 2 1
+               OpStore %zzzy %502
+        %504 = OpAccessChain %_ptr_Uniform_v3int %U %uint_0
+        %505 = OpLoad %v3int %504
+        %506 = OpVectorShuffle %v4int %505 %505 2 2 2 2
+               OpStore %zzzz %506
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..d174a70
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,130 @@
+[[block]]
+struct S {
+  v : vec3<i32>;
+};
+
+[[group(0), binding(0)]] var<uniform> U : S;
+
+fn f() {
+  var v = U.v;
+  var x = U.v.x;
+  var y = U.v.y;
+  var z = U.v.z;
+  var xx = U.v.xx;
+  var xy = U.v.xy;
+  var xz = U.v.xz;
+  var yx = U.v.yx;
+  var yy = U.v.yy;
+  var yz = U.v.yz;
+  var zx = U.v.zx;
+  var zy = U.v.zy;
+  var zz = U.v.zz;
+  var xxx = U.v.xxx;
+  var xxy = U.v.xxy;
+  var xxz = U.v.xxz;
+  var xyx = U.v.xyx;
+  var xyy = U.v.xyy;
+  var xyz = U.v.xyz;
+  var xzx = U.v.xzx;
+  var xzy = U.v.xzy;
+  var xzz = U.v.xzz;
+  var yxx = U.v.yxx;
+  var yxy = U.v.yxy;
+  var yxz = U.v.yxz;
+  var yyx = U.v.yyx;
+  var yyy = U.v.yyy;
+  var yyz = U.v.yyz;
+  var yzx = U.v.yzx;
+  var yzy = U.v.yzy;
+  var yzz = U.v.yzz;
+  var zxx = U.v.zxx;
+  var zxy = U.v.zxy;
+  var zxz = U.v.zxz;
+  var zyx = U.v.zyx;
+  var zyy = U.v.zyy;
+  var zyz = U.v.zyz;
+  var zzx = U.v.zzx;
+  var zzy = U.v.zzy;
+  var zzz = U.v.zzz;
+  var xxxx = U.v.xxxx;
+  var xxxy = U.v.xxxy;
+  var xxxz = U.v.xxxz;
+  var xxyx = U.v.xxyx;
+  var xxyy = U.v.xxyy;
+  var xxyz = U.v.xxyz;
+  var xxzx = U.v.xxzx;
+  var xxzy = U.v.xxzy;
+  var xxzz = U.v.xxzz;
+  var xyxx = U.v.xyxx;
+  var xyxy = U.v.xyxy;
+  var xyxz = U.v.xyxz;
+  var xyyx = U.v.xyyx;
+  var xyyy = U.v.xyyy;
+  var xyyz = U.v.xyyz;
+  var xyzx = U.v.xyzx;
+  var xyzy = U.v.xyzy;
+  var xyzz = U.v.xyzz;
+  var xzxx = U.v.xzxx;
+  var xzxy = U.v.xzxy;
+  var xzxz = U.v.xzxz;
+  var xzyx = U.v.xzyx;
+  var xzyy = U.v.xzyy;
+  var xzyz = U.v.xzyz;
+  var xzzx = U.v.xzzx;
+  var xzzy = U.v.xzzy;
+  var xzzz = U.v.xzzz;
+  var yxxx = U.v.yxxx;
+  var yxxy = U.v.yxxy;
+  var yxxz = U.v.yxxz;
+  var yxyx = U.v.yxyx;
+  var yxyy = U.v.yxyy;
+  var yxyz = U.v.yxyz;
+  var yxzx = U.v.yxzx;
+  var yxzy = U.v.yxzy;
+  var yxzz = U.v.yxzz;
+  var yyxx = U.v.yyxx;
+  var yyxy = U.v.yyxy;
+  var yyxz = U.v.yyxz;
+  var yyyx = U.v.yyyx;
+  var yyyy = U.v.yyyy;
+  var yyyz = U.v.yyyz;
+  var yyzx = U.v.yyzx;
+  var yyzy = U.v.yyzy;
+  var yyzz = U.v.yyzz;
+  var yzxx = U.v.yzxx;
+  var yzxy = U.v.yzxy;
+  var yzxz = U.v.yzxz;
+  var yzyx = U.v.yzyx;
+  var yzyy = U.v.yzyy;
+  var yzyz = U.v.yzyz;
+  var yzzx = U.v.yzzx;
+  var yzzy = U.v.yzzy;
+  var yzzz = U.v.yzzz;
+  var zxxx = U.v.zxxx;
+  var zxxy = U.v.zxxy;
+  var zxxz = U.v.zxxz;
+  var zxyx = U.v.zxyx;
+  var zxyy = U.v.zxyy;
+  var zxyz = U.v.zxyz;
+  var zxzx = U.v.zxzx;
+  var zxzy = U.v.zxzy;
+  var zxzz = U.v.zxzz;
+  var zyxx = U.v.zyxx;
+  var zyxy = U.v.zyxy;
+  var zyxz = U.v.zyxz;
+  var zyyx = U.v.zyyx;
+  var zyyy = U.v.zyyy;
+  var zyyz = U.v.zyyz;
+  var zyzx = U.v.zyzx;
+  var zyzy = U.v.zyzy;
+  var zyzz = U.v.zyzz;
+  var zzxx = U.v.zzxx;
+  var zzxy = U.v.zzxy;
+  var zzxz = U.v.zzxz;
+  var zzyx = U.v.zzyx;
+  var zzyy = U.v.zzyy;
+  var zzyz = U.v.zzyz;
+  var zzzx = U.v.zzzx;
+  var zzzy = U.v.zzzy;
+  var zzzz = U.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl b/test/expressions/swizzle/read/packed_vec3/u32.wgsl
new file mode 100644
index 0000000..358d13b
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl
@@ -0,0 +1,144 @@
+[[block]]
+struct S {
+    v: vec3<u32>;
+};
+
+[[group(0), binding(0)]] var<uniform> U : S;
+
+fn f() {
+    var    v = U.v;
+
+    var    x = U.v.x;
+    var    y = U.v.y;
+    var    z = U.v.z;
+
+    var   xx = U.v.xx;
+    var   xy = U.v.xy;
+    var   xz = U.v.xz;
+    var   yx = U.v.yx;
+    var   yy = U.v.yy;
+    var   yz = U.v.yz;
+    var   zx = U.v.zx;
+    var   zy = U.v.zy;
+    var   zz = U.v.zz;
+
+    var  xxx = U.v.xxx;
+    var  xxy = U.v.xxy;
+    var  xxz = U.v.xxz;
+    var  xyx = U.v.xyx;
+    var  xyy = U.v.xyy;
+    var  xyz = U.v.xyz;
+    var  xzx = U.v.xzx;
+    var  xzy = U.v.xzy;
+    var  xzz = U.v.xzz;
+
+    var  yxx = U.v.yxx;
+    var  yxy = U.v.yxy;
+    var  yxz = U.v.yxz;
+    var  yyx = U.v.yyx;
+    var  yyy = U.v.yyy;
+    var  yyz = U.v.yyz;
+    var  yzx = U.v.yzx;
+    var  yzy = U.v.yzy;
+    var  yzz = U.v.yzz;
+
+    var  zxx = U.v.zxx;
+    var  zxy = U.v.zxy;
+    var  zxz = U.v.zxz;
+    var  zyx = U.v.zyx;
+    var  zyy = U.v.zyy;
+    var  zyz = U.v.zyz;
+    var  zzx = U.v.zzx;
+    var  zzy = U.v.zzy;
+    var  zzz = U.v.zzz;
+
+    var xxxx = U.v.xxxx;
+    var xxxy = U.v.xxxy;
+    var xxxz = U.v.xxxz;
+    var xxyx = U.v.xxyx;
+    var xxyy = U.v.xxyy;
+    var xxyz = U.v.xxyz;
+    var xxzx = U.v.xxzx;
+    var xxzy = U.v.xxzy;
+    var xxzz = U.v.xxzz;
+
+    var xyxx = U.v.xyxx;
+    var xyxy = U.v.xyxy;
+    var xyxz = U.v.xyxz;
+    var xyyx = U.v.xyyx;
+    var xyyy = U.v.xyyy;
+    var xyyz = U.v.xyyz;
+    var xyzx = U.v.xyzx;
+    var xyzy = U.v.xyzy;
+    var xyzz = U.v.xyzz;
+
+    var xzxx = U.v.xzxx;
+    var xzxy = U.v.xzxy;
+    var xzxz = U.v.xzxz;
+    var xzyx = U.v.xzyx;
+    var xzyy = U.v.xzyy;
+    var xzyz = U.v.xzyz;
+    var xzzx = U.v.xzzx;
+    var xzzy = U.v.xzzy;
+    var xzzz = U.v.xzzz;
+
+    var yxxx = U.v.yxxx;
+    var yxxy = U.v.yxxy;
+    var yxxz = U.v.yxxz;
+    var yxyx = U.v.yxyx;
+    var yxyy = U.v.yxyy;
+    var yxyz = U.v.yxyz;
+    var yxzx = U.v.yxzx;
+    var yxzy = U.v.yxzy;
+    var yxzz = U.v.yxzz;
+
+    var yyxx = U.v.yyxx;
+    var yyxy = U.v.yyxy;
+    var yyxz = U.v.yyxz;
+    var yyyx = U.v.yyyx;
+    var yyyy = U.v.yyyy;
+    var yyyz = U.v.yyyz;
+    var yyzx = U.v.yyzx;
+    var yyzy = U.v.yyzy;
+    var yyzz = U.v.yyzz;
+
+    var yzxx = U.v.yzxx;
+    var yzxy = U.v.yzxy;
+    var yzxz = U.v.yzxz;
+    var yzyx = U.v.yzyx;
+    var yzyy = U.v.yzyy;
+    var yzyz = U.v.yzyz;
+    var yzzx = U.v.yzzx;
+    var yzzy = U.v.yzzy;
+    var yzzz = U.v.yzzz;
+
+    var zxxx = U.v.zxxx;
+    var zxxy = U.v.zxxy;
+    var zxxz = U.v.zxxz;
+    var zxyx = U.v.zxyx;
+    var zxyy = U.v.zxyy;
+    var zxyz = U.v.zxyz;
+    var zxzx = U.v.zxzx;
+    var zxzy = U.v.zxzy;
+    var zxzz = U.v.zxzz;
+
+    var zyxx = U.v.zyxx;
+    var zyxy = U.v.zyxy;
+    var zyxz = U.v.zyxz;
+    var zyyx = U.v.zyyx;
+    var zyyy = U.v.zyyy;
+    var zyyz = U.v.zyyz;
+    var zyzx = U.v.zyzx;
+    var zyzy = U.v.zyzy;
+    var zyzz = U.v.zyzz;
+
+    var zzxx = U.v.zzxx;
+    var zzxy = U.v.zzxy;
+    var zzxz = U.v.zzxz;
+    var zzyx = U.v.zzyx;
+    var zzyy = U.v.zzyy;
+    var zzyz = U.v.zzyz;
+    var zzzx = U.v.zzzx;
+    var zzzy = U.v.zzzy;
+    var zzzz = U.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.hlsl b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..72d8077
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,132 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+cbuffer cbuffer_U : register(b0, space0) {
+  uint4 U[1];
+};
+
+void f() {
+  uint3 v = U[0].xyz;
+  uint x = U[0].x;
+  uint y = U[0].y;
+  uint z = U[0].z;
+  uint2 xx = U[0].xyz.xx;
+  uint2 xy = U[0].xyz.xy;
+  uint2 xz = U[0].xyz.xz;
+  uint2 yx = U[0].xyz.yx;
+  uint2 yy = U[0].xyz.yy;
+  uint2 yz = U[0].xyz.yz;
+  uint2 zx = U[0].xyz.zx;
+  uint2 zy = U[0].xyz.zy;
+  uint2 zz = U[0].xyz.zz;
+  uint3 xxx = U[0].xyz.xxx;
+  uint3 xxy = U[0].xyz.xxy;
+  uint3 xxz = U[0].xyz.xxz;
+  uint3 xyx = U[0].xyz.xyx;
+  uint3 xyy = U[0].xyz.xyy;
+  uint3 xyz = U[0].xyz.xyz;
+  uint3 xzx = U[0].xyz.xzx;
+  uint3 xzy = U[0].xyz.xzy;
+  uint3 xzz = U[0].xyz.xzz;
+  uint3 yxx = U[0].xyz.yxx;
+  uint3 yxy = U[0].xyz.yxy;
+  uint3 yxz = U[0].xyz.yxz;
+  uint3 yyx = U[0].xyz.yyx;
+  uint3 yyy = U[0].xyz.yyy;
+  uint3 yyz = U[0].xyz.yyz;
+  uint3 yzx = U[0].xyz.yzx;
+  uint3 yzy = U[0].xyz.yzy;
+  uint3 yzz = U[0].xyz.yzz;
+  uint3 zxx = U[0].xyz.zxx;
+  uint3 zxy = U[0].xyz.zxy;
+  uint3 zxz = U[0].xyz.zxz;
+  uint3 zyx = U[0].xyz.zyx;
+  uint3 zyy = U[0].xyz.zyy;
+  uint3 zyz = U[0].xyz.zyz;
+  uint3 zzx = U[0].xyz.zzx;
+  uint3 zzy = U[0].xyz.zzy;
+  uint3 zzz = U[0].xyz.zzz;
+  uint4 xxxx = U[0].xyz.xxxx;
+  uint4 xxxy = U[0].xyz.xxxy;
+  uint4 xxxz = U[0].xyz.xxxz;
+  uint4 xxyx = U[0].xyz.xxyx;
+  uint4 xxyy = U[0].xyz.xxyy;
+  uint4 xxyz = U[0].xyz.xxyz;
+  uint4 xxzx = U[0].xyz.xxzx;
+  uint4 xxzy = U[0].xyz.xxzy;
+  uint4 xxzz = U[0].xyz.xxzz;
+  uint4 xyxx = U[0].xyz.xyxx;
+  uint4 xyxy = U[0].xyz.xyxy;
+  uint4 xyxz = U[0].xyz.xyxz;
+  uint4 xyyx = U[0].xyz.xyyx;
+  uint4 xyyy = U[0].xyz.xyyy;
+  uint4 xyyz = U[0].xyz.xyyz;
+  uint4 xyzx = U[0].xyz.xyzx;
+  uint4 xyzy = U[0].xyz.xyzy;
+  uint4 xyzz = U[0].xyz.xyzz;
+  uint4 xzxx = U[0].xyz.xzxx;
+  uint4 xzxy = U[0].xyz.xzxy;
+  uint4 xzxz = U[0].xyz.xzxz;
+  uint4 xzyx = U[0].xyz.xzyx;
+  uint4 xzyy = U[0].xyz.xzyy;
+  uint4 xzyz = U[0].xyz.xzyz;
+  uint4 xzzx = U[0].xyz.xzzx;
+  uint4 xzzy = U[0].xyz.xzzy;
+  uint4 xzzz = U[0].xyz.xzzz;
+  uint4 yxxx = U[0].xyz.yxxx;
+  uint4 yxxy = U[0].xyz.yxxy;
+  uint4 yxxz = U[0].xyz.yxxz;
+  uint4 yxyx = U[0].xyz.yxyx;
+  uint4 yxyy = U[0].xyz.yxyy;
+  uint4 yxyz = U[0].xyz.yxyz;
+  uint4 yxzx = U[0].xyz.yxzx;
+  uint4 yxzy = U[0].xyz.yxzy;
+  uint4 yxzz = U[0].xyz.yxzz;
+  uint4 yyxx = U[0].xyz.yyxx;
+  uint4 yyxy = U[0].xyz.yyxy;
+  uint4 yyxz = U[0].xyz.yyxz;
+  uint4 yyyx = U[0].xyz.yyyx;
+  uint4 yyyy = U[0].xyz.yyyy;
+  uint4 yyyz = U[0].xyz.yyyz;
+  uint4 yyzx = U[0].xyz.yyzx;
+  uint4 yyzy = U[0].xyz.yyzy;
+  uint4 yyzz = U[0].xyz.yyzz;
+  uint4 yzxx = U[0].xyz.yzxx;
+  uint4 yzxy = U[0].xyz.yzxy;
+  uint4 yzxz = U[0].xyz.yzxz;
+  uint4 yzyx = U[0].xyz.yzyx;
+  uint4 yzyy = U[0].xyz.yzyy;
+  uint4 yzyz = U[0].xyz.yzyz;
+  uint4 yzzx = U[0].xyz.yzzx;
+  uint4 yzzy = U[0].xyz.yzzy;
+  uint4 yzzz = U[0].xyz.yzzz;
+  uint4 zxxx = U[0].xyz.zxxx;
+  uint4 zxxy = U[0].xyz.zxxy;
+  uint4 zxxz = U[0].xyz.zxxz;
+  uint4 zxyx = U[0].xyz.zxyx;
+  uint4 zxyy = U[0].xyz.zxyy;
+  uint4 zxyz = U[0].xyz.zxyz;
+  uint4 zxzx = U[0].xyz.zxzx;
+  uint4 zxzy = U[0].xyz.zxzy;
+  uint4 zxzz = U[0].xyz.zxzz;
+  uint4 zyxx = U[0].xyz.zyxx;
+  uint4 zyxy = U[0].xyz.zyxy;
+  uint4 zyxz = U[0].xyz.zyxz;
+  uint4 zyyx = U[0].xyz.zyyx;
+  uint4 zyyy = U[0].xyz.zyyy;
+  uint4 zyyz = U[0].xyz.zyyz;
+  uint4 zyzx = U[0].xyz.zyzx;
+  uint4 zyzy = U[0].xyz.zyzy;
+  uint4 zyzz = U[0].xyz.zyzz;
+  uint4 zzxx = U[0].xyz.zzxx;
+  uint4 zzxy = U[0].xyz.zzxy;
+  uint4 zzxz = U[0].xyz.zzxz;
+  uint4 zzyx = U[0].xyz.zzyx;
+  uint4 zzyy = U[0].xyz.zzyy;
+  uint4 zzyz = U[0].xyz.zzyz;
+  uint4 zzzx = U[0].xyz.zzzx;
+  uint4 zzzy = U[0].xyz.zzzy;
+  uint4 zzzz = U[0].xyz.zzzz;
+}
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..d3ff2d4
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.msl
@@ -0,0 +1,132 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ packed_uint3 v;
+  /* 0x000c */ int8_t tint_pad[4];
+};
+
+void f(constant S& U) {
+  uint3 v = U.v;
+  uint x = U.v[0];
+  uint y = U.v[1];
+  uint z = U.v[2];
+  uint2 xx = uint3(U.v).xx;
+  uint2 xy = uint3(U.v).xy;
+  uint2 xz = uint3(U.v).xz;
+  uint2 yx = uint3(U.v).yx;
+  uint2 yy = uint3(U.v).yy;
+  uint2 yz = uint3(U.v).yz;
+  uint2 zx = uint3(U.v).zx;
+  uint2 zy = uint3(U.v).zy;
+  uint2 zz = uint3(U.v).zz;
+  uint3 xxx = uint3(U.v).xxx;
+  uint3 xxy = uint3(U.v).xxy;
+  uint3 xxz = uint3(U.v).xxz;
+  uint3 xyx = uint3(U.v).xyx;
+  uint3 xyy = uint3(U.v).xyy;
+  uint3 xyz = uint3(U.v).xyz;
+  uint3 xzx = uint3(U.v).xzx;
+  uint3 xzy = uint3(U.v).xzy;
+  uint3 xzz = uint3(U.v).xzz;
+  uint3 yxx = uint3(U.v).yxx;
+  uint3 yxy = uint3(U.v).yxy;
+  uint3 yxz = uint3(U.v).yxz;
+  uint3 yyx = uint3(U.v).yyx;
+  uint3 yyy = uint3(U.v).yyy;
+  uint3 yyz = uint3(U.v).yyz;
+  uint3 yzx = uint3(U.v).yzx;
+  uint3 yzy = uint3(U.v).yzy;
+  uint3 yzz = uint3(U.v).yzz;
+  uint3 zxx = uint3(U.v).zxx;
+  uint3 zxy = uint3(U.v).zxy;
+  uint3 zxz = uint3(U.v).zxz;
+  uint3 zyx = uint3(U.v).zyx;
+  uint3 zyy = uint3(U.v).zyy;
+  uint3 zyz = uint3(U.v).zyz;
+  uint3 zzx = uint3(U.v).zzx;
+  uint3 zzy = uint3(U.v).zzy;
+  uint3 zzz = uint3(U.v).zzz;
+  uint4 xxxx = uint3(U.v).xxxx;
+  uint4 xxxy = uint3(U.v).xxxy;
+  uint4 xxxz = uint3(U.v).xxxz;
+  uint4 xxyx = uint3(U.v).xxyx;
+  uint4 xxyy = uint3(U.v).xxyy;
+  uint4 xxyz = uint3(U.v).xxyz;
+  uint4 xxzx = uint3(U.v).xxzx;
+  uint4 xxzy = uint3(U.v).xxzy;
+  uint4 xxzz = uint3(U.v).xxzz;
+  uint4 xyxx = uint3(U.v).xyxx;
+  uint4 xyxy = uint3(U.v).xyxy;
+  uint4 xyxz = uint3(U.v).xyxz;
+  uint4 xyyx = uint3(U.v).xyyx;
+  uint4 xyyy = uint3(U.v).xyyy;
+  uint4 xyyz = uint3(U.v).xyyz;
+  uint4 xyzx = uint3(U.v).xyzx;
+  uint4 xyzy = uint3(U.v).xyzy;
+  uint4 xyzz = uint3(U.v).xyzz;
+  uint4 xzxx = uint3(U.v).xzxx;
+  uint4 xzxy = uint3(U.v).xzxy;
+  uint4 xzxz = uint3(U.v).xzxz;
+  uint4 xzyx = uint3(U.v).xzyx;
+  uint4 xzyy = uint3(U.v).xzyy;
+  uint4 xzyz = uint3(U.v).xzyz;
+  uint4 xzzx = uint3(U.v).xzzx;
+  uint4 xzzy = uint3(U.v).xzzy;
+  uint4 xzzz = uint3(U.v).xzzz;
+  uint4 yxxx = uint3(U.v).yxxx;
+  uint4 yxxy = uint3(U.v).yxxy;
+  uint4 yxxz = uint3(U.v).yxxz;
+  uint4 yxyx = uint3(U.v).yxyx;
+  uint4 yxyy = uint3(U.v).yxyy;
+  uint4 yxyz = uint3(U.v).yxyz;
+  uint4 yxzx = uint3(U.v).yxzx;
+  uint4 yxzy = uint3(U.v).yxzy;
+  uint4 yxzz = uint3(U.v).yxzz;
+  uint4 yyxx = uint3(U.v).yyxx;
+  uint4 yyxy = uint3(U.v).yyxy;
+  uint4 yyxz = uint3(U.v).yyxz;
+  uint4 yyyx = uint3(U.v).yyyx;
+  uint4 yyyy = uint3(U.v).yyyy;
+  uint4 yyyz = uint3(U.v).yyyz;
+  uint4 yyzx = uint3(U.v).yyzx;
+  uint4 yyzy = uint3(U.v).yyzy;
+  uint4 yyzz = uint3(U.v).yyzz;
+  uint4 yzxx = uint3(U.v).yzxx;
+  uint4 yzxy = uint3(U.v).yzxy;
+  uint4 yzxz = uint3(U.v).yzxz;
+  uint4 yzyx = uint3(U.v).yzyx;
+  uint4 yzyy = uint3(U.v).yzyy;
+  uint4 yzyz = uint3(U.v).yzyz;
+  uint4 yzzx = uint3(U.v).yzzx;
+  uint4 yzzy = uint3(U.v).yzzy;
+  uint4 yzzz = uint3(U.v).yzzz;
+  uint4 zxxx = uint3(U.v).zxxx;
+  uint4 zxxy = uint3(U.v).zxxy;
+  uint4 zxxz = uint3(U.v).zxxz;
+  uint4 zxyx = uint3(U.v).zxyx;
+  uint4 zxyy = uint3(U.v).zxyy;
+  uint4 zxyz = uint3(U.v).zxyz;
+  uint4 zxzx = uint3(U.v).zxzx;
+  uint4 zxzy = uint3(U.v).zxzy;
+  uint4 zxzz = uint3(U.v).zxzz;
+  uint4 zyxx = uint3(U.v).zyxx;
+  uint4 zyxy = uint3(U.v).zyxy;
+  uint4 zyxz = uint3(U.v).zyxz;
+  uint4 zyyx = uint3(U.v).zyyx;
+  uint4 zyyy = uint3(U.v).zyyy;
+  uint4 zyyz = uint3(U.v).zyyz;
+  uint4 zyzx = uint3(U.v).zyzx;
+  uint4 zyzy = uint3(U.v).zyzy;
+  uint4 zyzz = uint3(U.v).zyzz;
+  uint4 zzxx = uint3(U.v).zzxx;
+  uint4 zzxy = uint3(U.v).zzxy;
+  uint4 zzxz = uint3(U.v).zzxz;
+  uint4 zzyx = uint3(U.v).zzyx;
+  uint4 zzyy = uint3(U.v).zzyy;
+  uint4 zzyz = uint3(U.v).zzyz;
+  uint4 zzzx = uint3(U.v).zzzx;
+  uint4 zzzy = uint3(U.v).zzzy;
+  uint4 zzzz = uint3(U.v).zzzz;
+}
+
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.spvasm b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..f38664d
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,771 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 507
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %U "U"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpName %v "v"
+               OpName %x "x"
+               OpName %y "y"
+               OpName %z "z"
+               OpName %xx "xx"
+               OpName %xy "xy"
+               OpName %xz "xz"
+               OpName %yx "yx"
+               OpName %yy "yy"
+               OpName %yz "yz"
+               OpName %zx "zx"
+               OpName %zy "zy"
+               OpName %zz "zz"
+               OpName %xxx "xxx"
+               OpName %xxy "xxy"
+               OpName %xxz "xxz"
+               OpName %xyx "xyx"
+               OpName %xyy "xyy"
+               OpName %xyz "xyz"
+               OpName %xzx "xzx"
+               OpName %xzy "xzy"
+               OpName %xzz "xzz"
+               OpName %yxx "yxx"
+               OpName %yxy "yxy"
+               OpName %yxz "yxz"
+               OpName %yyx "yyx"
+               OpName %yyy "yyy"
+               OpName %yyz "yyz"
+               OpName %yzx "yzx"
+               OpName %yzy "yzy"
+               OpName %yzz "yzz"
+               OpName %zxx "zxx"
+               OpName %zxy "zxy"
+               OpName %zxz "zxz"
+               OpName %zyx "zyx"
+               OpName %zyy "zyy"
+               OpName %zyz "zyz"
+               OpName %zzx "zzx"
+               OpName %zzy "zzy"
+               OpName %zzz "zzz"
+               OpName %xxxx "xxxx"
+               OpName %xxxy "xxxy"
+               OpName %xxxz "xxxz"
+               OpName %xxyx "xxyx"
+               OpName %xxyy "xxyy"
+               OpName %xxyz "xxyz"
+               OpName %xxzx "xxzx"
+               OpName %xxzy "xxzy"
+               OpName %xxzz "xxzz"
+               OpName %xyxx "xyxx"
+               OpName %xyxy "xyxy"
+               OpName %xyxz "xyxz"
+               OpName %xyyx "xyyx"
+               OpName %xyyy "xyyy"
+               OpName %xyyz "xyyz"
+               OpName %xyzx "xyzx"
+               OpName %xyzy "xyzy"
+               OpName %xyzz "xyzz"
+               OpName %xzxx "xzxx"
+               OpName %xzxy "xzxy"
+               OpName %xzxz "xzxz"
+               OpName %xzyx "xzyx"
+               OpName %xzyy "xzyy"
+               OpName %xzyz "xzyz"
+               OpName %xzzx "xzzx"
+               OpName %xzzy "xzzy"
+               OpName %xzzz "xzzz"
+               OpName %yxxx "yxxx"
+               OpName %yxxy "yxxy"
+               OpName %yxxz "yxxz"
+               OpName %yxyx "yxyx"
+               OpName %yxyy "yxyy"
+               OpName %yxyz "yxyz"
+               OpName %yxzx "yxzx"
+               OpName %yxzy "yxzy"
+               OpName %yxzz "yxzz"
+               OpName %yyxx "yyxx"
+               OpName %yyxy "yyxy"
+               OpName %yyxz "yyxz"
+               OpName %yyyx "yyyx"
+               OpName %yyyy "yyyy"
+               OpName %yyyz "yyyz"
+               OpName %yyzx "yyzx"
+               OpName %yyzy "yyzy"
+               OpName %yyzz "yyzz"
+               OpName %yzxx "yzxx"
+               OpName %yzxy "yzxy"
+               OpName %yzxz "yzxz"
+               OpName %yzyx "yzyx"
+               OpName %yzyy "yzyy"
+               OpName %yzyz "yzyz"
+               OpName %yzzx "yzzx"
+               OpName %yzzy "yzzy"
+               OpName %yzzz "yzzz"
+               OpName %zxxx "zxxx"
+               OpName %zxxy "zxxy"
+               OpName %zxxz "zxxz"
+               OpName %zxyx "zxyx"
+               OpName %zxyy "zxyy"
+               OpName %zxyz "zxyz"
+               OpName %zxzx "zxzx"
+               OpName %zxzy "zxzy"
+               OpName %zxzz "zxzz"
+               OpName %zyxx "zyxx"
+               OpName %zyxy "zyxy"
+               OpName %zyxz "zyxz"
+               OpName %zyyx "zyyx"
+               OpName %zyyy "zyyy"
+               OpName %zyyz "zyyz"
+               OpName %zyzx "zyzx"
+               OpName %zyzy "zyzy"
+               OpName %zyzz "zyzz"
+               OpName %zzxx "zzxx"
+               OpName %zzxy "zzxy"
+               OpName %zzxz "zzxz"
+               OpName %zzyx "zzyx"
+               OpName %zzyy "zzyy"
+               OpName %zzyz "zzyz"
+               OpName %zzzx "zzzx"
+               OpName %zzzy "zzzy"
+               OpName %zzzz "zzzz"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %U NonWritable
+               OpDecorate %U DescriptorSet 0
+               OpDecorate %U Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+          %S = OpTypeStruct %v3uint
+%_ptr_Uniform_S = OpTypePointer Uniform %S
+          %U = OpVariable %_ptr_Uniform_S Uniform
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Uniform_v3uint = OpTypePointer Uniform %v3uint
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+         %18 = OpConstantNull %v3uint
+%_ptr_Uniform_uint = OpTypePointer Uniform %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %24 = OpConstantNull %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+         %39 = OpConstantNull %v2uint
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+        %186 = OpConstantNull %v4uint
+%unused_entry_point = OpFunction %void None %6
+          %9 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %6
+         %11 = OpLabel
+          %v = OpVariable %_ptr_Function_v3uint Function %18
+          %x = OpVariable %_ptr_Function_uint Function %24
+          %y = OpVariable %_ptr_Function_uint Function %24
+          %z = OpVariable %_ptr_Function_uint Function %24
+         %xx = OpVariable %_ptr_Function_v2uint Function %39
+         %xy = OpVariable %_ptr_Function_v2uint Function %39
+         %xz = OpVariable %_ptr_Function_v2uint Function %39
+         %yx = OpVariable %_ptr_Function_v2uint Function %39
+         %yy = OpVariable %_ptr_Function_v2uint Function %39
+         %yz = OpVariable %_ptr_Function_v2uint Function %39
+         %zx = OpVariable %_ptr_Function_v2uint Function %39
+         %zy = OpVariable %_ptr_Function_v2uint Function %39
+         %zz = OpVariable %_ptr_Function_v2uint Function %39
+        %xxx = OpVariable %_ptr_Function_v3uint Function %18
+        %xxy = OpVariable %_ptr_Function_v3uint Function %18
+        %xxz = OpVariable %_ptr_Function_v3uint Function %18
+        %xyx = OpVariable %_ptr_Function_v3uint Function %18
+        %xyy = OpVariable %_ptr_Function_v3uint Function %18
+        %xyz = OpVariable %_ptr_Function_v3uint Function %18
+        %xzx = OpVariable %_ptr_Function_v3uint Function %18
+        %xzy = OpVariable %_ptr_Function_v3uint Function %18
+        %xzz = OpVariable %_ptr_Function_v3uint Function %18
+        %yxx = OpVariable %_ptr_Function_v3uint Function %18
+        %yxy = OpVariable %_ptr_Function_v3uint Function %18
+        %yxz = OpVariable %_ptr_Function_v3uint Function %18
+        %yyx = OpVariable %_ptr_Function_v3uint Function %18
+        %yyy = OpVariable %_ptr_Function_v3uint Function %18
+        %yyz = OpVariable %_ptr_Function_v3uint Function %18
+        %yzx = OpVariable %_ptr_Function_v3uint Function %18
+        %yzy = OpVariable %_ptr_Function_v3uint Function %18
+        %yzz = OpVariable %_ptr_Function_v3uint Function %18
+        %zxx = OpVariable %_ptr_Function_v3uint Function %18
+        %zxy = OpVariable %_ptr_Function_v3uint Function %18
+        %zxz = OpVariable %_ptr_Function_v3uint Function %18
+        %zyx = OpVariable %_ptr_Function_v3uint Function %18
+        %zyy = OpVariable %_ptr_Function_v3uint Function %18
+        %zyz = OpVariable %_ptr_Function_v3uint Function %18
+        %zzx = OpVariable %_ptr_Function_v3uint Function %18
+        %zzy = OpVariable %_ptr_Function_v3uint Function %18
+        %zzz = OpVariable %_ptr_Function_v3uint Function %18
+       %xxxx = OpVariable %_ptr_Function_v4uint Function %186
+       %xxxy = OpVariable %_ptr_Function_v4uint Function %186
+       %xxxz = OpVariable %_ptr_Function_v4uint Function %186
+       %xxyx = OpVariable %_ptr_Function_v4uint Function %186
+       %xxyy = OpVariable %_ptr_Function_v4uint Function %186
+       %xxyz = OpVariable %_ptr_Function_v4uint Function %186
+       %xxzx = OpVariable %_ptr_Function_v4uint Function %186
+       %xxzy = OpVariable %_ptr_Function_v4uint Function %186
+       %xxzz = OpVariable %_ptr_Function_v4uint Function %186
+       %xyxx = OpVariable %_ptr_Function_v4uint Function %186
+       %xyxy = OpVariable %_ptr_Function_v4uint Function %186
+       %xyxz = OpVariable %_ptr_Function_v4uint Function %186
+       %xyyx = OpVariable %_ptr_Function_v4uint Function %186
+       %xyyy = OpVariable %_ptr_Function_v4uint Function %186
+       %xyyz = OpVariable %_ptr_Function_v4uint Function %186
+       %xyzx = OpVariable %_ptr_Function_v4uint Function %186
+       %xyzy = OpVariable %_ptr_Function_v4uint Function %186
+       %xyzz = OpVariable %_ptr_Function_v4uint Function %186
+       %xzxx = OpVariable %_ptr_Function_v4uint Function %186
+       %xzxy = OpVariable %_ptr_Function_v4uint Function %186
+       %xzxz = OpVariable %_ptr_Function_v4uint Function %186
+       %xzyx = OpVariable %_ptr_Function_v4uint Function %186
+       %xzyy = OpVariable %_ptr_Function_v4uint Function %186
+       %xzyz = OpVariable %_ptr_Function_v4uint Function %186
+       %xzzx = OpVariable %_ptr_Function_v4uint Function %186
+       %xzzy = OpVariable %_ptr_Function_v4uint Function %186
+       %xzzz = OpVariable %_ptr_Function_v4uint Function %186
+       %yxxx = OpVariable %_ptr_Function_v4uint Function %186
+       %yxxy = OpVariable %_ptr_Function_v4uint Function %186
+       %yxxz = OpVariable %_ptr_Function_v4uint Function %186
+       %yxyx = OpVariable %_ptr_Function_v4uint Function %186
+       %yxyy = OpVariable %_ptr_Function_v4uint Function %186
+       %yxyz = OpVariable %_ptr_Function_v4uint Function %186
+       %yxzx = OpVariable %_ptr_Function_v4uint Function %186
+       %yxzy = OpVariable %_ptr_Function_v4uint Function %186
+       %yxzz = OpVariable %_ptr_Function_v4uint Function %186
+       %yyxx = OpVariable %_ptr_Function_v4uint Function %186
+       %yyxy = OpVariable %_ptr_Function_v4uint Function %186
+       %yyxz = OpVariable %_ptr_Function_v4uint Function %186
+       %yyyx = OpVariable %_ptr_Function_v4uint Function %186
+       %yyyy = OpVariable %_ptr_Function_v4uint Function %186
+       %yyyz = OpVariable %_ptr_Function_v4uint Function %186
+       %yyzx = OpVariable %_ptr_Function_v4uint Function %186
+       %yyzy = OpVariable %_ptr_Function_v4uint Function %186
+       %yyzz = OpVariable %_ptr_Function_v4uint Function %186
+       %yzxx = OpVariable %_ptr_Function_v4uint Function %186
+       %yzxy = OpVariable %_ptr_Function_v4uint Function %186
+       %yzxz = OpVariable %_ptr_Function_v4uint Function %186
+       %yzyx = OpVariable %_ptr_Function_v4uint Function %186
+       %yzyy = OpVariable %_ptr_Function_v4uint Function %186
+       %yzyz = OpVariable %_ptr_Function_v4uint Function %186
+       %yzzx = OpVariable %_ptr_Function_v4uint Function %186
+       %yzzy = OpVariable %_ptr_Function_v4uint Function %186
+       %yzzz = OpVariable %_ptr_Function_v4uint Function %186
+       %zxxx = OpVariable %_ptr_Function_v4uint Function %186
+       %zxxy = OpVariable %_ptr_Function_v4uint Function %186
+       %zxxz = OpVariable %_ptr_Function_v4uint Function %186
+       %zxyx = OpVariable %_ptr_Function_v4uint Function %186
+       %zxyy = OpVariable %_ptr_Function_v4uint Function %186
+       %zxyz = OpVariable %_ptr_Function_v4uint Function %186
+       %zxzx = OpVariable %_ptr_Function_v4uint Function %186
+       %zxzy = OpVariable %_ptr_Function_v4uint Function %186
+       %zxzz = OpVariable %_ptr_Function_v4uint Function %186
+       %zyxx = OpVariable %_ptr_Function_v4uint Function %186
+       %zyxy = OpVariable %_ptr_Function_v4uint Function %186
+       %zyxz = OpVariable %_ptr_Function_v4uint Function %186
+       %zyyx = OpVariable %_ptr_Function_v4uint Function %186
+       %zyyy = OpVariable %_ptr_Function_v4uint Function %186
+       %zyyz = OpVariable %_ptr_Function_v4uint Function %186
+       %zyzx = OpVariable %_ptr_Function_v4uint Function %186
+       %zyzy = OpVariable %_ptr_Function_v4uint Function %186
+       %zyzz = OpVariable %_ptr_Function_v4uint Function %186
+       %zzxx = OpVariable %_ptr_Function_v4uint Function %186
+       %zzxy = OpVariable %_ptr_Function_v4uint Function %186
+       %zzxz = OpVariable %_ptr_Function_v4uint Function %186
+       %zzyx = OpVariable %_ptr_Function_v4uint Function %186
+       %zzyy = OpVariable %_ptr_Function_v4uint Function %186
+       %zzyz = OpVariable %_ptr_Function_v4uint Function %186
+       %zzzx = OpVariable %_ptr_Function_v4uint Function %186
+       %zzzy = OpVariable %_ptr_Function_v4uint Function %186
+       %zzzz = OpVariable %_ptr_Function_v4uint Function %186
+         %14 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %15 = OpLoad %v3uint %14
+               OpStore %v %15
+         %20 = OpAccessChain %_ptr_Uniform_uint %U %uint_0 %uint_0
+         %21 = OpLoad %uint %20
+               OpStore %x %21
+         %26 = OpAccessChain %_ptr_Uniform_uint %U %uint_0 %uint_1
+         %27 = OpLoad %uint %26
+               OpStore %y %27
+         %30 = OpAccessChain %_ptr_Uniform_uint %U %uint_0 %uint_2
+         %31 = OpLoad %uint %30
+               OpStore %z %31
+         %33 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %35 = OpLoad %v3uint %33
+         %36 = OpVectorShuffle %v2uint %35 %35 0 0
+               OpStore %xx %36
+         %40 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %41 = OpLoad %v3uint %40
+         %42 = OpVectorShuffle %v2uint %41 %41 0 1
+               OpStore %xy %42
+         %44 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %45 = OpLoad %v3uint %44
+         %46 = OpVectorShuffle %v2uint %45 %45 0 2
+               OpStore %xz %46
+         %48 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %49 = OpLoad %v3uint %48
+         %50 = OpVectorShuffle %v2uint %49 %49 1 0
+               OpStore %yx %50
+         %52 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %53 = OpLoad %v3uint %52
+         %54 = OpVectorShuffle %v2uint %53 %53 1 1
+               OpStore %yy %54
+         %56 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %57 = OpLoad %v3uint %56
+         %58 = OpVectorShuffle %v2uint %57 %57 1 2
+               OpStore %yz %58
+         %60 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %61 = OpLoad %v3uint %60
+         %62 = OpVectorShuffle %v2uint %61 %61 2 0
+               OpStore %zx %62
+         %64 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %65 = OpLoad %v3uint %64
+         %66 = OpVectorShuffle %v2uint %65 %65 2 1
+               OpStore %zy %66
+         %68 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %69 = OpLoad %v3uint %68
+         %70 = OpVectorShuffle %v2uint %69 %69 2 2
+               OpStore %zz %70
+         %72 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %73 = OpLoad %v3uint %72
+         %74 = OpVectorShuffle %v3uint %73 %73 0 0 0
+               OpStore %xxx %74
+         %76 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %77 = OpLoad %v3uint %76
+         %78 = OpVectorShuffle %v3uint %77 %77 0 0 1
+               OpStore %xxy %78
+         %80 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %81 = OpLoad %v3uint %80
+         %82 = OpVectorShuffle %v3uint %81 %81 0 0 2
+               OpStore %xxz %82
+         %84 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %85 = OpLoad %v3uint %84
+         %86 = OpVectorShuffle %v3uint %85 %85 0 1 0
+               OpStore %xyx %86
+         %88 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %89 = OpLoad %v3uint %88
+         %90 = OpVectorShuffle %v3uint %89 %89 0 1 1
+               OpStore %xyy %90
+         %92 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %93 = OpLoad %v3uint %92
+         %94 = OpVectorShuffle %v3uint %93 %93 0 1 2
+               OpStore %xyz %94
+         %96 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+         %97 = OpLoad %v3uint %96
+         %98 = OpVectorShuffle %v3uint %97 %97 0 2 0
+               OpStore %xzx %98
+        %100 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %101 = OpLoad %v3uint %100
+        %102 = OpVectorShuffle %v3uint %101 %101 0 2 1
+               OpStore %xzy %102
+        %104 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %105 = OpLoad %v3uint %104
+        %106 = OpVectorShuffle %v3uint %105 %105 0 2 2
+               OpStore %xzz %106
+        %108 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %109 = OpLoad %v3uint %108
+        %110 = OpVectorShuffle %v3uint %109 %109 1 0 0
+               OpStore %yxx %110
+        %112 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %113 = OpLoad %v3uint %112
+        %114 = OpVectorShuffle %v3uint %113 %113 1 0 1
+               OpStore %yxy %114
+        %116 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %117 = OpLoad %v3uint %116
+        %118 = OpVectorShuffle %v3uint %117 %117 1 0 2
+               OpStore %yxz %118
+        %120 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %121 = OpLoad %v3uint %120
+        %122 = OpVectorShuffle %v3uint %121 %121 1 1 0
+               OpStore %yyx %122
+        %124 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %125 = OpLoad %v3uint %124
+        %126 = OpVectorShuffle %v3uint %125 %125 1 1 1
+               OpStore %yyy %126
+        %128 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %129 = OpLoad %v3uint %128
+        %130 = OpVectorShuffle %v3uint %129 %129 1 1 2
+               OpStore %yyz %130
+        %132 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %133 = OpLoad %v3uint %132
+        %134 = OpVectorShuffle %v3uint %133 %133 1 2 0
+               OpStore %yzx %134
+        %136 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %137 = OpLoad %v3uint %136
+        %138 = OpVectorShuffle %v3uint %137 %137 1 2 1
+               OpStore %yzy %138
+        %140 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %141 = OpLoad %v3uint %140
+        %142 = OpVectorShuffle %v3uint %141 %141 1 2 2
+               OpStore %yzz %142
+        %144 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %145 = OpLoad %v3uint %144
+        %146 = OpVectorShuffle %v3uint %145 %145 2 0 0
+               OpStore %zxx %146
+        %148 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %149 = OpLoad %v3uint %148
+        %150 = OpVectorShuffle %v3uint %149 %149 2 0 1
+               OpStore %zxy %150
+        %152 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %153 = OpLoad %v3uint %152
+        %154 = OpVectorShuffle %v3uint %153 %153 2 0 2
+               OpStore %zxz %154
+        %156 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %157 = OpLoad %v3uint %156
+        %158 = OpVectorShuffle %v3uint %157 %157 2 1 0
+               OpStore %zyx %158
+        %160 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %161 = OpLoad %v3uint %160
+        %162 = OpVectorShuffle %v3uint %161 %161 2 1 1
+               OpStore %zyy %162
+        %164 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %165 = OpLoad %v3uint %164
+        %166 = OpVectorShuffle %v3uint %165 %165 2 1 2
+               OpStore %zyz %166
+        %168 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %169 = OpLoad %v3uint %168
+        %170 = OpVectorShuffle %v3uint %169 %169 2 2 0
+               OpStore %zzx %170
+        %172 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %173 = OpLoad %v3uint %172
+        %174 = OpVectorShuffle %v3uint %173 %173 2 2 1
+               OpStore %zzy %174
+        %176 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %177 = OpLoad %v3uint %176
+        %178 = OpVectorShuffle %v3uint %177 %177 2 2 2
+               OpStore %zzz %178
+        %180 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %182 = OpLoad %v3uint %180
+        %183 = OpVectorShuffle %v4uint %182 %182 0 0 0 0
+               OpStore %xxxx %183
+        %187 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %188 = OpLoad %v3uint %187
+        %189 = OpVectorShuffle %v4uint %188 %188 0 0 0 1
+               OpStore %xxxy %189
+        %191 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %192 = OpLoad %v3uint %191
+        %193 = OpVectorShuffle %v4uint %192 %192 0 0 0 2
+               OpStore %xxxz %193
+        %195 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %196 = OpLoad %v3uint %195
+        %197 = OpVectorShuffle %v4uint %196 %196 0 0 1 0
+               OpStore %xxyx %197
+        %199 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %200 = OpLoad %v3uint %199
+        %201 = OpVectorShuffle %v4uint %200 %200 0 0 1 1
+               OpStore %xxyy %201
+        %203 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %204 = OpLoad %v3uint %203
+        %205 = OpVectorShuffle %v4uint %204 %204 0 0 1 2
+               OpStore %xxyz %205
+        %207 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %208 = OpLoad %v3uint %207
+        %209 = OpVectorShuffle %v4uint %208 %208 0 0 2 0
+               OpStore %xxzx %209
+        %211 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %212 = OpLoad %v3uint %211
+        %213 = OpVectorShuffle %v4uint %212 %212 0 0 2 1
+               OpStore %xxzy %213
+        %215 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %216 = OpLoad %v3uint %215
+        %217 = OpVectorShuffle %v4uint %216 %216 0 0 2 2
+               OpStore %xxzz %217
+        %219 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %220 = OpLoad %v3uint %219
+        %221 = OpVectorShuffle %v4uint %220 %220 0 1 0 0
+               OpStore %xyxx %221
+        %223 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %224 = OpLoad %v3uint %223
+        %225 = OpVectorShuffle %v4uint %224 %224 0 1 0 1
+               OpStore %xyxy %225
+        %227 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %228 = OpLoad %v3uint %227
+        %229 = OpVectorShuffle %v4uint %228 %228 0 1 0 2
+               OpStore %xyxz %229
+        %231 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %232 = OpLoad %v3uint %231
+        %233 = OpVectorShuffle %v4uint %232 %232 0 1 1 0
+               OpStore %xyyx %233
+        %235 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %236 = OpLoad %v3uint %235
+        %237 = OpVectorShuffle %v4uint %236 %236 0 1 1 1
+               OpStore %xyyy %237
+        %239 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %240 = OpLoad %v3uint %239
+        %241 = OpVectorShuffle %v4uint %240 %240 0 1 1 2
+               OpStore %xyyz %241
+        %243 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %244 = OpLoad %v3uint %243
+        %245 = OpVectorShuffle %v4uint %244 %244 0 1 2 0
+               OpStore %xyzx %245
+        %247 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %248 = OpLoad %v3uint %247
+        %249 = OpVectorShuffle %v4uint %248 %248 0 1 2 1
+               OpStore %xyzy %249
+        %251 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %252 = OpLoad %v3uint %251
+        %253 = OpVectorShuffle %v4uint %252 %252 0 1 2 2
+               OpStore %xyzz %253
+        %255 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %256 = OpLoad %v3uint %255
+        %257 = OpVectorShuffle %v4uint %256 %256 0 2 0 0
+               OpStore %xzxx %257
+        %259 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %260 = OpLoad %v3uint %259
+        %261 = OpVectorShuffle %v4uint %260 %260 0 2 0 1
+               OpStore %xzxy %261
+        %263 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %264 = OpLoad %v3uint %263
+        %265 = OpVectorShuffle %v4uint %264 %264 0 2 0 2
+               OpStore %xzxz %265
+        %267 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %268 = OpLoad %v3uint %267
+        %269 = OpVectorShuffle %v4uint %268 %268 0 2 1 0
+               OpStore %xzyx %269
+        %271 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %272 = OpLoad %v3uint %271
+        %273 = OpVectorShuffle %v4uint %272 %272 0 2 1 1
+               OpStore %xzyy %273
+        %275 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %276 = OpLoad %v3uint %275
+        %277 = OpVectorShuffle %v4uint %276 %276 0 2 1 2
+               OpStore %xzyz %277
+        %279 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %280 = OpLoad %v3uint %279
+        %281 = OpVectorShuffle %v4uint %280 %280 0 2 2 0
+               OpStore %xzzx %281
+        %283 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %284 = OpLoad %v3uint %283
+        %285 = OpVectorShuffle %v4uint %284 %284 0 2 2 1
+               OpStore %xzzy %285
+        %287 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %288 = OpLoad %v3uint %287
+        %289 = OpVectorShuffle %v4uint %288 %288 0 2 2 2
+               OpStore %xzzz %289
+        %291 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %292 = OpLoad %v3uint %291
+        %293 = OpVectorShuffle %v4uint %292 %292 1 0 0 0
+               OpStore %yxxx %293
+        %295 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %296 = OpLoad %v3uint %295
+        %297 = OpVectorShuffle %v4uint %296 %296 1 0 0 1
+               OpStore %yxxy %297
+        %299 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %300 = OpLoad %v3uint %299
+        %301 = OpVectorShuffle %v4uint %300 %300 1 0 0 2
+               OpStore %yxxz %301
+        %303 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %304 = OpLoad %v3uint %303
+        %305 = OpVectorShuffle %v4uint %304 %304 1 0 1 0
+               OpStore %yxyx %305
+        %307 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %308 = OpLoad %v3uint %307
+        %309 = OpVectorShuffle %v4uint %308 %308 1 0 1 1
+               OpStore %yxyy %309
+        %311 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %312 = OpLoad %v3uint %311
+        %313 = OpVectorShuffle %v4uint %312 %312 1 0 1 2
+               OpStore %yxyz %313
+        %315 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %316 = OpLoad %v3uint %315
+        %317 = OpVectorShuffle %v4uint %316 %316 1 0 2 0
+               OpStore %yxzx %317
+        %319 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %320 = OpLoad %v3uint %319
+        %321 = OpVectorShuffle %v4uint %320 %320 1 0 2 1
+               OpStore %yxzy %321
+        %323 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %324 = OpLoad %v3uint %323
+        %325 = OpVectorShuffle %v4uint %324 %324 1 0 2 2
+               OpStore %yxzz %325
+        %327 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %328 = OpLoad %v3uint %327
+        %329 = OpVectorShuffle %v4uint %328 %328 1 1 0 0
+               OpStore %yyxx %329
+        %331 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %332 = OpLoad %v3uint %331
+        %333 = OpVectorShuffle %v4uint %332 %332 1 1 0 1
+               OpStore %yyxy %333
+        %335 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %336 = OpLoad %v3uint %335
+        %337 = OpVectorShuffle %v4uint %336 %336 1 1 0 2
+               OpStore %yyxz %337
+        %339 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %340 = OpLoad %v3uint %339
+        %341 = OpVectorShuffle %v4uint %340 %340 1 1 1 0
+               OpStore %yyyx %341
+        %343 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %344 = OpLoad %v3uint %343
+        %345 = OpVectorShuffle %v4uint %344 %344 1 1 1 1
+               OpStore %yyyy %345
+        %347 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %348 = OpLoad %v3uint %347
+        %349 = OpVectorShuffle %v4uint %348 %348 1 1 1 2
+               OpStore %yyyz %349
+        %351 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %352 = OpLoad %v3uint %351
+        %353 = OpVectorShuffle %v4uint %352 %352 1 1 2 0
+               OpStore %yyzx %353
+        %355 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %356 = OpLoad %v3uint %355
+        %357 = OpVectorShuffle %v4uint %356 %356 1 1 2 1
+               OpStore %yyzy %357
+        %359 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %360 = OpLoad %v3uint %359
+        %361 = OpVectorShuffle %v4uint %360 %360 1 1 2 2
+               OpStore %yyzz %361
+        %363 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %364 = OpLoad %v3uint %363
+        %365 = OpVectorShuffle %v4uint %364 %364 1 2 0 0
+               OpStore %yzxx %365
+        %367 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %368 = OpLoad %v3uint %367
+        %369 = OpVectorShuffle %v4uint %368 %368 1 2 0 1
+               OpStore %yzxy %369
+        %371 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %372 = OpLoad %v3uint %371
+        %373 = OpVectorShuffle %v4uint %372 %372 1 2 0 2
+               OpStore %yzxz %373
+        %375 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %376 = OpLoad %v3uint %375
+        %377 = OpVectorShuffle %v4uint %376 %376 1 2 1 0
+               OpStore %yzyx %377
+        %379 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %380 = OpLoad %v3uint %379
+        %381 = OpVectorShuffle %v4uint %380 %380 1 2 1 1
+               OpStore %yzyy %381
+        %383 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %384 = OpLoad %v3uint %383
+        %385 = OpVectorShuffle %v4uint %384 %384 1 2 1 2
+               OpStore %yzyz %385
+        %387 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %388 = OpLoad %v3uint %387
+        %389 = OpVectorShuffle %v4uint %388 %388 1 2 2 0
+               OpStore %yzzx %389
+        %391 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %392 = OpLoad %v3uint %391
+        %393 = OpVectorShuffle %v4uint %392 %392 1 2 2 1
+               OpStore %yzzy %393
+        %395 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %396 = OpLoad %v3uint %395
+        %397 = OpVectorShuffle %v4uint %396 %396 1 2 2 2
+               OpStore %yzzz %397
+        %399 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %400 = OpLoad %v3uint %399
+        %401 = OpVectorShuffle %v4uint %400 %400 2 0 0 0
+               OpStore %zxxx %401
+        %403 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %404 = OpLoad %v3uint %403
+        %405 = OpVectorShuffle %v4uint %404 %404 2 0 0 1
+               OpStore %zxxy %405
+        %407 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %408 = OpLoad %v3uint %407
+        %409 = OpVectorShuffle %v4uint %408 %408 2 0 0 2
+               OpStore %zxxz %409
+        %411 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %412 = OpLoad %v3uint %411
+        %413 = OpVectorShuffle %v4uint %412 %412 2 0 1 0
+               OpStore %zxyx %413
+        %415 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %416 = OpLoad %v3uint %415
+        %417 = OpVectorShuffle %v4uint %416 %416 2 0 1 1
+               OpStore %zxyy %417
+        %419 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %420 = OpLoad %v3uint %419
+        %421 = OpVectorShuffle %v4uint %420 %420 2 0 1 2
+               OpStore %zxyz %421
+        %423 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %424 = OpLoad %v3uint %423
+        %425 = OpVectorShuffle %v4uint %424 %424 2 0 2 0
+               OpStore %zxzx %425
+        %427 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %428 = OpLoad %v3uint %427
+        %429 = OpVectorShuffle %v4uint %428 %428 2 0 2 1
+               OpStore %zxzy %429
+        %431 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %432 = OpLoad %v3uint %431
+        %433 = OpVectorShuffle %v4uint %432 %432 2 0 2 2
+               OpStore %zxzz %433
+        %435 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %436 = OpLoad %v3uint %435
+        %437 = OpVectorShuffle %v4uint %436 %436 2 1 0 0
+               OpStore %zyxx %437
+        %439 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %440 = OpLoad %v3uint %439
+        %441 = OpVectorShuffle %v4uint %440 %440 2 1 0 1
+               OpStore %zyxy %441
+        %443 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %444 = OpLoad %v3uint %443
+        %445 = OpVectorShuffle %v4uint %444 %444 2 1 0 2
+               OpStore %zyxz %445
+        %447 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %448 = OpLoad %v3uint %447
+        %449 = OpVectorShuffle %v4uint %448 %448 2 1 1 0
+               OpStore %zyyx %449
+        %451 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %452 = OpLoad %v3uint %451
+        %453 = OpVectorShuffle %v4uint %452 %452 2 1 1 1
+               OpStore %zyyy %453
+        %455 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %456 = OpLoad %v3uint %455
+        %457 = OpVectorShuffle %v4uint %456 %456 2 1 1 2
+               OpStore %zyyz %457
+        %459 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %460 = OpLoad %v3uint %459
+        %461 = OpVectorShuffle %v4uint %460 %460 2 1 2 0
+               OpStore %zyzx %461
+        %463 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %464 = OpLoad %v3uint %463
+        %465 = OpVectorShuffle %v4uint %464 %464 2 1 2 1
+               OpStore %zyzy %465
+        %467 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %468 = OpLoad %v3uint %467
+        %469 = OpVectorShuffle %v4uint %468 %468 2 1 2 2
+               OpStore %zyzz %469
+        %471 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %472 = OpLoad %v3uint %471
+        %473 = OpVectorShuffle %v4uint %472 %472 2 2 0 0
+               OpStore %zzxx %473
+        %475 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %476 = OpLoad %v3uint %475
+        %477 = OpVectorShuffle %v4uint %476 %476 2 2 0 1
+               OpStore %zzxy %477
+        %479 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %480 = OpLoad %v3uint %479
+        %481 = OpVectorShuffle %v4uint %480 %480 2 2 0 2
+               OpStore %zzxz %481
+        %483 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %484 = OpLoad %v3uint %483
+        %485 = OpVectorShuffle %v4uint %484 %484 2 2 1 0
+               OpStore %zzyx %485
+        %487 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %488 = OpLoad %v3uint %487
+        %489 = OpVectorShuffle %v4uint %488 %488 2 2 1 1
+               OpStore %zzyy %489
+        %491 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %492 = OpLoad %v3uint %491
+        %493 = OpVectorShuffle %v4uint %492 %492 2 2 1 2
+               OpStore %zzyz %493
+        %495 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %496 = OpLoad %v3uint %495
+        %497 = OpVectorShuffle %v4uint %496 %496 2 2 2 0
+               OpStore %zzzx %497
+        %499 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %500 = OpLoad %v3uint %499
+        %501 = OpVectorShuffle %v4uint %500 %500 2 2 2 1
+               OpStore %zzzy %501
+        %503 = OpAccessChain %_ptr_Uniform_v3uint %U %uint_0
+        %504 = OpLoad %v3uint %503
+        %505 = OpVectorShuffle %v4uint %504 %504 2 2 2 2
+               OpStore %zzzz %505
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..96b7263
--- /dev/null
+++ b/test/expressions/swizzle/read/packed_vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,130 @@
+[[block]]
+struct S {
+  v : vec3<u32>;
+};
+
+[[group(0), binding(0)]] var<uniform> U : S;
+
+fn f() {
+  var v = U.v;
+  var x = U.v.x;
+  var y = U.v.y;
+  var z = U.v.z;
+  var xx = U.v.xx;
+  var xy = U.v.xy;
+  var xz = U.v.xz;
+  var yx = U.v.yx;
+  var yy = U.v.yy;
+  var yz = U.v.yz;
+  var zx = U.v.zx;
+  var zy = U.v.zy;
+  var zz = U.v.zz;
+  var xxx = U.v.xxx;
+  var xxy = U.v.xxy;
+  var xxz = U.v.xxz;
+  var xyx = U.v.xyx;
+  var xyy = U.v.xyy;
+  var xyz = U.v.xyz;
+  var xzx = U.v.xzx;
+  var xzy = U.v.xzy;
+  var xzz = U.v.xzz;
+  var yxx = U.v.yxx;
+  var yxy = U.v.yxy;
+  var yxz = U.v.yxz;
+  var yyx = U.v.yyx;
+  var yyy = U.v.yyy;
+  var yyz = U.v.yyz;
+  var yzx = U.v.yzx;
+  var yzy = U.v.yzy;
+  var yzz = U.v.yzz;
+  var zxx = U.v.zxx;
+  var zxy = U.v.zxy;
+  var zxz = U.v.zxz;
+  var zyx = U.v.zyx;
+  var zyy = U.v.zyy;
+  var zyz = U.v.zyz;
+  var zzx = U.v.zzx;
+  var zzy = U.v.zzy;
+  var zzz = U.v.zzz;
+  var xxxx = U.v.xxxx;
+  var xxxy = U.v.xxxy;
+  var xxxz = U.v.xxxz;
+  var xxyx = U.v.xxyx;
+  var xxyy = U.v.xxyy;
+  var xxyz = U.v.xxyz;
+  var xxzx = U.v.xxzx;
+  var xxzy = U.v.xxzy;
+  var xxzz = U.v.xxzz;
+  var xyxx = U.v.xyxx;
+  var xyxy = U.v.xyxy;
+  var xyxz = U.v.xyxz;
+  var xyyx = U.v.xyyx;
+  var xyyy = U.v.xyyy;
+  var xyyz = U.v.xyyz;
+  var xyzx = U.v.xyzx;
+  var xyzy = U.v.xyzy;
+  var xyzz = U.v.xyzz;
+  var xzxx = U.v.xzxx;
+  var xzxy = U.v.xzxy;
+  var xzxz = U.v.xzxz;
+  var xzyx = U.v.xzyx;
+  var xzyy = U.v.xzyy;
+  var xzyz = U.v.xzyz;
+  var xzzx = U.v.xzzx;
+  var xzzy = U.v.xzzy;
+  var xzzz = U.v.xzzz;
+  var yxxx = U.v.yxxx;
+  var yxxy = U.v.yxxy;
+  var yxxz = U.v.yxxz;
+  var yxyx = U.v.yxyx;
+  var yxyy = U.v.yxyy;
+  var yxyz = U.v.yxyz;
+  var yxzx = U.v.yxzx;
+  var yxzy = U.v.yxzy;
+  var yxzz = U.v.yxzz;
+  var yyxx = U.v.yyxx;
+  var yyxy = U.v.yyxy;
+  var yyxz = U.v.yyxz;
+  var yyyx = U.v.yyyx;
+  var yyyy = U.v.yyyy;
+  var yyyz = U.v.yyyz;
+  var yyzx = U.v.yyzx;
+  var yyzy = U.v.yyzy;
+  var yyzz = U.v.yyzz;
+  var yzxx = U.v.yzxx;
+  var yzxy = U.v.yzxy;
+  var yzxz = U.v.yzxz;
+  var yzyx = U.v.yzyx;
+  var yzyy = U.v.yzyy;
+  var yzyz = U.v.yzyz;
+  var yzzx = U.v.yzzx;
+  var yzzy = U.v.yzzy;
+  var yzzz = U.v.yzzz;
+  var zxxx = U.v.zxxx;
+  var zxxy = U.v.zxxy;
+  var zxxz = U.v.zxxz;
+  var zxyx = U.v.zxyx;
+  var zxyy = U.v.zxyy;
+  var zxyz = U.v.zxyz;
+  var zxzx = U.v.zxzx;
+  var zxzy = U.v.zxzy;
+  var zxzz = U.v.zxzz;
+  var zyxx = U.v.zyxx;
+  var zyxy = U.v.zyxy;
+  var zyxz = U.v.zyxz;
+  var zyyx = U.v.zyyx;
+  var zyyy = U.v.zyyy;
+  var zyyz = U.v.zyyz;
+  var zyzx = U.v.zyzx;
+  var zyzy = U.v.zyzy;
+  var zyzz = U.v.zyzz;
+  var zzxx = U.v.zzxx;
+  var zzxy = U.v.zzxy;
+  var zzxz = U.v.zzxz;
+  var zzyx = U.v.zzyx;
+  var zzyy = U.v.zzyy;
+  var zzyz = U.v.zzyz;
+  var zzzx = U.v.zzzx;
+  var zzzy = U.v.zzzy;
+  var zzzz = U.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/f32.wgsl b/test/expressions/swizzle/read/vec3/f32.wgsl
new file mode 100644
index 0000000..77a78f0
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/f32.wgsl
@@ -0,0 +1,143 @@
+struct S {
+    v: vec3<f32>;
+};
+
+var<private> P : S;
+
+fn f() {
+    var    v = P.v;
+
+    var    x = P.v.x;
+    var    y = P.v.y;
+    var    z = P.v.z;
+
+    var   xx = P.v.xx;
+    var   xy = P.v.xy;
+    var   xz = P.v.xz;
+    var   yx = P.v.yx;
+    var   yy = P.v.yy;
+    var   yz = P.v.yz;
+    var   zx = P.v.zx;
+    var   zy = P.v.zy;
+    var   zz = P.v.zz;
+
+    var  xxx = P.v.xxx;
+    var  xxy = P.v.xxy;
+    var  xxz = P.v.xxz;
+    var  xyx = P.v.xyx;
+    var  xyy = P.v.xyy;
+    var  xyz = P.v.xyz;
+    var  xzx = P.v.xzx;
+    var  xzy = P.v.xzy;
+    var  xzz = P.v.xzz;
+
+    var  yxx = P.v.yxx;
+    var  yxy = P.v.yxy;
+    var  yxz = P.v.yxz;
+    var  yyx = P.v.yyx;
+    var  yyy = P.v.yyy;
+    var  yyz = P.v.yyz;
+    var  yzx = P.v.yzx;
+    var  yzy = P.v.yzy;
+    var  yzz = P.v.yzz;
+
+    var  zxx = P.v.zxx;
+    var  zxy = P.v.zxy;
+    var  zxz = P.v.zxz;
+    var  zyx = P.v.zyx;
+    var  zyy = P.v.zyy;
+    var  zyz = P.v.zyz;
+    var  zzx = P.v.zzx;
+    var  zzy = P.v.zzy;
+    var  zzz = P.v.zzz;
+
+    var xxxx = P.v.xxxx;
+    var xxxy = P.v.xxxy;
+    var xxxz = P.v.xxxz;
+    var xxyx = P.v.xxyx;
+    var xxyy = P.v.xxyy;
+    var xxyz = P.v.xxyz;
+    var xxzx = P.v.xxzx;
+    var xxzy = P.v.xxzy;
+    var xxzz = P.v.xxzz;
+
+    var xyxx = P.v.xyxx;
+    var xyxy = P.v.xyxy;
+    var xyxz = P.v.xyxz;
+    var xyyx = P.v.xyyx;
+    var xyyy = P.v.xyyy;
+    var xyyz = P.v.xyyz;
+    var xyzx = P.v.xyzx;
+    var xyzy = P.v.xyzy;
+    var xyzz = P.v.xyzz;
+
+    var xzxx = P.v.xzxx;
+    var xzxy = P.v.xzxy;
+    var xzxz = P.v.xzxz;
+    var xzyx = P.v.xzyx;
+    var xzyy = P.v.xzyy;
+    var xzyz = P.v.xzyz;
+    var xzzx = P.v.xzzx;
+    var xzzy = P.v.xzzy;
+    var xzzz = P.v.xzzz;
+
+    var yxxx = P.v.yxxx;
+    var yxxy = P.v.yxxy;
+    var yxxz = P.v.yxxz;
+    var yxyx = P.v.yxyx;
+    var yxyy = P.v.yxyy;
+    var yxyz = P.v.yxyz;
+    var yxzx = P.v.yxzx;
+    var yxzy = P.v.yxzy;
+    var yxzz = P.v.yxzz;
+
+    var yyxx = P.v.yyxx;
+    var yyxy = P.v.yyxy;
+    var yyxz = P.v.yyxz;
+    var yyyx = P.v.yyyx;
+    var yyyy = P.v.yyyy;
+    var yyyz = P.v.yyyz;
+    var yyzx = P.v.yyzx;
+    var yyzy = P.v.yyzy;
+    var yyzz = P.v.yyzz;
+
+    var yzxx = P.v.yzxx;
+    var yzxy = P.v.yzxy;
+    var yzxz = P.v.yzxz;
+    var yzyx = P.v.yzyx;
+    var yzyy = P.v.yzyy;
+    var yzyz = P.v.yzyz;
+    var yzzx = P.v.yzzx;
+    var yzzy = P.v.yzzy;
+    var yzzz = P.v.yzzz;
+
+    var zxxx = P.v.zxxx;
+    var zxxy = P.v.zxxy;
+    var zxxz = P.v.zxxz;
+    var zxyx = P.v.zxyx;
+    var zxyy = P.v.zxyy;
+    var zxyz = P.v.zxyz;
+    var zxzx = P.v.zxzx;
+    var zxzy = P.v.zxzy;
+    var zxzz = P.v.zxzz;
+
+    var zyxx = P.v.zyxx;
+    var zyxy = P.v.zyxy;
+    var zyxz = P.v.zyxz;
+    var zyyx = P.v.zyyx;
+    var zyyy = P.v.zyyy;
+    var zyyz = P.v.zyyz;
+    var zyzx = P.v.zyzx;
+    var zyzy = P.v.zyzy;
+    var zyzz = P.v.zyzz;
+
+    var zzxx = P.v.zzxx;
+    var zzxy = P.v.zzxy;
+    var zzxz = P.v.zzxz;
+    var zzyx = P.v.zzyx;
+    var zzyy = P.v.zzyy;
+    var zzyz = P.v.zzyz;
+    var zzzx = P.v.zzzx;
+    var zzzy = P.v.zzzy;
+    var zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/f32.wgsl.expected.hlsl b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..9f65e92
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,134 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+struct S {
+  float3 v;
+};
+
+static S P = (S)0;
+
+void f() {
+  float3 v = P.v;
+  float x = P.v.x;
+  float y = P.v.y;
+  float z = P.v.z;
+  float2 xx = P.v.xx;
+  float2 xy = P.v.xy;
+  float2 xz = P.v.xz;
+  float2 yx = P.v.yx;
+  float2 yy = P.v.yy;
+  float2 yz = P.v.yz;
+  float2 zx = P.v.zx;
+  float2 zy = P.v.zy;
+  float2 zz = P.v.zz;
+  float3 xxx = P.v.xxx;
+  float3 xxy = P.v.xxy;
+  float3 xxz = P.v.xxz;
+  float3 xyx = P.v.xyx;
+  float3 xyy = P.v.xyy;
+  float3 xyz = P.v.xyz;
+  float3 xzx = P.v.xzx;
+  float3 xzy = P.v.xzy;
+  float3 xzz = P.v.xzz;
+  float3 yxx = P.v.yxx;
+  float3 yxy = P.v.yxy;
+  float3 yxz = P.v.yxz;
+  float3 yyx = P.v.yyx;
+  float3 yyy = P.v.yyy;
+  float3 yyz = P.v.yyz;
+  float3 yzx = P.v.yzx;
+  float3 yzy = P.v.yzy;
+  float3 yzz = P.v.yzz;
+  float3 zxx = P.v.zxx;
+  float3 zxy = P.v.zxy;
+  float3 zxz = P.v.zxz;
+  float3 zyx = P.v.zyx;
+  float3 zyy = P.v.zyy;
+  float3 zyz = P.v.zyz;
+  float3 zzx = P.v.zzx;
+  float3 zzy = P.v.zzy;
+  float3 zzz = P.v.zzz;
+  float4 xxxx = P.v.xxxx;
+  float4 xxxy = P.v.xxxy;
+  float4 xxxz = P.v.xxxz;
+  float4 xxyx = P.v.xxyx;
+  float4 xxyy = P.v.xxyy;
+  float4 xxyz = P.v.xxyz;
+  float4 xxzx = P.v.xxzx;
+  float4 xxzy = P.v.xxzy;
+  float4 xxzz = P.v.xxzz;
+  float4 xyxx = P.v.xyxx;
+  float4 xyxy = P.v.xyxy;
+  float4 xyxz = P.v.xyxz;
+  float4 xyyx = P.v.xyyx;
+  float4 xyyy = P.v.xyyy;
+  float4 xyyz = P.v.xyyz;
+  float4 xyzx = P.v.xyzx;
+  float4 xyzy = P.v.xyzy;
+  float4 xyzz = P.v.xyzz;
+  float4 xzxx = P.v.xzxx;
+  float4 xzxy = P.v.xzxy;
+  float4 xzxz = P.v.xzxz;
+  float4 xzyx = P.v.xzyx;
+  float4 xzyy = P.v.xzyy;
+  float4 xzyz = P.v.xzyz;
+  float4 xzzx = P.v.xzzx;
+  float4 xzzy = P.v.xzzy;
+  float4 xzzz = P.v.xzzz;
+  float4 yxxx = P.v.yxxx;
+  float4 yxxy = P.v.yxxy;
+  float4 yxxz = P.v.yxxz;
+  float4 yxyx = P.v.yxyx;
+  float4 yxyy = P.v.yxyy;
+  float4 yxyz = P.v.yxyz;
+  float4 yxzx = P.v.yxzx;
+  float4 yxzy = P.v.yxzy;
+  float4 yxzz = P.v.yxzz;
+  float4 yyxx = P.v.yyxx;
+  float4 yyxy = P.v.yyxy;
+  float4 yyxz = P.v.yyxz;
+  float4 yyyx = P.v.yyyx;
+  float4 yyyy = P.v.yyyy;
+  float4 yyyz = P.v.yyyz;
+  float4 yyzx = P.v.yyzx;
+  float4 yyzy = P.v.yyzy;
+  float4 yyzz = P.v.yyzz;
+  float4 yzxx = P.v.yzxx;
+  float4 yzxy = P.v.yzxy;
+  float4 yzxz = P.v.yzxz;
+  float4 yzyx = P.v.yzyx;
+  float4 yzyy = P.v.yzyy;
+  float4 yzyz = P.v.yzyz;
+  float4 yzzx = P.v.yzzx;
+  float4 yzzy = P.v.yzzy;
+  float4 yzzz = P.v.yzzz;
+  float4 zxxx = P.v.zxxx;
+  float4 zxxy = P.v.zxxy;
+  float4 zxxz = P.v.zxxz;
+  float4 zxyx = P.v.zxyx;
+  float4 zxyy = P.v.zxyy;
+  float4 zxyz = P.v.zxyz;
+  float4 zxzx = P.v.zxzx;
+  float4 zxzy = P.v.zxzy;
+  float4 zxzz = P.v.zxzz;
+  float4 zyxx = P.v.zyxx;
+  float4 zyxy = P.v.zyxy;
+  float4 zyxz = P.v.zyxz;
+  float4 zyyx = P.v.zyyx;
+  float4 zyyy = P.v.zyyy;
+  float4 zyyz = P.v.zyyz;
+  float4 zyzx = P.v.zyzx;
+  float4 zyzy = P.v.zyzy;
+  float4 zyzz = P.v.zyzz;
+  float4 zzxx = P.v.zzxx;
+  float4 zzxy = P.v.zzxy;
+  float4 zzxz = P.v.zzxz;
+  float4 zzyx = P.v.zzyx;
+  float4 zzyy = P.v.zzyy;
+  float4 zzyz = P.v.zzyz;
+  float4 zzzx = P.v.zzzx;
+  float4 zzzy = P.v.zzzy;
+  float4 zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/f32.wgsl.expected.msl b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..85b1790
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.msl
@@ -0,0 +1,131 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  float3 v;
+};
+
+void f(thread S* const tint_symbol) {
+  float3 v = (*(tint_symbol)).v;
+  float x = (*(tint_symbol)).v[0];
+  float y = (*(tint_symbol)).v[1];
+  float z = (*(tint_symbol)).v[2];
+  float2 xx = float3((*(tint_symbol)).v).xx;
+  float2 xy = float3((*(tint_symbol)).v).xy;
+  float2 xz = float3((*(tint_symbol)).v).xz;
+  float2 yx = float3((*(tint_symbol)).v).yx;
+  float2 yy = float3((*(tint_symbol)).v).yy;
+  float2 yz = float3((*(tint_symbol)).v).yz;
+  float2 zx = float3((*(tint_symbol)).v).zx;
+  float2 zy = float3((*(tint_symbol)).v).zy;
+  float2 zz = float3((*(tint_symbol)).v).zz;
+  float3 xxx = float3((*(tint_symbol)).v).xxx;
+  float3 xxy = float3((*(tint_symbol)).v).xxy;
+  float3 xxz = float3((*(tint_symbol)).v).xxz;
+  float3 xyx = float3((*(tint_symbol)).v).xyx;
+  float3 xyy = float3((*(tint_symbol)).v).xyy;
+  float3 xyz = float3((*(tint_symbol)).v).xyz;
+  float3 xzx = float3((*(tint_symbol)).v).xzx;
+  float3 xzy = float3((*(tint_symbol)).v).xzy;
+  float3 xzz = float3((*(tint_symbol)).v).xzz;
+  float3 yxx = float3((*(tint_symbol)).v).yxx;
+  float3 yxy = float3((*(tint_symbol)).v).yxy;
+  float3 yxz = float3((*(tint_symbol)).v).yxz;
+  float3 yyx = float3((*(tint_symbol)).v).yyx;
+  float3 yyy = float3((*(tint_symbol)).v).yyy;
+  float3 yyz = float3((*(tint_symbol)).v).yyz;
+  float3 yzx = float3((*(tint_symbol)).v).yzx;
+  float3 yzy = float3((*(tint_symbol)).v).yzy;
+  float3 yzz = float3((*(tint_symbol)).v).yzz;
+  float3 zxx = float3((*(tint_symbol)).v).zxx;
+  float3 zxy = float3((*(tint_symbol)).v).zxy;
+  float3 zxz = float3((*(tint_symbol)).v).zxz;
+  float3 zyx = float3((*(tint_symbol)).v).zyx;
+  float3 zyy = float3((*(tint_symbol)).v).zyy;
+  float3 zyz = float3((*(tint_symbol)).v).zyz;
+  float3 zzx = float3((*(tint_symbol)).v).zzx;
+  float3 zzy = float3((*(tint_symbol)).v).zzy;
+  float3 zzz = float3((*(tint_symbol)).v).zzz;
+  float4 xxxx = float3((*(tint_symbol)).v).xxxx;
+  float4 xxxy = float3((*(tint_symbol)).v).xxxy;
+  float4 xxxz = float3((*(tint_symbol)).v).xxxz;
+  float4 xxyx = float3((*(tint_symbol)).v).xxyx;
+  float4 xxyy = float3((*(tint_symbol)).v).xxyy;
+  float4 xxyz = float3((*(tint_symbol)).v).xxyz;
+  float4 xxzx = float3((*(tint_symbol)).v).xxzx;
+  float4 xxzy = float3((*(tint_symbol)).v).xxzy;
+  float4 xxzz = float3((*(tint_symbol)).v).xxzz;
+  float4 xyxx = float3((*(tint_symbol)).v).xyxx;
+  float4 xyxy = float3((*(tint_symbol)).v).xyxy;
+  float4 xyxz = float3((*(tint_symbol)).v).xyxz;
+  float4 xyyx = float3((*(tint_symbol)).v).xyyx;
+  float4 xyyy = float3((*(tint_symbol)).v).xyyy;
+  float4 xyyz = float3((*(tint_symbol)).v).xyyz;
+  float4 xyzx = float3((*(tint_symbol)).v).xyzx;
+  float4 xyzy = float3((*(tint_symbol)).v).xyzy;
+  float4 xyzz = float3((*(tint_symbol)).v).xyzz;
+  float4 xzxx = float3((*(tint_symbol)).v).xzxx;
+  float4 xzxy = float3((*(tint_symbol)).v).xzxy;
+  float4 xzxz = float3((*(tint_symbol)).v).xzxz;
+  float4 xzyx = float3((*(tint_symbol)).v).xzyx;
+  float4 xzyy = float3((*(tint_symbol)).v).xzyy;
+  float4 xzyz = float3((*(tint_symbol)).v).xzyz;
+  float4 xzzx = float3((*(tint_symbol)).v).xzzx;
+  float4 xzzy = float3((*(tint_symbol)).v).xzzy;
+  float4 xzzz = float3((*(tint_symbol)).v).xzzz;
+  float4 yxxx = float3((*(tint_symbol)).v).yxxx;
+  float4 yxxy = float3((*(tint_symbol)).v).yxxy;
+  float4 yxxz = float3((*(tint_symbol)).v).yxxz;
+  float4 yxyx = float3((*(tint_symbol)).v).yxyx;
+  float4 yxyy = float3((*(tint_symbol)).v).yxyy;
+  float4 yxyz = float3((*(tint_symbol)).v).yxyz;
+  float4 yxzx = float3((*(tint_symbol)).v).yxzx;
+  float4 yxzy = float3((*(tint_symbol)).v).yxzy;
+  float4 yxzz = float3((*(tint_symbol)).v).yxzz;
+  float4 yyxx = float3((*(tint_symbol)).v).yyxx;
+  float4 yyxy = float3((*(tint_symbol)).v).yyxy;
+  float4 yyxz = float3((*(tint_symbol)).v).yyxz;
+  float4 yyyx = float3((*(tint_symbol)).v).yyyx;
+  float4 yyyy = float3((*(tint_symbol)).v).yyyy;
+  float4 yyyz = float3((*(tint_symbol)).v).yyyz;
+  float4 yyzx = float3((*(tint_symbol)).v).yyzx;
+  float4 yyzy = float3((*(tint_symbol)).v).yyzy;
+  float4 yyzz = float3((*(tint_symbol)).v).yyzz;
+  float4 yzxx = float3((*(tint_symbol)).v).yzxx;
+  float4 yzxy = float3((*(tint_symbol)).v).yzxy;
+  float4 yzxz = float3((*(tint_symbol)).v).yzxz;
+  float4 yzyx = float3((*(tint_symbol)).v).yzyx;
+  float4 yzyy = float3((*(tint_symbol)).v).yzyy;
+  float4 yzyz = float3((*(tint_symbol)).v).yzyz;
+  float4 yzzx = float3((*(tint_symbol)).v).yzzx;
+  float4 yzzy = float3((*(tint_symbol)).v).yzzy;
+  float4 yzzz = float3((*(tint_symbol)).v).yzzz;
+  float4 zxxx = float3((*(tint_symbol)).v).zxxx;
+  float4 zxxy = float3((*(tint_symbol)).v).zxxy;
+  float4 zxxz = float3((*(tint_symbol)).v).zxxz;
+  float4 zxyx = float3((*(tint_symbol)).v).zxyx;
+  float4 zxyy = float3((*(tint_symbol)).v).zxyy;
+  float4 zxyz = float3((*(tint_symbol)).v).zxyz;
+  float4 zxzx = float3((*(tint_symbol)).v).zxzx;
+  float4 zxzy = float3((*(tint_symbol)).v).zxzy;
+  float4 zxzz = float3((*(tint_symbol)).v).zxzz;
+  float4 zyxx = float3((*(tint_symbol)).v).zyxx;
+  float4 zyxy = float3((*(tint_symbol)).v).zyxy;
+  float4 zyxz = float3((*(tint_symbol)).v).zyxz;
+  float4 zyyx = float3((*(tint_symbol)).v).zyyx;
+  float4 zyyy = float3((*(tint_symbol)).v).zyyy;
+  float4 zyyz = float3((*(tint_symbol)).v).zyyz;
+  float4 zyzx = float3((*(tint_symbol)).v).zyzx;
+  float4 zyzy = float3((*(tint_symbol)).v).zyzy;
+  float4 zyzz = float3((*(tint_symbol)).v).zyzz;
+  float4 zzxx = float3((*(tint_symbol)).v).zzxx;
+  float4 zzxy = float3((*(tint_symbol)).v).zzxy;
+  float4 zzxz = float3((*(tint_symbol)).v).zzxz;
+  float4 zzyx = float3((*(tint_symbol)).v).zzyx;
+  float4 zzyy = float3((*(tint_symbol)).v).zzyy;
+  float4 zzyz = float3((*(tint_symbol)).v).zzyz;
+  float4 zzzx = float3((*(tint_symbol)).v).zzzx;
+  float4 zzzy = float3((*(tint_symbol)).v).zzzy;
+  float4 zzzz = float3((*(tint_symbol)).v).zzzz;
+}
+
diff --git a/test/expressions/swizzle/read/vec3/f32.wgsl.expected.spvasm b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..ec1ce6ae
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,769 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 509
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %P "P"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpName %v "v"
+               OpName %x "x"
+               OpName %y "y"
+               OpName %z "z"
+               OpName %xx "xx"
+               OpName %xy "xy"
+               OpName %xz "xz"
+               OpName %yx "yx"
+               OpName %yy "yy"
+               OpName %yz "yz"
+               OpName %zx "zx"
+               OpName %zy "zy"
+               OpName %zz "zz"
+               OpName %xxx "xxx"
+               OpName %xxy "xxy"
+               OpName %xxz "xxz"
+               OpName %xyx "xyx"
+               OpName %xyy "xyy"
+               OpName %xyz "xyz"
+               OpName %xzx "xzx"
+               OpName %xzy "xzy"
+               OpName %xzz "xzz"
+               OpName %yxx "yxx"
+               OpName %yxy "yxy"
+               OpName %yxz "yxz"
+               OpName %yyx "yyx"
+               OpName %yyy "yyy"
+               OpName %yyz "yyz"
+               OpName %yzx "yzx"
+               OpName %yzy "yzy"
+               OpName %yzz "yzz"
+               OpName %zxx "zxx"
+               OpName %zxy "zxy"
+               OpName %zxz "zxz"
+               OpName %zyx "zyx"
+               OpName %zyy "zyy"
+               OpName %zyz "zyz"
+               OpName %zzx "zzx"
+               OpName %zzy "zzy"
+               OpName %zzz "zzz"
+               OpName %xxxx "xxxx"
+               OpName %xxxy "xxxy"
+               OpName %xxxz "xxxz"
+               OpName %xxyx "xxyx"
+               OpName %xxyy "xxyy"
+               OpName %xxyz "xxyz"
+               OpName %xxzx "xxzx"
+               OpName %xxzy "xxzy"
+               OpName %xxzz "xxzz"
+               OpName %xyxx "xyxx"
+               OpName %xyxy "xyxy"
+               OpName %xyxz "xyxz"
+               OpName %xyyx "xyyx"
+               OpName %xyyy "xyyy"
+               OpName %xyyz "xyyz"
+               OpName %xyzx "xyzx"
+               OpName %xyzy "xyzy"
+               OpName %xyzz "xyzz"
+               OpName %xzxx "xzxx"
+               OpName %xzxy "xzxy"
+               OpName %xzxz "xzxz"
+               OpName %xzyx "xzyx"
+               OpName %xzyy "xzyy"
+               OpName %xzyz "xzyz"
+               OpName %xzzx "xzzx"
+               OpName %xzzy "xzzy"
+               OpName %xzzz "xzzz"
+               OpName %yxxx "yxxx"
+               OpName %yxxy "yxxy"
+               OpName %yxxz "yxxz"
+               OpName %yxyx "yxyx"
+               OpName %yxyy "yxyy"
+               OpName %yxyz "yxyz"
+               OpName %yxzx "yxzx"
+               OpName %yxzy "yxzy"
+               OpName %yxzz "yxzz"
+               OpName %yyxx "yyxx"
+               OpName %yyxy "yyxy"
+               OpName %yyxz "yyxz"
+               OpName %yyyx "yyyx"
+               OpName %yyyy "yyyy"
+               OpName %yyyz "yyyz"
+               OpName %yyzx "yyzx"
+               OpName %yyzy "yyzy"
+               OpName %yyzz "yyzz"
+               OpName %yzxx "yzxx"
+               OpName %yzxy "yzxy"
+               OpName %yzxz "yzxz"
+               OpName %yzyx "yzyx"
+               OpName %yzyy "yzyy"
+               OpName %yzyz "yzyz"
+               OpName %yzzx "yzzx"
+               OpName %yzzy "yzzy"
+               OpName %yzzz "yzzz"
+               OpName %zxxx "zxxx"
+               OpName %zxxy "zxxy"
+               OpName %zxxz "zxxz"
+               OpName %zxyx "zxyx"
+               OpName %zxyy "zxyy"
+               OpName %zxyz "zxyz"
+               OpName %zxzx "zxzx"
+               OpName %zxzy "zxzy"
+               OpName %zxzz "zxzz"
+               OpName %zyxx "zyxx"
+               OpName %zyxy "zyxy"
+               OpName %zyxz "zyxz"
+               OpName %zyyx "zyyx"
+               OpName %zyyy "zyyy"
+               OpName %zyyz "zyyz"
+               OpName %zyzx "zyzx"
+               OpName %zyzy "zyzy"
+               OpName %zyzz "zyzz"
+               OpName %zzxx "zzxx"
+               OpName %zzxy "zzxy"
+               OpName %zzxz "zzxz"
+               OpName %zzyx "zzyx"
+               OpName %zzyy "zzyy"
+               OpName %zzyz "zzyz"
+               OpName %zzzx "zzzx"
+               OpName %zzzy "zzzy"
+               OpName %zzzz "zzzz"
+               OpMemberDecorate %S 0 Offset 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %S = OpTypeStruct %v3float
+%_ptr_Private_S = OpTypePointer Private %S
+          %6 = OpConstantNull %S
+          %P = OpVariable %_ptr_Private_S Private %6
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_v3float = OpTypePointer Private %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+         %20 = OpConstantNull %v3float
+%_ptr_Private_float = OpTypePointer Private %float
+%_ptr_Function_float = OpTypePointer Function %float
+         %26 = OpConstantNull %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+    %v2float = OpTypeVector %float 2
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+         %41 = OpConstantNull %v2float
+    %v4float = OpTypeVector %float 4
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+        %188 = OpConstantNull %v4float
+%unused_entry_point = OpFunction %void None %7
+         %10 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %7
+         %12 = OpLabel
+          %v = OpVariable %_ptr_Function_v3float Function %20
+          %x = OpVariable %_ptr_Function_float Function %26
+          %y = OpVariable %_ptr_Function_float Function %26
+          %z = OpVariable %_ptr_Function_float Function %26
+         %xx = OpVariable %_ptr_Function_v2float Function %41
+         %xy = OpVariable %_ptr_Function_v2float Function %41
+         %xz = OpVariable %_ptr_Function_v2float Function %41
+         %yx = OpVariable %_ptr_Function_v2float Function %41
+         %yy = OpVariable %_ptr_Function_v2float Function %41
+         %yz = OpVariable %_ptr_Function_v2float Function %41
+         %zx = OpVariable %_ptr_Function_v2float Function %41
+         %zy = OpVariable %_ptr_Function_v2float Function %41
+         %zz = OpVariable %_ptr_Function_v2float Function %41
+        %xxx = OpVariable %_ptr_Function_v3float Function %20
+        %xxy = OpVariable %_ptr_Function_v3float Function %20
+        %xxz = OpVariable %_ptr_Function_v3float Function %20
+        %xyx = OpVariable %_ptr_Function_v3float Function %20
+        %xyy = OpVariable %_ptr_Function_v3float Function %20
+        %xyz = OpVariable %_ptr_Function_v3float Function %20
+        %xzx = OpVariable %_ptr_Function_v3float Function %20
+        %xzy = OpVariable %_ptr_Function_v3float Function %20
+        %xzz = OpVariable %_ptr_Function_v3float Function %20
+        %yxx = OpVariable %_ptr_Function_v3float Function %20
+        %yxy = OpVariable %_ptr_Function_v3float Function %20
+        %yxz = OpVariable %_ptr_Function_v3float Function %20
+        %yyx = OpVariable %_ptr_Function_v3float Function %20
+        %yyy = OpVariable %_ptr_Function_v3float Function %20
+        %yyz = OpVariable %_ptr_Function_v3float Function %20
+        %yzx = OpVariable %_ptr_Function_v3float Function %20
+        %yzy = OpVariable %_ptr_Function_v3float Function %20
+        %yzz = OpVariable %_ptr_Function_v3float Function %20
+        %zxx = OpVariable %_ptr_Function_v3float Function %20
+        %zxy = OpVariable %_ptr_Function_v3float Function %20
+        %zxz = OpVariable %_ptr_Function_v3float Function %20
+        %zyx = OpVariable %_ptr_Function_v3float Function %20
+        %zyy = OpVariable %_ptr_Function_v3float Function %20
+        %zyz = OpVariable %_ptr_Function_v3float Function %20
+        %zzx = OpVariable %_ptr_Function_v3float Function %20
+        %zzy = OpVariable %_ptr_Function_v3float Function %20
+        %zzz = OpVariable %_ptr_Function_v3float Function %20
+       %xxxx = OpVariable %_ptr_Function_v4float Function %188
+       %xxxy = OpVariable %_ptr_Function_v4float Function %188
+       %xxxz = OpVariable %_ptr_Function_v4float Function %188
+       %xxyx = OpVariable %_ptr_Function_v4float Function %188
+       %xxyy = OpVariable %_ptr_Function_v4float Function %188
+       %xxyz = OpVariable %_ptr_Function_v4float Function %188
+       %xxzx = OpVariable %_ptr_Function_v4float Function %188
+       %xxzy = OpVariable %_ptr_Function_v4float Function %188
+       %xxzz = OpVariable %_ptr_Function_v4float Function %188
+       %xyxx = OpVariable %_ptr_Function_v4float Function %188
+       %xyxy = OpVariable %_ptr_Function_v4float Function %188
+       %xyxz = OpVariable %_ptr_Function_v4float Function %188
+       %xyyx = OpVariable %_ptr_Function_v4float Function %188
+       %xyyy = OpVariable %_ptr_Function_v4float Function %188
+       %xyyz = OpVariable %_ptr_Function_v4float Function %188
+       %xyzx = OpVariable %_ptr_Function_v4float Function %188
+       %xyzy = OpVariable %_ptr_Function_v4float Function %188
+       %xyzz = OpVariable %_ptr_Function_v4float Function %188
+       %xzxx = OpVariable %_ptr_Function_v4float Function %188
+       %xzxy = OpVariable %_ptr_Function_v4float Function %188
+       %xzxz = OpVariable %_ptr_Function_v4float Function %188
+       %xzyx = OpVariable %_ptr_Function_v4float Function %188
+       %xzyy = OpVariable %_ptr_Function_v4float Function %188
+       %xzyz = OpVariable %_ptr_Function_v4float Function %188
+       %xzzx = OpVariable %_ptr_Function_v4float Function %188
+       %xzzy = OpVariable %_ptr_Function_v4float Function %188
+       %xzzz = OpVariable %_ptr_Function_v4float Function %188
+       %yxxx = OpVariable %_ptr_Function_v4float Function %188
+       %yxxy = OpVariable %_ptr_Function_v4float Function %188
+       %yxxz = OpVariable %_ptr_Function_v4float Function %188
+       %yxyx = OpVariable %_ptr_Function_v4float Function %188
+       %yxyy = OpVariable %_ptr_Function_v4float Function %188
+       %yxyz = OpVariable %_ptr_Function_v4float Function %188
+       %yxzx = OpVariable %_ptr_Function_v4float Function %188
+       %yxzy = OpVariable %_ptr_Function_v4float Function %188
+       %yxzz = OpVariable %_ptr_Function_v4float Function %188
+       %yyxx = OpVariable %_ptr_Function_v4float Function %188
+       %yyxy = OpVariable %_ptr_Function_v4float Function %188
+       %yyxz = OpVariable %_ptr_Function_v4float Function %188
+       %yyyx = OpVariable %_ptr_Function_v4float Function %188
+       %yyyy = OpVariable %_ptr_Function_v4float Function %188
+       %yyyz = OpVariable %_ptr_Function_v4float Function %188
+       %yyzx = OpVariable %_ptr_Function_v4float Function %188
+       %yyzy = OpVariable %_ptr_Function_v4float Function %188
+       %yyzz = OpVariable %_ptr_Function_v4float Function %188
+       %yzxx = OpVariable %_ptr_Function_v4float Function %188
+       %yzxy = OpVariable %_ptr_Function_v4float Function %188
+       %yzxz = OpVariable %_ptr_Function_v4float Function %188
+       %yzyx = OpVariable %_ptr_Function_v4float Function %188
+       %yzyy = OpVariable %_ptr_Function_v4float Function %188
+       %yzyz = OpVariable %_ptr_Function_v4float Function %188
+       %yzzx = OpVariable %_ptr_Function_v4float Function %188
+       %yzzy = OpVariable %_ptr_Function_v4float Function %188
+       %yzzz = OpVariable %_ptr_Function_v4float Function %188
+       %zxxx = OpVariable %_ptr_Function_v4float Function %188
+       %zxxy = OpVariable %_ptr_Function_v4float Function %188
+       %zxxz = OpVariable %_ptr_Function_v4float Function %188
+       %zxyx = OpVariable %_ptr_Function_v4float Function %188
+       %zxyy = OpVariable %_ptr_Function_v4float Function %188
+       %zxyz = OpVariable %_ptr_Function_v4float Function %188
+       %zxzx = OpVariable %_ptr_Function_v4float Function %188
+       %zxzy = OpVariable %_ptr_Function_v4float Function %188
+       %zxzz = OpVariable %_ptr_Function_v4float Function %188
+       %zyxx = OpVariable %_ptr_Function_v4float Function %188
+       %zyxy = OpVariable %_ptr_Function_v4float Function %188
+       %zyxz = OpVariable %_ptr_Function_v4float Function %188
+       %zyyx = OpVariable %_ptr_Function_v4float Function %188
+       %zyyy = OpVariable %_ptr_Function_v4float Function %188
+       %zyyz = OpVariable %_ptr_Function_v4float Function %188
+       %zyzx = OpVariable %_ptr_Function_v4float Function %188
+       %zyzy = OpVariable %_ptr_Function_v4float Function %188
+       %zyzz = OpVariable %_ptr_Function_v4float Function %188
+       %zzxx = OpVariable %_ptr_Function_v4float Function %188
+       %zzxy = OpVariable %_ptr_Function_v4float Function %188
+       %zzxz = OpVariable %_ptr_Function_v4float Function %188
+       %zzyx = OpVariable %_ptr_Function_v4float Function %188
+       %zzyy = OpVariable %_ptr_Function_v4float Function %188
+       %zzyz = OpVariable %_ptr_Function_v4float Function %188
+       %zzzx = OpVariable %_ptr_Function_v4float Function %188
+       %zzzy = OpVariable %_ptr_Function_v4float Function %188
+       %zzzz = OpVariable %_ptr_Function_v4float Function %188
+         %16 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %17 = OpLoad %v3float %16
+               OpStore %v %17
+         %22 = OpAccessChain %_ptr_Private_float %P %uint_0 %uint_0
+         %23 = OpLoad %float %22
+               OpStore %x %23
+         %28 = OpAccessChain %_ptr_Private_float %P %uint_0 %uint_1
+         %29 = OpLoad %float %28
+               OpStore %y %29
+         %32 = OpAccessChain %_ptr_Private_float %P %uint_0 %uint_2
+         %33 = OpLoad %float %32
+               OpStore %z %33
+         %35 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %37 = OpLoad %v3float %35
+         %38 = OpVectorShuffle %v2float %37 %37 0 0
+               OpStore %xx %38
+         %42 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %43 = OpLoad %v3float %42
+         %44 = OpVectorShuffle %v2float %43 %43 0 1
+               OpStore %xy %44
+         %46 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %47 = OpLoad %v3float %46
+         %48 = OpVectorShuffle %v2float %47 %47 0 2
+               OpStore %xz %48
+         %50 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %51 = OpLoad %v3float %50
+         %52 = OpVectorShuffle %v2float %51 %51 1 0
+               OpStore %yx %52
+         %54 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %55 = OpLoad %v3float %54
+         %56 = OpVectorShuffle %v2float %55 %55 1 1
+               OpStore %yy %56
+         %58 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %59 = OpLoad %v3float %58
+         %60 = OpVectorShuffle %v2float %59 %59 1 2
+               OpStore %yz %60
+         %62 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %63 = OpLoad %v3float %62
+         %64 = OpVectorShuffle %v2float %63 %63 2 0
+               OpStore %zx %64
+         %66 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %67 = OpLoad %v3float %66
+         %68 = OpVectorShuffle %v2float %67 %67 2 1
+               OpStore %zy %68
+         %70 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %71 = OpLoad %v3float %70
+         %72 = OpVectorShuffle %v2float %71 %71 2 2
+               OpStore %zz %72
+         %74 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %75 = OpLoad %v3float %74
+         %76 = OpVectorShuffle %v3float %75 %75 0 0 0
+               OpStore %xxx %76
+         %78 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %79 = OpLoad %v3float %78
+         %80 = OpVectorShuffle %v3float %79 %79 0 0 1
+               OpStore %xxy %80
+         %82 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %83 = OpLoad %v3float %82
+         %84 = OpVectorShuffle %v3float %83 %83 0 0 2
+               OpStore %xxz %84
+         %86 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %87 = OpLoad %v3float %86
+         %88 = OpVectorShuffle %v3float %87 %87 0 1 0
+               OpStore %xyx %88
+         %90 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %91 = OpLoad %v3float %90
+         %92 = OpVectorShuffle %v3float %91 %91 0 1 1
+               OpStore %xyy %92
+         %94 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %95 = OpLoad %v3float %94
+         %96 = OpVectorShuffle %v3float %95 %95 0 1 2
+               OpStore %xyz %96
+         %98 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+         %99 = OpLoad %v3float %98
+        %100 = OpVectorShuffle %v3float %99 %99 0 2 0
+               OpStore %xzx %100
+        %102 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %103 = OpLoad %v3float %102
+        %104 = OpVectorShuffle %v3float %103 %103 0 2 1
+               OpStore %xzy %104
+        %106 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %107 = OpLoad %v3float %106
+        %108 = OpVectorShuffle %v3float %107 %107 0 2 2
+               OpStore %xzz %108
+        %110 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %111 = OpLoad %v3float %110
+        %112 = OpVectorShuffle %v3float %111 %111 1 0 0
+               OpStore %yxx %112
+        %114 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %115 = OpLoad %v3float %114
+        %116 = OpVectorShuffle %v3float %115 %115 1 0 1
+               OpStore %yxy %116
+        %118 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %119 = OpLoad %v3float %118
+        %120 = OpVectorShuffle %v3float %119 %119 1 0 2
+               OpStore %yxz %120
+        %122 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %123 = OpLoad %v3float %122
+        %124 = OpVectorShuffle %v3float %123 %123 1 1 0
+               OpStore %yyx %124
+        %126 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %127 = OpLoad %v3float %126
+        %128 = OpVectorShuffle %v3float %127 %127 1 1 1
+               OpStore %yyy %128
+        %130 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %131 = OpLoad %v3float %130
+        %132 = OpVectorShuffle %v3float %131 %131 1 1 2
+               OpStore %yyz %132
+        %134 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %135 = OpLoad %v3float %134
+        %136 = OpVectorShuffle %v3float %135 %135 1 2 0
+               OpStore %yzx %136
+        %138 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %139 = OpLoad %v3float %138
+        %140 = OpVectorShuffle %v3float %139 %139 1 2 1
+               OpStore %yzy %140
+        %142 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %143 = OpLoad %v3float %142
+        %144 = OpVectorShuffle %v3float %143 %143 1 2 2
+               OpStore %yzz %144
+        %146 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %147 = OpLoad %v3float %146
+        %148 = OpVectorShuffle %v3float %147 %147 2 0 0
+               OpStore %zxx %148
+        %150 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %151 = OpLoad %v3float %150
+        %152 = OpVectorShuffle %v3float %151 %151 2 0 1
+               OpStore %zxy %152
+        %154 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %155 = OpLoad %v3float %154
+        %156 = OpVectorShuffle %v3float %155 %155 2 0 2
+               OpStore %zxz %156
+        %158 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %159 = OpLoad %v3float %158
+        %160 = OpVectorShuffle %v3float %159 %159 2 1 0
+               OpStore %zyx %160
+        %162 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %163 = OpLoad %v3float %162
+        %164 = OpVectorShuffle %v3float %163 %163 2 1 1
+               OpStore %zyy %164
+        %166 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %167 = OpLoad %v3float %166
+        %168 = OpVectorShuffle %v3float %167 %167 2 1 2
+               OpStore %zyz %168
+        %170 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %171 = OpLoad %v3float %170
+        %172 = OpVectorShuffle %v3float %171 %171 2 2 0
+               OpStore %zzx %172
+        %174 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %175 = OpLoad %v3float %174
+        %176 = OpVectorShuffle %v3float %175 %175 2 2 1
+               OpStore %zzy %176
+        %178 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %179 = OpLoad %v3float %178
+        %180 = OpVectorShuffle %v3float %179 %179 2 2 2
+               OpStore %zzz %180
+        %182 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %184 = OpLoad %v3float %182
+        %185 = OpVectorShuffle %v4float %184 %184 0 0 0 0
+               OpStore %xxxx %185
+        %189 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %190 = OpLoad %v3float %189
+        %191 = OpVectorShuffle %v4float %190 %190 0 0 0 1
+               OpStore %xxxy %191
+        %193 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %194 = OpLoad %v3float %193
+        %195 = OpVectorShuffle %v4float %194 %194 0 0 0 2
+               OpStore %xxxz %195
+        %197 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %198 = OpLoad %v3float %197
+        %199 = OpVectorShuffle %v4float %198 %198 0 0 1 0
+               OpStore %xxyx %199
+        %201 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %202 = OpLoad %v3float %201
+        %203 = OpVectorShuffle %v4float %202 %202 0 0 1 1
+               OpStore %xxyy %203
+        %205 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %206 = OpLoad %v3float %205
+        %207 = OpVectorShuffle %v4float %206 %206 0 0 1 2
+               OpStore %xxyz %207
+        %209 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %210 = OpLoad %v3float %209
+        %211 = OpVectorShuffle %v4float %210 %210 0 0 2 0
+               OpStore %xxzx %211
+        %213 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %214 = OpLoad %v3float %213
+        %215 = OpVectorShuffle %v4float %214 %214 0 0 2 1
+               OpStore %xxzy %215
+        %217 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %218 = OpLoad %v3float %217
+        %219 = OpVectorShuffle %v4float %218 %218 0 0 2 2
+               OpStore %xxzz %219
+        %221 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %222 = OpLoad %v3float %221
+        %223 = OpVectorShuffle %v4float %222 %222 0 1 0 0
+               OpStore %xyxx %223
+        %225 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %226 = OpLoad %v3float %225
+        %227 = OpVectorShuffle %v4float %226 %226 0 1 0 1
+               OpStore %xyxy %227
+        %229 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %230 = OpLoad %v3float %229
+        %231 = OpVectorShuffle %v4float %230 %230 0 1 0 2
+               OpStore %xyxz %231
+        %233 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %234 = OpLoad %v3float %233
+        %235 = OpVectorShuffle %v4float %234 %234 0 1 1 0
+               OpStore %xyyx %235
+        %237 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %238 = OpLoad %v3float %237
+        %239 = OpVectorShuffle %v4float %238 %238 0 1 1 1
+               OpStore %xyyy %239
+        %241 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %242 = OpLoad %v3float %241
+        %243 = OpVectorShuffle %v4float %242 %242 0 1 1 2
+               OpStore %xyyz %243
+        %245 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %246 = OpLoad %v3float %245
+        %247 = OpVectorShuffle %v4float %246 %246 0 1 2 0
+               OpStore %xyzx %247
+        %249 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %250 = OpLoad %v3float %249
+        %251 = OpVectorShuffle %v4float %250 %250 0 1 2 1
+               OpStore %xyzy %251
+        %253 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %254 = OpLoad %v3float %253
+        %255 = OpVectorShuffle %v4float %254 %254 0 1 2 2
+               OpStore %xyzz %255
+        %257 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %258 = OpLoad %v3float %257
+        %259 = OpVectorShuffle %v4float %258 %258 0 2 0 0
+               OpStore %xzxx %259
+        %261 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %262 = OpLoad %v3float %261
+        %263 = OpVectorShuffle %v4float %262 %262 0 2 0 1
+               OpStore %xzxy %263
+        %265 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %266 = OpLoad %v3float %265
+        %267 = OpVectorShuffle %v4float %266 %266 0 2 0 2
+               OpStore %xzxz %267
+        %269 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %270 = OpLoad %v3float %269
+        %271 = OpVectorShuffle %v4float %270 %270 0 2 1 0
+               OpStore %xzyx %271
+        %273 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %274 = OpLoad %v3float %273
+        %275 = OpVectorShuffle %v4float %274 %274 0 2 1 1
+               OpStore %xzyy %275
+        %277 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %278 = OpLoad %v3float %277
+        %279 = OpVectorShuffle %v4float %278 %278 0 2 1 2
+               OpStore %xzyz %279
+        %281 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %282 = OpLoad %v3float %281
+        %283 = OpVectorShuffle %v4float %282 %282 0 2 2 0
+               OpStore %xzzx %283
+        %285 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %286 = OpLoad %v3float %285
+        %287 = OpVectorShuffle %v4float %286 %286 0 2 2 1
+               OpStore %xzzy %287
+        %289 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %290 = OpLoad %v3float %289
+        %291 = OpVectorShuffle %v4float %290 %290 0 2 2 2
+               OpStore %xzzz %291
+        %293 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %294 = OpLoad %v3float %293
+        %295 = OpVectorShuffle %v4float %294 %294 1 0 0 0
+               OpStore %yxxx %295
+        %297 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %298 = OpLoad %v3float %297
+        %299 = OpVectorShuffle %v4float %298 %298 1 0 0 1
+               OpStore %yxxy %299
+        %301 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %302 = OpLoad %v3float %301
+        %303 = OpVectorShuffle %v4float %302 %302 1 0 0 2
+               OpStore %yxxz %303
+        %305 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %306 = OpLoad %v3float %305
+        %307 = OpVectorShuffle %v4float %306 %306 1 0 1 0
+               OpStore %yxyx %307
+        %309 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %310 = OpLoad %v3float %309
+        %311 = OpVectorShuffle %v4float %310 %310 1 0 1 1
+               OpStore %yxyy %311
+        %313 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %314 = OpLoad %v3float %313
+        %315 = OpVectorShuffle %v4float %314 %314 1 0 1 2
+               OpStore %yxyz %315
+        %317 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %318 = OpLoad %v3float %317
+        %319 = OpVectorShuffle %v4float %318 %318 1 0 2 0
+               OpStore %yxzx %319
+        %321 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %322 = OpLoad %v3float %321
+        %323 = OpVectorShuffle %v4float %322 %322 1 0 2 1
+               OpStore %yxzy %323
+        %325 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %326 = OpLoad %v3float %325
+        %327 = OpVectorShuffle %v4float %326 %326 1 0 2 2
+               OpStore %yxzz %327
+        %329 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %330 = OpLoad %v3float %329
+        %331 = OpVectorShuffle %v4float %330 %330 1 1 0 0
+               OpStore %yyxx %331
+        %333 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %334 = OpLoad %v3float %333
+        %335 = OpVectorShuffle %v4float %334 %334 1 1 0 1
+               OpStore %yyxy %335
+        %337 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %338 = OpLoad %v3float %337
+        %339 = OpVectorShuffle %v4float %338 %338 1 1 0 2
+               OpStore %yyxz %339
+        %341 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %342 = OpLoad %v3float %341
+        %343 = OpVectorShuffle %v4float %342 %342 1 1 1 0
+               OpStore %yyyx %343
+        %345 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %346 = OpLoad %v3float %345
+        %347 = OpVectorShuffle %v4float %346 %346 1 1 1 1
+               OpStore %yyyy %347
+        %349 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %350 = OpLoad %v3float %349
+        %351 = OpVectorShuffle %v4float %350 %350 1 1 1 2
+               OpStore %yyyz %351
+        %353 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %354 = OpLoad %v3float %353
+        %355 = OpVectorShuffle %v4float %354 %354 1 1 2 0
+               OpStore %yyzx %355
+        %357 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %358 = OpLoad %v3float %357
+        %359 = OpVectorShuffle %v4float %358 %358 1 1 2 1
+               OpStore %yyzy %359
+        %361 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %362 = OpLoad %v3float %361
+        %363 = OpVectorShuffle %v4float %362 %362 1 1 2 2
+               OpStore %yyzz %363
+        %365 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %366 = OpLoad %v3float %365
+        %367 = OpVectorShuffle %v4float %366 %366 1 2 0 0
+               OpStore %yzxx %367
+        %369 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %370 = OpLoad %v3float %369
+        %371 = OpVectorShuffle %v4float %370 %370 1 2 0 1
+               OpStore %yzxy %371
+        %373 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %374 = OpLoad %v3float %373
+        %375 = OpVectorShuffle %v4float %374 %374 1 2 0 2
+               OpStore %yzxz %375
+        %377 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %378 = OpLoad %v3float %377
+        %379 = OpVectorShuffle %v4float %378 %378 1 2 1 0
+               OpStore %yzyx %379
+        %381 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %382 = OpLoad %v3float %381
+        %383 = OpVectorShuffle %v4float %382 %382 1 2 1 1
+               OpStore %yzyy %383
+        %385 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %386 = OpLoad %v3float %385
+        %387 = OpVectorShuffle %v4float %386 %386 1 2 1 2
+               OpStore %yzyz %387
+        %389 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %390 = OpLoad %v3float %389
+        %391 = OpVectorShuffle %v4float %390 %390 1 2 2 0
+               OpStore %yzzx %391
+        %393 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %394 = OpLoad %v3float %393
+        %395 = OpVectorShuffle %v4float %394 %394 1 2 2 1
+               OpStore %yzzy %395
+        %397 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %398 = OpLoad %v3float %397
+        %399 = OpVectorShuffle %v4float %398 %398 1 2 2 2
+               OpStore %yzzz %399
+        %401 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %402 = OpLoad %v3float %401
+        %403 = OpVectorShuffle %v4float %402 %402 2 0 0 0
+               OpStore %zxxx %403
+        %405 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %406 = OpLoad %v3float %405
+        %407 = OpVectorShuffle %v4float %406 %406 2 0 0 1
+               OpStore %zxxy %407
+        %409 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %410 = OpLoad %v3float %409
+        %411 = OpVectorShuffle %v4float %410 %410 2 0 0 2
+               OpStore %zxxz %411
+        %413 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %414 = OpLoad %v3float %413
+        %415 = OpVectorShuffle %v4float %414 %414 2 0 1 0
+               OpStore %zxyx %415
+        %417 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %418 = OpLoad %v3float %417
+        %419 = OpVectorShuffle %v4float %418 %418 2 0 1 1
+               OpStore %zxyy %419
+        %421 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %422 = OpLoad %v3float %421
+        %423 = OpVectorShuffle %v4float %422 %422 2 0 1 2
+               OpStore %zxyz %423
+        %425 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %426 = OpLoad %v3float %425
+        %427 = OpVectorShuffle %v4float %426 %426 2 0 2 0
+               OpStore %zxzx %427
+        %429 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %430 = OpLoad %v3float %429
+        %431 = OpVectorShuffle %v4float %430 %430 2 0 2 1
+               OpStore %zxzy %431
+        %433 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %434 = OpLoad %v3float %433
+        %435 = OpVectorShuffle %v4float %434 %434 2 0 2 2
+               OpStore %zxzz %435
+        %437 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %438 = OpLoad %v3float %437
+        %439 = OpVectorShuffle %v4float %438 %438 2 1 0 0
+               OpStore %zyxx %439
+        %441 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %442 = OpLoad %v3float %441
+        %443 = OpVectorShuffle %v4float %442 %442 2 1 0 1
+               OpStore %zyxy %443
+        %445 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %446 = OpLoad %v3float %445
+        %447 = OpVectorShuffle %v4float %446 %446 2 1 0 2
+               OpStore %zyxz %447
+        %449 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %450 = OpLoad %v3float %449
+        %451 = OpVectorShuffle %v4float %450 %450 2 1 1 0
+               OpStore %zyyx %451
+        %453 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %454 = OpLoad %v3float %453
+        %455 = OpVectorShuffle %v4float %454 %454 2 1 1 1
+               OpStore %zyyy %455
+        %457 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %458 = OpLoad %v3float %457
+        %459 = OpVectorShuffle %v4float %458 %458 2 1 1 2
+               OpStore %zyyz %459
+        %461 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %462 = OpLoad %v3float %461
+        %463 = OpVectorShuffle %v4float %462 %462 2 1 2 0
+               OpStore %zyzx %463
+        %465 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %466 = OpLoad %v3float %465
+        %467 = OpVectorShuffle %v4float %466 %466 2 1 2 1
+               OpStore %zyzy %467
+        %469 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %470 = OpLoad %v3float %469
+        %471 = OpVectorShuffle %v4float %470 %470 2 1 2 2
+               OpStore %zyzz %471
+        %473 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %474 = OpLoad %v3float %473
+        %475 = OpVectorShuffle %v4float %474 %474 2 2 0 0
+               OpStore %zzxx %475
+        %477 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %478 = OpLoad %v3float %477
+        %479 = OpVectorShuffle %v4float %478 %478 2 2 0 1
+               OpStore %zzxy %479
+        %481 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %482 = OpLoad %v3float %481
+        %483 = OpVectorShuffle %v4float %482 %482 2 2 0 2
+               OpStore %zzxz %483
+        %485 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %486 = OpLoad %v3float %485
+        %487 = OpVectorShuffle %v4float %486 %486 2 2 1 0
+               OpStore %zzyx %487
+        %489 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %490 = OpLoad %v3float %489
+        %491 = OpVectorShuffle %v4float %490 %490 2 2 1 1
+               OpStore %zzyy %491
+        %493 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %494 = OpLoad %v3float %493
+        %495 = OpVectorShuffle %v4float %494 %494 2 2 1 2
+               OpStore %zzyz %495
+        %497 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %498 = OpLoad %v3float %497
+        %499 = OpVectorShuffle %v4float %498 %498 2 2 2 0
+               OpStore %zzzx %499
+        %501 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %502 = OpLoad %v3float %501
+        %503 = OpVectorShuffle %v4float %502 %502 2 2 2 1
+               OpStore %zzzy %503
+        %505 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+        %506 = OpLoad %v3float %505
+        %507 = OpVectorShuffle %v4float %506 %506 2 2 2 2
+               OpStore %zzzz %507
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/read/vec3/f32.wgsl.expected.wgsl b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..cef93bb
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,129 @@
+struct S {
+  v : vec3<f32>;
+};
+
+var<private> P : S;
+
+fn f() {
+  var v = P.v;
+  var x = P.v.x;
+  var y = P.v.y;
+  var z = P.v.z;
+  var xx = P.v.xx;
+  var xy = P.v.xy;
+  var xz = P.v.xz;
+  var yx = P.v.yx;
+  var yy = P.v.yy;
+  var yz = P.v.yz;
+  var zx = P.v.zx;
+  var zy = P.v.zy;
+  var zz = P.v.zz;
+  var xxx = P.v.xxx;
+  var xxy = P.v.xxy;
+  var xxz = P.v.xxz;
+  var xyx = P.v.xyx;
+  var xyy = P.v.xyy;
+  var xyz = P.v.xyz;
+  var xzx = P.v.xzx;
+  var xzy = P.v.xzy;
+  var xzz = P.v.xzz;
+  var yxx = P.v.yxx;
+  var yxy = P.v.yxy;
+  var yxz = P.v.yxz;
+  var yyx = P.v.yyx;
+  var yyy = P.v.yyy;
+  var yyz = P.v.yyz;
+  var yzx = P.v.yzx;
+  var yzy = P.v.yzy;
+  var yzz = P.v.yzz;
+  var zxx = P.v.zxx;
+  var zxy = P.v.zxy;
+  var zxz = P.v.zxz;
+  var zyx = P.v.zyx;
+  var zyy = P.v.zyy;
+  var zyz = P.v.zyz;
+  var zzx = P.v.zzx;
+  var zzy = P.v.zzy;
+  var zzz = P.v.zzz;
+  var xxxx = P.v.xxxx;
+  var xxxy = P.v.xxxy;
+  var xxxz = P.v.xxxz;
+  var xxyx = P.v.xxyx;
+  var xxyy = P.v.xxyy;
+  var xxyz = P.v.xxyz;
+  var xxzx = P.v.xxzx;
+  var xxzy = P.v.xxzy;
+  var xxzz = P.v.xxzz;
+  var xyxx = P.v.xyxx;
+  var xyxy = P.v.xyxy;
+  var xyxz = P.v.xyxz;
+  var xyyx = P.v.xyyx;
+  var xyyy = P.v.xyyy;
+  var xyyz = P.v.xyyz;
+  var xyzx = P.v.xyzx;
+  var xyzy = P.v.xyzy;
+  var xyzz = P.v.xyzz;
+  var xzxx = P.v.xzxx;
+  var xzxy = P.v.xzxy;
+  var xzxz = P.v.xzxz;
+  var xzyx = P.v.xzyx;
+  var xzyy = P.v.xzyy;
+  var xzyz = P.v.xzyz;
+  var xzzx = P.v.xzzx;
+  var xzzy = P.v.xzzy;
+  var xzzz = P.v.xzzz;
+  var yxxx = P.v.yxxx;
+  var yxxy = P.v.yxxy;
+  var yxxz = P.v.yxxz;
+  var yxyx = P.v.yxyx;
+  var yxyy = P.v.yxyy;
+  var yxyz = P.v.yxyz;
+  var yxzx = P.v.yxzx;
+  var yxzy = P.v.yxzy;
+  var yxzz = P.v.yxzz;
+  var yyxx = P.v.yyxx;
+  var yyxy = P.v.yyxy;
+  var yyxz = P.v.yyxz;
+  var yyyx = P.v.yyyx;
+  var yyyy = P.v.yyyy;
+  var yyyz = P.v.yyyz;
+  var yyzx = P.v.yyzx;
+  var yyzy = P.v.yyzy;
+  var yyzz = P.v.yyzz;
+  var yzxx = P.v.yzxx;
+  var yzxy = P.v.yzxy;
+  var yzxz = P.v.yzxz;
+  var yzyx = P.v.yzyx;
+  var yzyy = P.v.yzyy;
+  var yzyz = P.v.yzyz;
+  var yzzx = P.v.yzzx;
+  var yzzy = P.v.yzzy;
+  var yzzz = P.v.yzzz;
+  var zxxx = P.v.zxxx;
+  var zxxy = P.v.zxxy;
+  var zxxz = P.v.zxxz;
+  var zxyx = P.v.zxyx;
+  var zxyy = P.v.zxyy;
+  var zxyz = P.v.zxyz;
+  var zxzx = P.v.zxzx;
+  var zxzy = P.v.zxzy;
+  var zxzz = P.v.zxzz;
+  var zyxx = P.v.zyxx;
+  var zyxy = P.v.zyxy;
+  var zyxz = P.v.zyxz;
+  var zyyx = P.v.zyyx;
+  var zyyy = P.v.zyyy;
+  var zyyz = P.v.zyyz;
+  var zyzx = P.v.zyzx;
+  var zyzy = P.v.zyzy;
+  var zyzz = P.v.zyzz;
+  var zzxx = P.v.zzxx;
+  var zzxy = P.v.zzxy;
+  var zzxz = P.v.zzxz;
+  var zzyx = P.v.zzyx;
+  var zzyy = P.v.zzyy;
+  var zzyz = P.v.zzyz;
+  var zzzx = P.v.zzzx;
+  var zzzy = P.v.zzzy;
+  var zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/i32.wgsl b/test/expressions/swizzle/read/vec3/i32.wgsl
new file mode 100644
index 0000000..fca1add
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/i32.wgsl
@@ -0,0 +1,143 @@
+struct S {
+    v: vec3<i32>;
+};
+
+var<private> P : S;
+
+fn f() {
+    var    v = P.v;
+
+    var    x = P.v.x;
+    var    y = P.v.y;
+    var    z = P.v.z;
+
+    var   xx = P.v.xx;
+    var   xy = P.v.xy;
+    var   xz = P.v.xz;
+    var   yx = P.v.yx;
+    var   yy = P.v.yy;
+    var   yz = P.v.yz;
+    var   zx = P.v.zx;
+    var   zy = P.v.zy;
+    var   zz = P.v.zz;
+
+    var  xxx = P.v.xxx;
+    var  xxy = P.v.xxy;
+    var  xxz = P.v.xxz;
+    var  xyx = P.v.xyx;
+    var  xyy = P.v.xyy;
+    var  xyz = P.v.xyz;
+    var  xzx = P.v.xzx;
+    var  xzy = P.v.xzy;
+    var  xzz = P.v.xzz;
+
+    var  yxx = P.v.yxx;
+    var  yxy = P.v.yxy;
+    var  yxz = P.v.yxz;
+    var  yyx = P.v.yyx;
+    var  yyy = P.v.yyy;
+    var  yyz = P.v.yyz;
+    var  yzx = P.v.yzx;
+    var  yzy = P.v.yzy;
+    var  yzz = P.v.yzz;
+
+    var  zxx = P.v.zxx;
+    var  zxy = P.v.zxy;
+    var  zxz = P.v.zxz;
+    var  zyx = P.v.zyx;
+    var  zyy = P.v.zyy;
+    var  zyz = P.v.zyz;
+    var  zzx = P.v.zzx;
+    var  zzy = P.v.zzy;
+    var  zzz = P.v.zzz;
+
+    var xxxx = P.v.xxxx;
+    var xxxy = P.v.xxxy;
+    var xxxz = P.v.xxxz;
+    var xxyx = P.v.xxyx;
+    var xxyy = P.v.xxyy;
+    var xxyz = P.v.xxyz;
+    var xxzx = P.v.xxzx;
+    var xxzy = P.v.xxzy;
+    var xxzz = P.v.xxzz;
+
+    var xyxx = P.v.xyxx;
+    var xyxy = P.v.xyxy;
+    var xyxz = P.v.xyxz;
+    var xyyx = P.v.xyyx;
+    var xyyy = P.v.xyyy;
+    var xyyz = P.v.xyyz;
+    var xyzx = P.v.xyzx;
+    var xyzy = P.v.xyzy;
+    var xyzz = P.v.xyzz;
+
+    var xzxx = P.v.xzxx;
+    var xzxy = P.v.xzxy;
+    var xzxz = P.v.xzxz;
+    var xzyx = P.v.xzyx;
+    var xzyy = P.v.xzyy;
+    var xzyz = P.v.xzyz;
+    var xzzx = P.v.xzzx;
+    var xzzy = P.v.xzzy;
+    var xzzz = P.v.xzzz;
+
+    var yxxx = P.v.yxxx;
+    var yxxy = P.v.yxxy;
+    var yxxz = P.v.yxxz;
+    var yxyx = P.v.yxyx;
+    var yxyy = P.v.yxyy;
+    var yxyz = P.v.yxyz;
+    var yxzx = P.v.yxzx;
+    var yxzy = P.v.yxzy;
+    var yxzz = P.v.yxzz;
+
+    var yyxx = P.v.yyxx;
+    var yyxy = P.v.yyxy;
+    var yyxz = P.v.yyxz;
+    var yyyx = P.v.yyyx;
+    var yyyy = P.v.yyyy;
+    var yyyz = P.v.yyyz;
+    var yyzx = P.v.yyzx;
+    var yyzy = P.v.yyzy;
+    var yyzz = P.v.yyzz;
+
+    var yzxx = P.v.yzxx;
+    var yzxy = P.v.yzxy;
+    var yzxz = P.v.yzxz;
+    var yzyx = P.v.yzyx;
+    var yzyy = P.v.yzyy;
+    var yzyz = P.v.yzyz;
+    var yzzx = P.v.yzzx;
+    var yzzy = P.v.yzzy;
+    var yzzz = P.v.yzzz;
+
+    var zxxx = P.v.zxxx;
+    var zxxy = P.v.zxxy;
+    var zxxz = P.v.zxxz;
+    var zxyx = P.v.zxyx;
+    var zxyy = P.v.zxyy;
+    var zxyz = P.v.zxyz;
+    var zxzx = P.v.zxzx;
+    var zxzy = P.v.zxzy;
+    var zxzz = P.v.zxzz;
+
+    var zyxx = P.v.zyxx;
+    var zyxy = P.v.zyxy;
+    var zyxz = P.v.zyxz;
+    var zyyx = P.v.zyyx;
+    var zyyy = P.v.zyyy;
+    var zyyz = P.v.zyyz;
+    var zyzx = P.v.zyzx;
+    var zyzy = P.v.zyzy;
+    var zyzz = P.v.zyzz;
+
+    var zzxx = P.v.zzxx;
+    var zzxy = P.v.zzxy;
+    var zzxz = P.v.zzxz;
+    var zzyx = P.v.zzyx;
+    var zzyy = P.v.zzyy;
+    var zzyz = P.v.zzyz;
+    var zzzx = P.v.zzzx;
+    var zzzy = P.v.zzzy;
+    var zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/i32.wgsl.expected.hlsl b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..b6314fb
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,134 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+struct S {
+  int3 v;
+};
+
+static S P = (S)0;
+
+void f() {
+  int3 v = P.v;
+  int x = P.v.x;
+  int y = P.v.y;
+  int z = P.v.z;
+  int2 xx = P.v.xx;
+  int2 xy = P.v.xy;
+  int2 xz = P.v.xz;
+  int2 yx = P.v.yx;
+  int2 yy = P.v.yy;
+  int2 yz = P.v.yz;
+  int2 zx = P.v.zx;
+  int2 zy = P.v.zy;
+  int2 zz = P.v.zz;
+  int3 xxx = P.v.xxx;
+  int3 xxy = P.v.xxy;
+  int3 xxz = P.v.xxz;
+  int3 xyx = P.v.xyx;
+  int3 xyy = P.v.xyy;
+  int3 xyz = P.v.xyz;
+  int3 xzx = P.v.xzx;
+  int3 xzy = P.v.xzy;
+  int3 xzz = P.v.xzz;
+  int3 yxx = P.v.yxx;
+  int3 yxy = P.v.yxy;
+  int3 yxz = P.v.yxz;
+  int3 yyx = P.v.yyx;
+  int3 yyy = P.v.yyy;
+  int3 yyz = P.v.yyz;
+  int3 yzx = P.v.yzx;
+  int3 yzy = P.v.yzy;
+  int3 yzz = P.v.yzz;
+  int3 zxx = P.v.zxx;
+  int3 zxy = P.v.zxy;
+  int3 zxz = P.v.zxz;
+  int3 zyx = P.v.zyx;
+  int3 zyy = P.v.zyy;
+  int3 zyz = P.v.zyz;
+  int3 zzx = P.v.zzx;
+  int3 zzy = P.v.zzy;
+  int3 zzz = P.v.zzz;
+  int4 xxxx = P.v.xxxx;
+  int4 xxxy = P.v.xxxy;
+  int4 xxxz = P.v.xxxz;
+  int4 xxyx = P.v.xxyx;
+  int4 xxyy = P.v.xxyy;
+  int4 xxyz = P.v.xxyz;
+  int4 xxzx = P.v.xxzx;
+  int4 xxzy = P.v.xxzy;
+  int4 xxzz = P.v.xxzz;
+  int4 xyxx = P.v.xyxx;
+  int4 xyxy = P.v.xyxy;
+  int4 xyxz = P.v.xyxz;
+  int4 xyyx = P.v.xyyx;
+  int4 xyyy = P.v.xyyy;
+  int4 xyyz = P.v.xyyz;
+  int4 xyzx = P.v.xyzx;
+  int4 xyzy = P.v.xyzy;
+  int4 xyzz = P.v.xyzz;
+  int4 xzxx = P.v.xzxx;
+  int4 xzxy = P.v.xzxy;
+  int4 xzxz = P.v.xzxz;
+  int4 xzyx = P.v.xzyx;
+  int4 xzyy = P.v.xzyy;
+  int4 xzyz = P.v.xzyz;
+  int4 xzzx = P.v.xzzx;
+  int4 xzzy = P.v.xzzy;
+  int4 xzzz = P.v.xzzz;
+  int4 yxxx = P.v.yxxx;
+  int4 yxxy = P.v.yxxy;
+  int4 yxxz = P.v.yxxz;
+  int4 yxyx = P.v.yxyx;
+  int4 yxyy = P.v.yxyy;
+  int4 yxyz = P.v.yxyz;
+  int4 yxzx = P.v.yxzx;
+  int4 yxzy = P.v.yxzy;
+  int4 yxzz = P.v.yxzz;
+  int4 yyxx = P.v.yyxx;
+  int4 yyxy = P.v.yyxy;
+  int4 yyxz = P.v.yyxz;
+  int4 yyyx = P.v.yyyx;
+  int4 yyyy = P.v.yyyy;
+  int4 yyyz = P.v.yyyz;
+  int4 yyzx = P.v.yyzx;
+  int4 yyzy = P.v.yyzy;
+  int4 yyzz = P.v.yyzz;
+  int4 yzxx = P.v.yzxx;
+  int4 yzxy = P.v.yzxy;
+  int4 yzxz = P.v.yzxz;
+  int4 yzyx = P.v.yzyx;
+  int4 yzyy = P.v.yzyy;
+  int4 yzyz = P.v.yzyz;
+  int4 yzzx = P.v.yzzx;
+  int4 yzzy = P.v.yzzy;
+  int4 yzzz = P.v.yzzz;
+  int4 zxxx = P.v.zxxx;
+  int4 zxxy = P.v.zxxy;
+  int4 zxxz = P.v.zxxz;
+  int4 zxyx = P.v.zxyx;
+  int4 zxyy = P.v.zxyy;
+  int4 zxyz = P.v.zxyz;
+  int4 zxzx = P.v.zxzx;
+  int4 zxzy = P.v.zxzy;
+  int4 zxzz = P.v.zxzz;
+  int4 zyxx = P.v.zyxx;
+  int4 zyxy = P.v.zyxy;
+  int4 zyxz = P.v.zyxz;
+  int4 zyyx = P.v.zyyx;
+  int4 zyyy = P.v.zyyy;
+  int4 zyyz = P.v.zyyz;
+  int4 zyzx = P.v.zyzx;
+  int4 zyzy = P.v.zyzy;
+  int4 zyzz = P.v.zyzz;
+  int4 zzxx = P.v.zzxx;
+  int4 zzxy = P.v.zzxy;
+  int4 zzxz = P.v.zzxz;
+  int4 zzyx = P.v.zzyx;
+  int4 zzyy = P.v.zzyy;
+  int4 zzyz = P.v.zzyz;
+  int4 zzzx = P.v.zzzx;
+  int4 zzzy = P.v.zzzy;
+  int4 zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/i32.wgsl.expected.msl b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..ddcd693
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.msl
@@ -0,0 +1,131 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int3 v;
+};
+
+void f(thread S* const tint_symbol) {
+  int3 v = (*(tint_symbol)).v;
+  int x = (*(tint_symbol)).v[0];
+  int y = (*(tint_symbol)).v[1];
+  int z = (*(tint_symbol)).v[2];
+  int2 xx = int3((*(tint_symbol)).v).xx;
+  int2 xy = int3((*(tint_symbol)).v).xy;
+  int2 xz = int3((*(tint_symbol)).v).xz;
+  int2 yx = int3((*(tint_symbol)).v).yx;
+  int2 yy = int3((*(tint_symbol)).v).yy;
+  int2 yz = int3((*(tint_symbol)).v).yz;
+  int2 zx = int3((*(tint_symbol)).v).zx;
+  int2 zy = int3((*(tint_symbol)).v).zy;
+  int2 zz = int3((*(tint_symbol)).v).zz;
+  int3 xxx = int3((*(tint_symbol)).v).xxx;
+  int3 xxy = int3((*(tint_symbol)).v).xxy;
+  int3 xxz = int3((*(tint_symbol)).v).xxz;
+  int3 xyx = int3((*(tint_symbol)).v).xyx;
+  int3 xyy = int3((*(tint_symbol)).v).xyy;
+  int3 xyz = int3((*(tint_symbol)).v).xyz;
+  int3 xzx = int3((*(tint_symbol)).v).xzx;
+  int3 xzy = int3((*(tint_symbol)).v).xzy;
+  int3 xzz = int3((*(tint_symbol)).v).xzz;
+  int3 yxx = int3((*(tint_symbol)).v).yxx;
+  int3 yxy = int3((*(tint_symbol)).v).yxy;
+  int3 yxz = int3((*(tint_symbol)).v).yxz;
+  int3 yyx = int3((*(tint_symbol)).v).yyx;
+  int3 yyy = int3((*(tint_symbol)).v).yyy;
+  int3 yyz = int3((*(tint_symbol)).v).yyz;
+  int3 yzx = int3((*(tint_symbol)).v).yzx;
+  int3 yzy = int3((*(tint_symbol)).v).yzy;
+  int3 yzz = int3((*(tint_symbol)).v).yzz;
+  int3 zxx = int3((*(tint_symbol)).v).zxx;
+  int3 zxy = int3((*(tint_symbol)).v).zxy;
+  int3 zxz = int3((*(tint_symbol)).v).zxz;
+  int3 zyx = int3((*(tint_symbol)).v).zyx;
+  int3 zyy = int3((*(tint_symbol)).v).zyy;
+  int3 zyz = int3((*(tint_symbol)).v).zyz;
+  int3 zzx = int3((*(tint_symbol)).v).zzx;
+  int3 zzy = int3((*(tint_symbol)).v).zzy;
+  int3 zzz = int3((*(tint_symbol)).v).zzz;
+  int4 xxxx = int3((*(tint_symbol)).v).xxxx;
+  int4 xxxy = int3((*(tint_symbol)).v).xxxy;
+  int4 xxxz = int3((*(tint_symbol)).v).xxxz;
+  int4 xxyx = int3((*(tint_symbol)).v).xxyx;
+  int4 xxyy = int3((*(tint_symbol)).v).xxyy;
+  int4 xxyz = int3((*(tint_symbol)).v).xxyz;
+  int4 xxzx = int3((*(tint_symbol)).v).xxzx;
+  int4 xxzy = int3((*(tint_symbol)).v).xxzy;
+  int4 xxzz = int3((*(tint_symbol)).v).xxzz;
+  int4 xyxx = int3((*(tint_symbol)).v).xyxx;
+  int4 xyxy = int3((*(tint_symbol)).v).xyxy;
+  int4 xyxz = int3((*(tint_symbol)).v).xyxz;
+  int4 xyyx = int3((*(tint_symbol)).v).xyyx;
+  int4 xyyy = int3((*(tint_symbol)).v).xyyy;
+  int4 xyyz = int3((*(tint_symbol)).v).xyyz;
+  int4 xyzx = int3((*(tint_symbol)).v).xyzx;
+  int4 xyzy = int3((*(tint_symbol)).v).xyzy;
+  int4 xyzz = int3((*(tint_symbol)).v).xyzz;
+  int4 xzxx = int3((*(tint_symbol)).v).xzxx;
+  int4 xzxy = int3((*(tint_symbol)).v).xzxy;
+  int4 xzxz = int3((*(tint_symbol)).v).xzxz;
+  int4 xzyx = int3((*(tint_symbol)).v).xzyx;
+  int4 xzyy = int3((*(tint_symbol)).v).xzyy;
+  int4 xzyz = int3((*(tint_symbol)).v).xzyz;
+  int4 xzzx = int3((*(tint_symbol)).v).xzzx;
+  int4 xzzy = int3((*(tint_symbol)).v).xzzy;
+  int4 xzzz = int3((*(tint_symbol)).v).xzzz;
+  int4 yxxx = int3((*(tint_symbol)).v).yxxx;
+  int4 yxxy = int3((*(tint_symbol)).v).yxxy;
+  int4 yxxz = int3((*(tint_symbol)).v).yxxz;
+  int4 yxyx = int3((*(tint_symbol)).v).yxyx;
+  int4 yxyy = int3((*(tint_symbol)).v).yxyy;
+  int4 yxyz = int3((*(tint_symbol)).v).yxyz;
+  int4 yxzx = int3((*(tint_symbol)).v).yxzx;
+  int4 yxzy = int3((*(tint_symbol)).v).yxzy;
+  int4 yxzz = int3((*(tint_symbol)).v).yxzz;
+  int4 yyxx = int3((*(tint_symbol)).v).yyxx;
+  int4 yyxy = int3((*(tint_symbol)).v).yyxy;
+  int4 yyxz = int3((*(tint_symbol)).v).yyxz;
+  int4 yyyx = int3((*(tint_symbol)).v).yyyx;
+  int4 yyyy = int3((*(tint_symbol)).v).yyyy;
+  int4 yyyz = int3((*(tint_symbol)).v).yyyz;
+  int4 yyzx = int3((*(tint_symbol)).v).yyzx;
+  int4 yyzy = int3((*(tint_symbol)).v).yyzy;
+  int4 yyzz = int3((*(tint_symbol)).v).yyzz;
+  int4 yzxx = int3((*(tint_symbol)).v).yzxx;
+  int4 yzxy = int3((*(tint_symbol)).v).yzxy;
+  int4 yzxz = int3((*(tint_symbol)).v).yzxz;
+  int4 yzyx = int3((*(tint_symbol)).v).yzyx;
+  int4 yzyy = int3((*(tint_symbol)).v).yzyy;
+  int4 yzyz = int3((*(tint_symbol)).v).yzyz;
+  int4 yzzx = int3((*(tint_symbol)).v).yzzx;
+  int4 yzzy = int3((*(tint_symbol)).v).yzzy;
+  int4 yzzz = int3((*(tint_symbol)).v).yzzz;
+  int4 zxxx = int3((*(tint_symbol)).v).zxxx;
+  int4 zxxy = int3((*(tint_symbol)).v).zxxy;
+  int4 zxxz = int3((*(tint_symbol)).v).zxxz;
+  int4 zxyx = int3((*(tint_symbol)).v).zxyx;
+  int4 zxyy = int3((*(tint_symbol)).v).zxyy;
+  int4 zxyz = int3((*(tint_symbol)).v).zxyz;
+  int4 zxzx = int3((*(tint_symbol)).v).zxzx;
+  int4 zxzy = int3((*(tint_symbol)).v).zxzy;
+  int4 zxzz = int3((*(tint_symbol)).v).zxzz;
+  int4 zyxx = int3((*(tint_symbol)).v).zyxx;
+  int4 zyxy = int3((*(tint_symbol)).v).zyxy;
+  int4 zyxz = int3((*(tint_symbol)).v).zyxz;
+  int4 zyyx = int3((*(tint_symbol)).v).zyyx;
+  int4 zyyy = int3((*(tint_symbol)).v).zyyy;
+  int4 zyyz = int3((*(tint_symbol)).v).zyyz;
+  int4 zyzx = int3((*(tint_symbol)).v).zyzx;
+  int4 zyzy = int3((*(tint_symbol)).v).zyzy;
+  int4 zyzz = int3((*(tint_symbol)).v).zyzz;
+  int4 zzxx = int3((*(tint_symbol)).v).zzxx;
+  int4 zzxy = int3((*(tint_symbol)).v).zzxy;
+  int4 zzxz = int3((*(tint_symbol)).v).zzxz;
+  int4 zzyx = int3((*(tint_symbol)).v).zzyx;
+  int4 zzyy = int3((*(tint_symbol)).v).zzyy;
+  int4 zzyz = int3((*(tint_symbol)).v).zzyz;
+  int4 zzzx = int3((*(tint_symbol)).v).zzzx;
+  int4 zzzy = int3((*(tint_symbol)).v).zzzy;
+  int4 zzzz = int3((*(tint_symbol)).v).zzzz;
+}
+
diff --git a/test/expressions/swizzle/read/vec3/i32.wgsl.expected.spvasm b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..87507a0
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,769 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 509
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %P "P"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpName %v "v"
+               OpName %x "x"
+               OpName %y "y"
+               OpName %z "z"
+               OpName %xx "xx"
+               OpName %xy "xy"
+               OpName %xz "xz"
+               OpName %yx "yx"
+               OpName %yy "yy"
+               OpName %yz "yz"
+               OpName %zx "zx"
+               OpName %zy "zy"
+               OpName %zz "zz"
+               OpName %xxx "xxx"
+               OpName %xxy "xxy"
+               OpName %xxz "xxz"
+               OpName %xyx "xyx"
+               OpName %xyy "xyy"
+               OpName %xyz "xyz"
+               OpName %xzx "xzx"
+               OpName %xzy "xzy"
+               OpName %xzz "xzz"
+               OpName %yxx "yxx"
+               OpName %yxy "yxy"
+               OpName %yxz "yxz"
+               OpName %yyx "yyx"
+               OpName %yyy "yyy"
+               OpName %yyz "yyz"
+               OpName %yzx "yzx"
+               OpName %yzy "yzy"
+               OpName %yzz "yzz"
+               OpName %zxx "zxx"
+               OpName %zxy "zxy"
+               OpName %zxz "zxz"
+               OpName %zyx "zyx"
+               OpName %zyy "zyy"
+               OpName %zyz "zyz"
+               OpName %zzx "zzx"
+               OpName %zzy "zzy"
+               OpName %zzz "zzz"
+               OpName %xxxx "xxxx"
+               OpName %xxxy "xxxy"
+               OpName %xxxz "xxxz"
+               OpName %xxyx "xxyx"
+               OpName %xxyy "xxyy"
+               OpName %xxyz "xxyz"
+               OpName %xxzx "xxzx"
+               OpName %xxzy "xxzy"
+               OpName %xxzz "xxzz"
+               OpName %xyxx "xyxx"
+               OpName %xyxy "xyxy"
+               OpName %xyxz "xyxz"
+               OpName %xyyx "xyyx"
+               OpName %xyyy "xyyy"
+               OpName %xyyz "xyyz"
+               OpName %xyzx "xyzx"
+               OpName %xyzy "xyzy"
+               OpName %xyzz "xyzz"
+               OpName %xzxx "xzxx"
+               OpName %xzxy "xzxy"
+               OpName %xzxz "xzxz"
+               OpName %xzyx "xzyx"
+               OpName %xzyy "xzyy"
+               OpName %xzyz "xzyz"
+               OpName %xzzx "xzzx"
+               OpName %xzzy "xzzy"
+               OpName %xzzz "xzzz"
+               OpName %yxxx "yxxx"
+               OpName %yxxy "yxxy"
+               OpName %yxxz "yxxz"
+               OpName %yxyx "yxyx"
+               OpName %yxyy "yxyy"
+               OpName %yxyz "yxyz"
+               OpName %yxzx "yxzx"
+               OpName %yxzy "yxzy"
+               OpName %yxzz "yxzz"
+               OpName %yyxx "yyxx"
+               OpName %yyxy "yyxy"
+               OpName %yyxz "yyxz"
+               OpName %yyyx "yyyx"
+               OpName %yyyy "yyyy"
+               OpName %yyyz "yyyz"
+               OpName %yyzx "yyzx"
+               OpName %yyzy "yyzy"
+               OpName %yyzz "yyzz"
+               OpName %yzxx "yzxx"
+               OpName %yzxy "yzxy"
+               OpName %yzxz "yzxz"
+               OpName %yzyx "yzyx"
+               OpName %yzyy "yzyy"
+               OpName %yzyz "yzyz"
+               OpName %yzzx "yzzx"
+               OpName %yzzy "yzzy"
+               OpName %yzzz "yzzz"
+               OpName %zxxx "zxxx"
+               OpName %zxxy "zxxy"
+               OpName %zxxz "zxxz"
+               OpName %zxyx "zxyx"
+               OpName %zxyy "zxyy"
+               OpName %zxyz "zxyz"
+               OpName %zxzx "zxzx"
+               OpName %zxzy "zxzy"
+               OpName %zxzz "zxzz"
+               OpName %zyxx "zyxx"
+               OpName %zyxy "zyxy"
+               OpName %zyxz "zyxz"
+               OpName %zyyx "zyyx"
+               OpName %zyyy "zyyy"
+               OpName %zyyz "zyyz"
+               OpName %zyzx "zyzx"
+               OpName %zyzy "zyzy"
+               OpName %zyzz "zyzz"
+               OpName %zzxx "zzxx"
+               OpName %zzxy "zzxy"
+               OpName %zzxz "zzxz"
+               OpName %zzyx "zzyx"
+               OpName %zzyy "zzyy"
+               OpName %zzyz "zzyz"
+               OpName %zzzx "zzzx"
+               OpName %zzzy "zzzy"
+               OpName %zzzz "zzzz"
+               OpMemberDecorate %S 0 Offset 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+          %S = OpTypeStruct %v3int
+%_ptr_Private_S = OpTypePointer Private %S
+          %6 = OpConstantNull %S
+          %P = OpVariable %_ptr_Private_S Private %6
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_v3int = OpTypePointer Private %v3int
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+         %20 = OpConstantNull %v3int
+%_ptr_Private_int = OpTypePointer Private %int
+%_ptr_Function_int = OpTypePointer Function %int
+         %26 = OpConstantNull %int
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+      %v2int = OpTypeVector %int 2
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+         %41 = OpConstantNull %v2int
+      %v4int = OpTypeVector %int 4
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+        %188 = OpConstantNull %v4int
+%unused_entry_point = OpFunction %void None %7
+         %10 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %7
+         %12 = OpLabel
+          %v = OpVariable %_ptr_Function_v3int Function %20
+          %x = OpVariable %_ptr_Function_int Function %26
+          %y = OpVariable %_ptr_Function_int Function %26
+          %z = OpVariable %_ptr_Function_int Function %26
+         %xx = OpVariable %_ptr_Function_v2int Function %41
+         %xy = OpVariable %_ptr_Function_v2int Function %41
+         %xz = OpVariable %_ptr_Function_v2int Function %41
+         %yx = OpVariable %_ptr_Function_v2int Function %41
+         %yy = OpVariable %_ptr_Function_v2int Function %41
+         %yz = OpVariable %_ptr_Function_v2int Function %41
+         %zx = OpVariable %_ptr_Function_v2int Function %41
+         %zy = OpVariable %_ptr_Function_v2int Function %41
+         %zz = OpVariable %_ptr_Function_v2int Function %41
+        %xxx = OpVariable %_ptr_Function_v3int Function %20
+        %xxy = OpVariable %_ptr_Function_v3int Function %20
+        %xxz = OpVariable %_ptr_Function_v3int Function %20
+        %xyx = OpVariable %_ptr_Function_v3int Function %20
+        %xyy = OpVariable %_ptr_Function_v3int Function %20
+        %xyz = OpVariable %_ptr_Function_v3int Function %20
+        %xzx = OpVariable %_ptr_Function_v3int Function %20
+        %xzy = OpVariable %_ptr_Function_v3int Function %20
+        %xzz = OpVariable %_ptr_Function_v3int Function %20
+        %yxx = OpVariable %_ptr_Function_v3int Function %20
+        %yxy = OpVariable %_ptr_Function_v3int Function %20
+        %yxz = OpVariable %_ptr_Function_v3int Function %20
+        %yyx = OpVariable %_ptr_Function_v3int Function %20
+        %yyy = OpVariable %_ptr_Function_v3int Function %20
+        %yyz = OpVariable %_ptr_Function_v3int Function %20
+        %yzx = OpVariable %_ptr_Function_v3int Function %20
+        %yzy = OpVariable %_ptr_Function_v3int Function %20
+        %yzz = OpVariable %_ptr_Function_v3int Function %20
+        %zxx = OpVariable %_ptr_Function_v3int Function %20
+        %zxy = OpVariable %_ptr_Function_v3int Function %20
+        %zxz = OpVariable %_ptr_Function_v3int Function %20
+        %zyx = OpVariable %_ptr_Function_v3int Function %20
+        %zyy = OpVariable %_ptr_Function_v3int Function %20
+        %zyz = OpVariable %_ptr_Function_v3int Function %20
+        %zzx = OpVariable %_ptr_Function_v3int Function %20
+        %zzy = OpVariable %_ptr_Function_v3int Function %20
+        %zzz = OpVariable %_ptr_Function_v3int Function %20
+       %xxxx = OpVariable %_ptr_Function_v4int Function %188
+       %xxxy = OpVariable %_ptr_Function_v4int Function %188
+       %xxxz = OpVariable %_ptr_Function_v4int Function %188
+       %xxyx = OpVariable %_ptr_Function_v4int Function %188
+       %xxyy = OpVariable %_ptr_Function_v4int Function %188
+       %xxyz = OpVariable %_ptr_Function_v4int Function %188
+       %xxzx = OpVariable %_ptr_Function_v4int Function %188
+       %xxzy = OpVariable %_ptr_Function_v4int Function %188
+       %xxzz = OpVariable %_ptr_Function_v4int Function %188
+       %xyxx = OpVariable %_ptr_Function_v4int Function %188
+       %xyxy = OpVariable %_ptr_Function_v4int Function %188
+       %xyxz = OpVariable %_ptr_Function_v4int Function %188
+       %xyyx = OpVariable %_ptr_Function_v4int Function %188
+       %xyyy = OpVariable %_ptr_Function_v4int Function %188
+       %xyyz = OpVariable %_ptr_Function_v4int Function %188
+       %xyzx = OpVariable %_ptr_Function_v4int Function %188
+       %xyzy = OpVariable %_ptr_Function_v4int Function %188
+       %xyzz = OpVariable %_ptr_Function_v4int Function %188
+       %xzxx = OpVariable %_ptr_Function_v4int Function %188
+       %xzxy = OpVariable %_ptr_Function_v4int Function %188
+       %xzxz = OpVariable %_ptr_Function_v4int Function %188
+       %xzyx = OpVariable %_ptr_Function_v4int Function %188
+       %xzyy = OpVariable %_ptr_Function_v4int Function %188
+       %xzyz = OpVariable %_ptr_Function_v4int Function %188
+       %xzzx = OpVariable %_ptr_Function_v4int Function %188
+       %xzzy = OpVariable %_ptr_Function_v4int Function %188
+       %xzzz = OpVariable %_ptr_Function_v4int Function %188
+       %yxxx = OpVariable %_ptr_Function_v4int Function %188
+       %yxxy = OpVariable %_ptr_Function_v4int Function %188
+       %yxxz = OpVariable %_ptr_Function_v4int Function %188
+       %yxyx = OpVariable %_ptr_Function_v4int Function %188
+       %yxyy = OpVariable %_ptr_Function_v4int Function %188
+       %yxyz = OpVariable %_ptr_Function_v4int Function %188
+       %yxzx = OpVariable %_ptr_Function_v4int Function %188
+       %yxzy = OpVariable %_ptr_Function_v4int Function %188
+       %yxzz = OpVariable %_ptr_Function_v4int Function %188
+       %yyxx = OpVariable %_ptr_Function_v4int Function %188
+       %yyxy = OpVariable %_ptr_Function_v4int Function %188
+       %yyxz = OpVariable %_ptr_Function_v4int Function %188
+       %yyyx = OpVariable %_ptr_Function_v4int Function %188
+       %yyyy = OpVariable %_ptr_Function_v4int Function %188
+       %yyyz = OpVariable %_ptr_Function_v4int Function %188
+       %yyzx = OpVariable %_ptr_Function_v4int Function %188
+       %yyzy = OpVariable %_ptr_Function_v4int Function %188
+       %yyzz = OpVariable %_ptr_Function_v4int Function %188
+       %yzxx = OpVariable %_ptr_Function_v4int Function %188
+       %yzxy = OpVariable %_ptr_Function_v4int Function %188
+       %yzxz = OpVariable %_ptr_Function_v4int Function %188
+       %yzyx = OpVariable %_ptr_Function_v4int Function %188
+       %yzyy = OpVariable %_ptr_Function_v4int Function %188
+       %yzyz = OpVariable %_ptr_Function_v4int Function %188
+       %yzzx = OpVariable %_ptr_Function_v4int Function %188
+       %yzzy = OpVariable %_ptr_Function_v4int Function %188
+       %yzzz = OpVariable %_ptr_Function_v4int Function %188
+       %zxxx = OpVariable %_ptr_Function_v4int Function %188
+       %zxxy = OpVariable %_ptr_Function_v4int Function %188
+       %zxxz = OpVariable %_ptr_Function_v4int Function %188
+       %zxyx = OpVariable %_ptr_Function_v4int Function %188
+       %zxyy = OpVariable %_ptr_Function_v4int Function %188
+       %zxyz = OpVariable %_ptr_Function_v4int Function %188
+       %zxzx = OpVariable %_ptr_Function_v4int Function %188
+       %zxzy = OpVariable %_ptr_Function_v4int Function %188
+       %zxzz = OpVariable %_ptr_Function_v4int Function %188
+       %zyxx = OpVariable %_ptr_Function_v4int Function %188
+       %zyxy = OpVariable %_ptr_Function_v4int Function %188
+       %zyxz = OpVariable %_ptr_Function_v4int Function %188
+       %zyyx = OpVariable %_ptr_Function_v4int Function %188
+       %zyyy = OpVariable %_ptr_Function_v4int Function %188
+       %zyyz = OpVariable %_ptr_Function_v4int Function %188
+       %zyzx = OpVariable %_ptr_Function_v4int Function %188
+       %zyzy = OpVariable %_ptr_Function_v4int Function %188
+       %zyzz = OpVariable %_ptr_Function_v4int Function %188
+       %zzxx = OpVariable %_ptr_Function_v4int Function %188
+       %zzxy = OpVariable %_ptr_Function_v4int Function %188
+       %zzxz = OpVariable %_ptr_Function_v4int Function %188
+       %zzyx = OpVariable %_ptr_Function_v4int Function %188
+       %zzyy = OpVariable %_ptr_Function_v4int Function %188
+       %zzyz = OpVariable %_ptr_Function_v4int Function %188
+       %zzzx = OpVariable %_ptr_Function_v4int Function %188
+       %zzzy = OpVariable %_ptr_Function_v4int Function %188
+       %zzzz = OpVariable %_ptr_Function_v4int Function %188
+         %16 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %17 = OpLoad %v3int %16
+               OpStore %v %17
+         %22 = OpAccessChain %_ptr_Private_int %P %uint_0 %uint_0
+         %23 = OpLoad %int %22
+               OpStore %x %23
+         %28 = OpAccessChain %_ptr_Private_int %P %uint_0 %uint_1
+         %29 = OpLoad %int %28
+               OpStore %y %29
+         %32 = OpAccessChain %_ptr_Private_int %P %uint_0 %uint_2
+         %33 = OpLoad %int %32
+               OpStore %z %33
+         %35 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %37 = OpLoad %v3int %35
+         %38 = OpVectorShuffle %v2int %37 %37 0 0
+               OpStore %xx %38
+         %42 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %43 = OpLoad %v3int %42
+         %44 = OpVectorShuffle %v2int %43 %43 0 1
+               OpStore %xy %44
+         %46 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %47 = OpLoad %v3int %46
+         %48 = OpVectorShuffle %v2int %47 %47 0 2
+               OpStore %xz %48
+         %50 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %51 = OpLoad %v3int %50
+         %52 = OpVectorShuffle %v2int %51 %51 1 0
+               OpStore %yx %52
+         %54 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %55 = OpLoad %v3int %54
+         %56 = OpVectorShuffle %v2int %55 %55 1 1
+               OpStore %yy %56
+         %58 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %59 = OpLoad %v3int %58
+         %60 = OpVectorShuffle %v2int %59 %59 1 2
+               OpStore %yz %60
+         %62 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %63 = OpLoad %v3int %62
+         %64 = OpVectorShuffle %v2int %63 %63 2 0
+               OpStore %zx %64
+         %66 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %67 = OpLoad %v3int %66
+         %68 = OpVectorShuffle %v2int %67 %67 2 1
+               OpStore %zy %68
+         %70 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %71 = OpLoad %v3int %70
+         %72 = OpVectorShuffle %v2int %71 %71 2 2
+               OpStore %zz %72
+         %74 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %75 = OpLoad %v3int %74
+         %76 = OpVectorShuffle %v3int %75 %75 0 0 0
+               OpStore %xxx %76
+         %78 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %79 = OpLoad %v3int %78
+         %80 = OpVectorShuffle %v3int %79 %79 0 0 1
+               OpStore %xxy %80
+         %82 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %83 = OpLoad %v3int %82
+         %84 = OpVectorShuffle %v3int %83 %83 0 0 2
+               OpStore %xxz %84
+         %86 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %87 = OpLoad %v3int %86
+         %88 = OpVectorShuffle %v3int %87 %87 0 1 0
+               OpStore %xyx %88
+         %90 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %91 = OpLoad %v3int %90
+         %92 = OpVectorShuffle %v3int %91 %91 0 1 1
+               OpStore %xyy %92
+         %94 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %95 = OpLoad %v3int %94
+         %96 = OpVectorShuffle %v3int %95 %95 0 1 2
+               OpStore %xyz %96
+         %98 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+         %99 = OpLoad %v3int %98
+        %100 = OpVectorShuffle %v3int %99 %99 0 2 0
+               OpStore %xzx %100
+        %102 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %103 = OpLoad %v3int %102
+        %104 = OpVectorShuffle %v3int %103 %103 0 2 1
+               OpStore %xzy %104
+        %106 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %107 = OpLoad %v3int %106
+        %108 = OpVectorShuffle %v3int %107 %107 0 2 2
+               OpStore %xzz %108
+        %110 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %111 = OpLoad %v3int %110
+        %112 = OpVectorShuffle %v3int %111 %111 1 0 0
+               OpStore %yxx %112
+        %114 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %115 = OpLoad %v3int %114
+        %116 = OpVectorShuffle %v3int %115 %115 1 0 1
+               OpStore %yxy %116
+        %118 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %119 = OpLoad %v3int %118
+        %120 = OpVectorShuffle %v3int %119 %119 1 0 2
+               OpStore %yxz %120
+        %122 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %123 = OpLoad %v3int %122
+        %124 = OpVectorShuffle %v3int %123 %123 1 1 0
+               OpStore %yyx %124
+        %126 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %127 = OpLoad %v3int %126
+        %128 = OpVectorShuffle %v3int %127 %127 1 1 1
+               OpStore %yyy %128
+        %130 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %131 = OpLoad %v3int %130
+        %132 = OpVectorShuffle %v3int %131 %131 1 1 2
+               OpStore %yyz %132
+        %134 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %135 = OpLoad %v3int %134
+        %136 = OpVectorShuffle %v3int %135 %135 1 2 0
+               OpStore %yzx %136
+        %138 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %139 = OpLoad %v3int %138
+        %140 = OpVectorShuffle %v3int %139 %139 1 2 1
+               OpStore %yzy %140
+        %142 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %143 = OpLoad %v3int %142
+        %144 = OpVectorShuffle %v3int %143 %143 1 2 2
+               OpStore %yzz %144
+        %146 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %147 = OpLoad %v3int %146
+        %148 = OpVectorShuffle %v3int %147 %147 2 0 0
+               OpStore %zxx %148
+        %150 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %151 = OpLoad %v3int %150
+        %152 = OpVectorShuffle %v3int %151 %151 2 0 1
+               OpStore %zxy %152
+        %154 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %155 = OpLoad %v3int %154
+        %156 = OpVectorShuffle %v3int %155 %155 2 0 2
+               OpStore %zxz %156
+        %158 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %159 = OpLoad %v3int %158
+        %160 = OpVectorShuffle %v3int %159 %159 2 1 0
+               OpStore %zyx %160
+        %162 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %163 = OpLoad %v3int %162
+        %164 = OpVectorShuffle %v3int %163 %163 2 1 1
+               OpStore %zyy %164
+        %166 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %167 = OpLoad %v3int %166
+        %168 = OpVectorShuffle %v3int %167 %167 2 1 2
+               OpStore %zyz %168
+        %170 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %171 = OpLoad %v3int %170
+        %172 = OpVectorShuffle %v3int %171 %171 2 2 0
+               OpStore %zzx %172
+        %174 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %175 = OpLoad %v3int %174
+        %176 = OpVectorShuffle %v3int %175 %175 2 2 1
+               OpStore %zzy %176
+        %178 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %179 = OpLoad %v3int %178
+        %180 = OpVectorShuffle %v3int %179 %179 2 2 2
+               OpStore %zzz %180
+        %182 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %184 = OpLoad %v3int %182
+        %185 = OpVectorShuffle %v4int %184 %184 0 0 0 0
+               OpStore %xxxx %185
+        %189 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %190 = OpLoad %v3int %189
+        %191 = OpVectorShuffle %v4int %190 %190 0 0 0 1
+               OpStore %xxxy %191
+        %193 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %194 = OpLoad %v3int %193
+        %195 = OpVectorShuffle %v4int %194 %194 0 0 0 2
+               OpStore %xxxz %195
+        %197 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %198 = OpLoad %v3int %197
+        %199 = OpVectorShuffle %v4int %198 %198 0 0 1 0
+               OpStore %xxyx %199
+        %201 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %202 = OpLoad %v3int %201
+        %203 = OpVectorShuffle %v4int %202 %202 0 0 1 1
+               OpStore %xxyy %203
+        %205 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %206 = OpLoad %v3int %205
+        %207 = OpVectorShuffle %v4int %206 %206 0 0 1 2
+               OpStore %xxyz %207
+        %209 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %210 = OpLoad %v3int %209
+        %211 = OpVectorShuffle %v4int %210 %210 0 0 2 0
+               OpStore %xxzx %211
+        %213 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %214 = OpLoad %v3int %213
+        %215 = OpVectorShuffle %v4int %214 %214 0 0 2 1
+               OpStore %xxzy %215
+        %217 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %218 = OpLoad %v3int %217
+        %219 = OpVectorShuffle %v4int %218 %218 0 0 2 2
+               OpStore %xxzz %219
+        %221 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %222 = OpLoad %v3int %221
+        %223 = OpVectorShuffle %v4int %222 %222 0 1 0 0
+               OpStore %xyxx %223
+        %225 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %226 = OpLoad %v3int %225
+        %227 = OpVectorShuffle %v4int %226 %226 0 1 0 1
+               OpStore %xyxy %227
+        %229 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %230 = OpLoad %v3int %229
+        %231 = OpVectorShuffle %v4int %230 %230 0 1 0 2
+               OpStore %xyxz %231
+        %233 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %234 = OpLoad %v3int %233
+        %235 = OpVectorShuffle %v4int %234 %234 0 1 1 0
+               OpStore %xyyx %235
+        %237 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %238 = OpLoad %v3int %237
+        %239 = OpVectorShuffle %v4int %238 %238 0 1 1 1
+               OpStore %xyyy %239
+        %241 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %242 = OpLoad %v3int %241
+        %243 = OpVectorShuffle %v4int %242 %242 0 1 1 2
+               OpStore %xyyz %243
+        %245 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %246 = OpLoad %v3int %245
+        %247 = OpVectorShuffle %v4int %246 %246 0 1 2 0
+               OpStore %xyzx %247
+        %249 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %250 = OpLoad %v3int %249
+        %251 = OpVectorShuffle %v4int %250 %250 0 1 2 1
+               OpStore %xyzy %251
+        %253 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %254 = OpLoad %v3int %253
+        %255 = OpVectorShuffle %v4int %254 %254 0 1 2 2
+               OpStore %xyzz %255
+        %257 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %258 = OpLoad %v3int %257
+        %259 = OpVectorShuffle %v4int %258 %258 0 2 0 0
+               OpStore %xzxx %259
+        %261 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %262 = OpLoad %v3int %261
+        %263 = OpVectorShuffle %v4int %262 %262 0 2 0 1
+               OpStore %xzxy %263
+        %265 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %266 = OpLoad %v3int %265
+        %267 = OpVectorShuffle %v4int %266 %266 0 2 0 2
+               OpStore %xzxz %267
+        %269 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %270 = OpLoad %v3int %269
+        %271 = OpVectorShuffle %v4int %270 %270 0 2 1 0
+               OpStore %xzyx %271
+        %273 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %274 = OpLoad %v3int %273
+        %275 = OpVectorShuffle %v4int %274 %274 0 2 1 1
+               OpStore %xzyy %275
+        %277 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %278 = OpLoad %v3int %277
+        %279 = OpVectorShuffle %v4int %278 %278 0 2 1 2
+               OpStore %xzyz %279
+        %281 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %282 = OpLoad %v3int %281
+        %283 = OpVectorShuffle %v4int %282 %282 0 2 2 0
+               OpStore %xzzx %283
+        %285 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %286 = OpLoad %v3int %285
+        %287 = OpVectorShuffle %v4int %286 %286 0 2 2 1
+               OpStore %xzzy %287
+        %289 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %290 = OpLoad %v3int %289
+        %291 = OpVectorShuffle %v4int %290 %290 0 2 2 2
+               OpStore %xzzz %291
+        %293 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %294 = OpLoad %v3int %293
+        %295 = OpVectorShuffle %v4int %294 %294 1 0 0 0
+               OpStore %yxxx %295
+        %297 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %298 = OpLoad %v3int %297
+        %299 = OpVectorShuffle %v4int %298 %298 1 0 0 1
+               OpStore %yxxy %299
+        %301 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %302 = OpLoad %v3int %301
+        %303 = OpVectorShuffle %v4int %302 %302 1 0 0 2
+               OpStore %yxxz %303
+        %305 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %306 = OpLoad %v3int %305
+        %307 = OpVectorShuffle %v4int %306 %306 1 0 1 0
+               OpStore %yxyx %307
+        %309 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %310 = OpLoad %v3int %309
+        %311 = OpVectorShuffle %v4int %310 %310 1 0 1 1
+               OpStore %yxyy %311
+        %313 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %314 = OpLoad %v3int %313
+        %315 = OpVectorShuffle %v4int %314 %314 1 0 1 2
+               OpStore %yxyz %315
+        %317 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %318 = OpLoad %v3int %317
+        %319 = OpVectorShuffle %v4int %318 %318 1 0 2 0
+               OpStore %yxzx %319
+        %321 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %322 = OpLoad %v3int %321
+        %323 = OpVectorShuffle %v4int %322 %322 1 0 2 1
+               OpStore %yxzy %323
+        %325 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %326 = OpLoad %v3int %325
+        %327 = OpVectorShuffle %v4int %326 %326 1 0 2 2
+               OpStore %yxzz %327
+        %329 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %330 = OpLoad %v3int %329
+        %331 = OpVectorShuffle %v4int %330 %330 1 1 0 0
+               OpStore %yyxx %331
+        %333 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %334 = OpLoad %v3int %333
+        %335 = OpVectorShuffle %v4int %334 %334 1 1 0 1
+               OpStore %yyxy %335
+        %337 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %338 = OpLoad %v3int %337
+        %339 = OpVectorShuffle %v4int %338 %338 1 1 0 2
+               OpStore %yyxz %339
+        %341 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %342 = OpLoad %v3int %341
+        %343 = OpVectorShuffle %v4int %342 %342 1 1 1 0
+               OpStore %yyyx %343
+        %345 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %346 = OpLoad %v3int %345
+        %347 = OpVectorShuffle %v4int %346 %346 1 1 1 1
+               OpStore %yyyy %347
+        %349 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %350 = OpLoad %v3int %349
+        %351 = OpVectorShuffle %v4int %350 %350 1 1 1 2
+               OpStore %yyyz %351
+        %353 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %354 = OpLoad %v3int %353
+        %355 = OpVectorShuffle %v4int %354 %354 1 1 2 0
+               OpStore %yyzx %355
+        %357 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %358 = OpLoad %v3int %357
+        %359 = OpVectorShuffle %v4int %358 %358 1 1 2 1
+               OpStore %yyzy %359
+        %361 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %362 = OpLoad %v3int %361
+        %363 = OpVectorShuffle %v4int %362 %362 1 1 2 2
+               OpStore %yyzz %363
+        %365 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %366 = OpLoad %v3int %365
+        %367 = OpVectorShuffle %v4int %366 %366 1 2 0 0
+               OpStore %yzxx %367
+        %369 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %370 = OpLoad %v3int %369
+        %371 = OpVectorShuffle %v4int %370 %370 1 2 0 1
+               OpStore %yzxy %371
+        %373 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %374 = OpLoad %v3int %373
+        %375 = OpVectorShuffle %v4int %374 %374 1 2 0 2
+               OpStore %yzxz %375
+        %377 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %378 = OpLoad %v3int %377
+        %379 = OpVectorShuffle %v4int %378 %378 1 2 1 0
+               OpStore %yzyx %379
+        %381 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %382 = OpLoad %v3int %381
+        %383 = OpVectorShuffle %v4int %382 %382 1 2 1 1
+               OpStore %yzyy %383
+        %385 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %386 = OpLoad %v3int %385
+        %387 = OpVectorShuffle %v4int %386 %386 1 2 1 2
+               OpStore %yzyz %387
+        %389 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %390 = OpLoad %v3int %389
+        %391 = OpVectorShuffle %v4int %390 %390 1 2 2 0
+               OpStore %yzzx %391
+        %393 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %394 = OpLoad %v3int %393
+        %395 = OpVectorShuffle %v4int %394 %394 1 2 2 1
+               OpStore %yzzy %395
+        %397 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %398 = OpLoad %v3int %397
+        %399 = OpVectorShuffle %v4int %398 %398 1 2 2 2
+               OpStore %yzzz %399
+        %401 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %402 = OpLoad %v3int %401
+        %403 = OpVectorShuffle %v4int %402 %402 2 0 0 0
+               OpStore %zxxx %403
+        %405 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %406 = OpLoad %v3int %405
+        %407 = OpVectorShuffle %v4int %406 %406 2 0 0 1
+               OpStore %zxxy %407
+        %409 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %410 = OpLoad %v3int %409
+        %411 = OpVectorShuffle %v4int %410 %410 2 0 0 2
+               OpStore %zxxz %411
+        %413 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %414 = OpLoad %v3int %413
+        %415 = OpVectorShuffle %v4int %414 %414 2 0 1 0
+               OpStore %zxyx %415
+        %417 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %418 = OpLoad %v3int %417
+        %419 = OpVectorShuffle %v4int %418 %418 2 0 1 1
+               OpStore %zxyy %419
+        %421 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %422 = OpLoad %v3int %421
+        %423 = OpVectorShuffle %v4int %422 %422 2 0 1 2
+               OpStore %zxyz %423
+        %425 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %426 = OpLoad %v3int %425
+        %427 = OpVectorShuffle %v4int %426 %426 2 0 2 0
+               OpStore %zxzx %427
+        %429 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %430 = OpLoad %v3int %429
+        %431 = OpVectorShuffle %v4int %430 %430 2 0 2 1
+               OpStore %zxzy %431
+        %433 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %434 = OpLoad %v3int %433
+        %435 = OpVectorShuffle %v4int %434 %434 2 0 2 2
+               OpStore %zxzz %435
+        %437 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %438 = OpLoad %v3int %437
+        %439 = OpVectorShuffle %v4int %438 %438 2 1 0 0
+               OpStore %zyxx %439
+        %441 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %442 = OpLoad %v3int %441
+        %443 = OpVectorShuffle %v4int %442 %442 2 1 0 1
+               OpStore %zyxy %443
+        %445 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %446 = OpLoad %v3int %445
+        %447 = OpVectorShuffle %v4int %446 %446 2 1 0 2
+               OpStore %zyxz %447
+        %449 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %450 = OpLoad %v3int %449
+        %451 = OpVectorShuffle %v4int %450 %450 2 1 1 0
+               OpStore %zyyx %451
+        %453 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %454 = OpLoad %v3int %453
+        %455 = OpVectorShuffle %v4int %454 %454 2 1 1 1
+               OpStore %zyyy %455
+        %457 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %458 = OpLoad %v3int %457
+        %459 = OpVectorShuffle %v4int %458 %458 2 1 1 2
+               OpStore %zyyz %459
+        %461 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %462 = OpLoad %v3int %461
+        %463 = OpVectorShuffle %v4int %462 %462 2 1 2 0
+               OpStore %zyzx %463
+        %465 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %466 = OpLoad %v3int %465
+        %467 = OpVectorShuffle %v4int %466 %466 2 1 2 1
+               OpStore %zyzy %467
+        %469 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %470 = OpLoad %v3int %469
+        %471 = OpVectorShuffle %v4int %470 %470 2 1 2 2
+               OpStore %zyzz %471
+        %473 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %474 = OpLoad %v3int %473
+        %475 = OpVectorShuffle %v4int %474 %474 2 2 0 0
+               OpStore %zzxx %475
+        %477 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %478 = OpLoad %v3int %477
+        %479 = OpVectorShuffle %v4int %478 %478 2 2 0 1
+               OpStore %zzxy %479
+        %481 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %482 = OpLoad %v3int %481
+        %483 = OpVectorShuffle %v4int %482 %482 2 2 0 2
+               OpStore %zzxz %483
+        %485 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %486 = OpLoad %v3int %485
+        %487 = OpVectorShuffle %v4int %486 %486 2 2 1 0
+               OpStore %zzyx %487
+        %489 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %490 = OpLoad %v3int %489
+        %491 = OpVectorShuffle %v4int %490 %490 2 2 1 1
+               OpStore %zzyy %491
+        %493 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %494 = OpLoad %v3int %493
+        %495 = OpVectorShuffle %v4int %494 %494 2 2 1 2
+               OpStore %zzyz %495
+        %497 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %498 = OpLoad %v3int %497
+        %499 = OpVectorShuffle %v4int %498 %498 2 2 2 0
+               OpStore %zzzx %499
+        %501 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %502 = OpLoad %v3int %501
+        %503 = OpVectorShuffle %v4int %502 %502 2 2 2 1
+               OpStore %zzzy %503
+        %505 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+        %506 = OpLoad %v3int %505
+        %507 = OpVectorShuffle %v4int %506 %506 2 2 2 2
+               OpStore %zzzz %507
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/read/vec3/i32.wgsl.expected.wgsl b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..9b440ce
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,129 @@
+struct S {
+  v : vec3<i32>;
+};
+
+var<private> P : S;
+
+fn f() {
+  var v = P.v;
+  var x = P.v.x;
+  var y = P.v.y;
+  var z = P.v.z;
+  var xx = P.v.xx;
+  var xy = P.v.xy;
+  var xz = P.v.xz;
+  var yx = P.v.yx;
+  var yy = P.v.yy;
+  var yz = P.v.yz;
+  var zx = P.v.zx;
+  var zy = P.v.zy;
+  var zz = P.v.zz;
+  var xxx = P.v.xxx;
+  var xxy = P.v.xxy;
+  var xxz = P.v.xxz;
+  var xyx = P.v.xyx;
+  var xyy = P.v.xyy;
+  var xyz = P.v.xyz;
+  var xzx = P.v.xzx;
+  var xzy = P.v.xzy;
+  var xzz = P.v.xzz;
+  var yxx = P.v.yxx;
+  var yxy = P.v.yxy;
+  var yxz = P.v.yxz;
+  var yyx = P.v.yyx;
+  var yyy = P.v.yyy;
+  var yyz = P.v.yyz;
+  var yzx = P.v.yzx;
+  var yzy = P.v.yzy;
+  var yzz = P.v.yzz;
+  var zxx = P.v.zxx;
+  var zxy = P.v.zxy;
+  var zxz = P.v.zxz;
+  var zyx = P.v.zyx;
+  var zyy = P.v.zyy;
+  var zyz = P.v.zyz;
+  var zzx = P.v.zzx;
+  var zzy = P.v.zzy;
+  var zzz = P.v.zzz;
+  var xxxx = P.v.xxxx;
+  var xxxy = P.v.xxxy;
+  var xxxz = P.v.xxxz;
+  var xxyx = P.v.xxyx;
+  var xxyy = P.v.xxyy;
+  var xxyz = P.v.xxyz;
+  var xxzx = P.v.xxzx;
+  var xxzy = P.v.xxzy;
+  var xxzz = P.v.xxzz;
+  var xyxx = P.v.xyxx;
+  var xyxy = P.v.xyxy;
+  var xyxz = P.v.xyxz;
+  var xyyx = P.v.xyyx;
+  var xyyy = P.v.xyyy;
+  var xyyz = P.v.xyyz;
+  var xyzx = P.v.xyzx;
+  var xyzy = P.v.xyzy;
+  var xyzz = P.v.xyzz;
+  var xzxx = P.v.xzxx;
+  var xzxy = P.v.xzxy;
+  var xzxz = P.v.xzxz;
+  var xzyx = P.v.xzyx;
+  var xzyy = P.v.xzyy;
+  var xzyz = P.v.xzyz;
+  var xzzx = P.v.xzzx;
+  var xzzy = P.v.xzzy;
+  var xzzz = P.v.xzzz;
+  var yxxx = P.v.yxxx;
+  var yxxy = P.v.yxxy;
+  var yxxz = P.v.yxxz;
+  var yxyx = P.v.yxyx;
+  var yxyy = P.v.yxyy;
+  var yxyz = P.v.yxyz;
+  var yxzx = P.v.yxzx;
+  var yxzy = P.v.yxzy;
+  var yxzz = P.v.yxzz;
+  var yyxx = P.v.yyxx;
+  var yyxy = P.v.yyxy;
+  var yyxz = P.v.yyxz;
+  var yyyx = P.v.yyyx;
+  var yyyy = P.v.yyyy;
+  var yyyz = P.v.yyyz;
+  var yyzx = P.v.yyzx;
+  var yyzy = P.v.yyzy;
+  var yyzz = P.v.yyzz;
+  var yzxx = P.v.yzxx;
+  var yzxy = P.v.yzxy;
+  var yzxz = P.v.yzxz;
+  var yzyx = P.v.yzyx;
+  var yzyy = P.v.yzyy;
+  var yzyz = P.v.yzyz;
+  var yzzx = P.v.yzzx;
+  var yzzy = P.v.yzzy;
+  var yzzz = P.v.yzzz;
+  var zxxx = P.v.zxxx;
+  var zxxy = P.v.zxxy;
+  var zxxz = P.v.zxxz;
+  var zxyx = P.v.zxyx;
+  var zxyy = P.v.zxyy;
+  var zxyz = P.v.zxyz;
+  var zxzx = P.v.zxzx;
+  var zxzy = P.v.zxzy;
+  var zxzz = P.v.zxzz;
+  var zyxx = P.v.zyxx;
+  var zyxy = P.v.zyxy;
+  var zyxz = P.v.zyxz;
+  var zyyx = P.v.zyyx;
+  var zyyy = P.v.zyyy;
+  var zyyz = P.v.zyyz;
+  var zyzx = P.v.zyzx;
+  var zyzy = P.v.zyzy;
+  var zyzz = P.v.zyzz;
+  var zzxx = P.v.zzxx;
+  var zzxy = P.v.zzxy;
+  var zzxz = P.v.zzxz;
+  var zzyx = P.v.zzyx;
+  var zzyy = P.v.zzyy;
+  var zzyz = P.v.zzyz;
+  var zzzx = P.v.zzzx;
+  var zzzy = P.v.zzzy;
+  var zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/u32.wgsl b/test/expressions/swizzle/read/vec3/u32.wgsl
new file mode 100644
index 0000000..73dbbaf
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/u32.wgsl
@@ -0,0 +1,143 @@
+struct S {
+    v: vec3<u32>;
+};
+
+var<private> P : S;
+
+fn f() {
+    var    v = P.v;
+
+    var    x = P.v.x;
+    var    y = P.v.y;
+    var    z = P.v.z;
+
+    var   xx = P.v.xx;
+    var   xy = P.v.xy;
+    var   xz = P.v.xz;
+    var   yx = P.v.yx;
+    var   yy = P.v.yy;
+    var   yz = P.v.yz;
+    var   zx = P.v.zx;
+    var   zy = P.v.zy;
+    var   zz = P.v.zz;
+
+    var  xxx = P.v.xxx;
+    var  xxy = P.v.xxy;
+    var  xxz = P.v.xxz;
+    var  xyx = P.v.xyx;
+    var  xyy = P.v.xyy;
+    var  xyz = P.v.xyz;
+    var  xzx = P.v.xzx;
+    var  xzy = P.v.xzy;
+    var  xzz = P.v.xzz;
+
+    var  yxx = P.v.yxx;
+    var  yxy = P.v.yxy;
+    var  yxz = P.v.yxz;
+    var  yyx = P.v.yyx;
+    var  yyy = P.v.yyy;
+    var  yyz = P.v.yyz;
+    var  yzx = P.v.yzx;
+    var  yzy = P.v.yzy;
+    var  yzz = P.v.yzz;
+
+    var  zxx = P.v.zxx;
+    var  zxy = P.v.zxy;
+    var  zxz = P.v.zxz;
+    var  zyx = P.v.zyx;
+    var  zyy = P.v.zyy;
+    var  zyz = P.v.zyz;
+    var  zzx = P.v.zzx;
+    var  zzy = P.v.zzy;
+    var  zzz = P.v.zzz;
+
+    var xxxx = P.v.xxxx;
+    var xxxy = P.v.xxxy;
+    var xxxz = P.v.xxxz;
+    var xxyx = P.v.xxyx;
+    var xxyy = P.v.xxyy;
+    var xxyz = P.v.xxyz;
+    var xxzx = P.v.xxzx;
+    var xxzy = P.v.xxzy;
+    var xxzz = P.v.xxzz;
+
+    var xyxx = P.v.xyxx;
+    var xyxy = P.v.xyxy;
+    var xyxz = P.v.xyxz;
+    var xyyx = P.v.xyyx;
+    var xyyy = P.v.xyyy;
+    var xyyz = P.v.xyyz;
+    var xyzx = P.v.xyzx;
+    var xyzy = P.v.xyzy;
+    var xyzz = P.v.xyzz;
+
+    var xzxx = P.v.xzxx;
+    var xzxy = P.v.xzxy;
+    var xzxz = P.v.xzxz;
+    var xzyx = P.v.xzyx;
+    var xzyy = P.v.xzyy;
+    var xzyz = P.v.xzyz;
+    var xzzx = P.v.xzzx;
+    var xzzy = P.v.xzzy;
+    var xzzz = P.v.xzzz;
+
+    var yxxx = P.v.yxxx;
+    var yxxy = P.v.yxxy;
+    var yxxz = P.v.yxxz;
+    var yxyx = P.v.yxyx;
+    var yxyy = P.v.yxyy;
+    var yxyz = P.v.yxyz;
+    var yxzx = P.v.yxzx;
+    var yxzy = P.v.yxzy;
+    var yxzz = P.v.yxzz;
+
+    var yyxx = P.v.yyxx;
+    var yyxy = P.v.yyxy;
+    var yyxz = P.v.yyxz;
+    var yyyx = P.v.yyyx;
+    var yyyy = P.v.yyyy;
+    var yyyz = P.v.yyyz;
+    var yyzx = P.v.yyzx;
+    var yyzy = P.v.yyzy;
+    var yyzz = P.v.yyzz;
+
+    var yzxx = P.v.yzxx;
+    var yzxy = P.v.yzxy;
+    var yzxz = P.v.yzxz;
+    var yzyx = P.v.yzyx;
+    var yzyy = P.v.yzyy;
+    var yzyz = P.v.yzyz;
+    var yzzx = P.v.yzzx;
+    var yzzy = P.v.yzzy;
+    var yzzz = P.v.yzzz;
+
+    var zxxx = P.v.zxxx;
+    var zxxy = P.v.zxxy;
+    var zxxz = P.v.zxxz;
+    var zxyx = P.v.zxyx;
+    var zxyy = P.v.zxyy;
+    var zxyz = P.v.zxyz;
+    var zxzx = P.v.zxzx;
+    var zxzy = P.v.zxzy;
+    var zxzz = P.v.zxzz;
+
+    var zyxx = P.v.zyxx;
+    var zyxy = P.v.zyxy;
+    var zyxz = P.v.zyxz;
+    var zyyx = P.v.zyyx;
+    var zyyy = P.v.zyyy;
+    var zyyz = P.v.zyyz;
+    var zyzx = P.v.zyzx;
+    var zyzy = P.v.zyzy;
+    var zyzz = P.v.zyzz;
+
+    var zzxx = P.v.zzxx;
+    var zzxy = P.v.zzxy;
+    var zzxz = P.v.zzxz;
+    var zzyx = P.v.zzyx;
+    var zzyy = P.v.zzyy;
+    var zzyz = P.v.zzyz;
+    var zzzx = P.v.zzzx;
+    var zzzy = P.v.zzzy;
+    var zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/u32.wgsl.expected.hlsl b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..79fb837
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,134 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+struct S {
+  uint3 v;
+};
+
+static S P = (S)0;
+
+void f() {
+  uint3 v = P.v;
+  uint x = P.v.x;
+  uint y = P.v.y;
+  uint z = P.v.z;
+  uint2 xx = P.v.xx;
+  uint2 xy = P.v.xy;
+  uint2 xz = P.v.xz;
+  uint2 yx = P.v.yx;
+  uint2 yy = P.v.yy;
+  uint2 yz = P.v.yz;
+  uint2 zx = P.v.zx;
+  uint2 zy = P.v.zy;
+  uint2 zz = P.v.zz;
+  uint3 xxx = P.v.xxx;
+  uint3 xxy = P.v.xxy;
+  uint3 xxz = P.v.xxz;
+  uint3 xyx = P.v.xyx;
+  uint3 xyy = P.v.xyy;
+  uint3 xyz = P.v.xyz;
+  uint3 xzx = P.v.xzx;
+  uint3 xzy = P.v.xzy;
+  uint3 xzz = P.v.xzz;
+  uint3 yxx = P.v.yxx;
+  uint3 yxy = P.v.yxy;
+  uint3 yxz = P.v.yxz;
+  uint3 yyx = P.v.yyx;
+  uint3 yyy = P.v.yyy;
+  uint3 yyz = P.v.yyz;
+  uint3 yzx = P.v.yzx;
+  uint3 yzy = P.v.yzy;
+  uint3 yzz = P.v.yzz;
+  uint3 zxx = P.v.zxx;
+  uint3 zxy = P.v.zxy;
+  uint3 zxz = P.v.zxz;
+  uint3 zyx = P.v.zyx;
+  uint3 zyy = P.v.zyy;
+  uint3 zyz = P.v.zyz;
+  uint3 zzx = P.v.zzx;
+  uint3 zzy = P.v.zzy;
+  uint3 zzz = P.v.zzz;
+  uint4 xxxx = P.v.xxxx;
+  uint4 xxxy = P.v.xxxy;
+  uint4 xxxz = P.v.xxxz;
+  uint4 xxyx = P.v.xxyx;
+  uint4 xxyy = P.v.xxyy;
+  uint4 xxyz = P.v.xxyz;
+  uint4 xxzx = P.v.xxzx;
+  uint4 xxzy = P.v.xxzy;
+  uint4 xxzz = P.v.xxzz;
+  uint4 xyxx = P.v.xyxx;
+  uint4 xyxy = P.v.xyxy;
+  uint4 xyxz = P.v.xyxz;
+  uint4 xyyx = P.v.xyyx;
+  uint4 xyyy = P.v.xyyy;
+  uint4 xyyz = P.v.xyyz;
+  uint4 xyzx = P.v.xyzx;
+  uint4 xyzy = P.v.xyzy;
+  uint4 xyzz = P.v.xyzz;
+  uint4 xzxx = P.v.xzxx;
+  uint4 xzxy = P.v.xzxy;
+  uint4 xzxz = P.v.xzxz;
+  uint4 xzyx = P.v.xzyx;
+  uint4 xzyy = P.v.xzyy;
+  uint4 xzyz = P.v.xzyz;
+  uint4 xzzx = P.v.xzzx;
+  uint4 xzzy = P.v.xzzy;
+  uint4 xzzz = P.v.xzzz;
+  uint4 yxxx = P.v.yxxx;
+  uint4 yxxy = P.v.yxxy;
+  uint4 yxxz = P.v.yxxz;
+  uint4 yxyx = P.v.yxyx;
+  uint4 yxyy = P.v.yxyy;
+  uint4 yxyz = P.v.yxyz;
+  uint4 yxzx = P.v.yxzx;
+  uint4 yxzy = P.v.yxzy;
+  uint4 yxzz = P.v.yxzz;
+  uint4 yyxx = P.v.yyxx;
+  uint4 yyxy = P.v.yyxy;
+  uint4 yyxz = P.v.yyxz;
+  uint4 yyyx = P.v.yyyx;
+  uint4 yyyy = P.v.yyyy;
+  uint4 yyyz = P.v.yyyz;
+  uint4 yyzx = P.v.yyzx;
+  uint4 yyzy = P.v.yyzy;
+  uint4 yyzz = P.v.yyzz;
+  uint4 yzxx = P.v.yzxx;
+  uint4 yzxy = P.v.yzxy;
+  uint4 yzxz = P.v.yzxz;
+  uint4 yzyx = P.v.yzyx;
+  uint4 yzyy = P.v.yzyy;
+  uint4 yzyz = P.v.yzyz;
+  uint4 yzzx = P.v.yzzx;
+  uint4 yzzy = P.v.yzzy;
+  uint4 yzzz = P.v.yzzz;
+  uint4 zxxx = P.v.zxxx;
+  uint4 zxxy = P.v.zxxy;
+  uint4 zxxz = P.v.zxxz;
+  uint4 zxyx = P.v.zxyx;
+  uint4 zxyy = P.v.zxyy;
+  uint4 zxyz = P.v.zxyz;
+  uint4 zxzx = P.v.zxzx;
+  uint4 zxzy = P.v.zxzy;
+  uint4 zxzz = P.v.zxzz;
+  uint4 zyxx = P.v.zyxx;
+  uint4 zyxy = P.v.zyxy;
+  uint4 zyxz = P.v.zyxz;
+  uint4 zyyx = P.v.zyyx;
+  uint4 zyyy = P.v.zyyy;
+  uint4 zyyz = P.v.zyyz;
+  uint4 zyzx = P.v.zyzx;
+  uint4 zyzy = P.v.zyzy;
+  uint4 zyzz = P.v.zyzz;
+  uint4 zzxx = P.v.zzxx;
+  uint4 zzxy = P.v.zzxy;
+  uint4 zzxz = P.v.zzxz;
+  uint4 zzyx = P.v.zzyx;
+  uint4 zzyy = P.v.zzyy;
+  uint4 zzyz = P.v.zzyz;
+  uint4 zzzx = P.v.zzzx;
+  uint4 zzzy = P.v.zzzy;
+  uint4 zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/read/vec3/u32.wgsl.expected.msl b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..61bc87d
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.msl
@@ -0,0 +1,131 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  uint3 v;
+};
+
+void f(thread S* const tint_symbol) {
+  uint3 v = (*(tint_symbol)).v;
+  uint x = (*(tint_symbol)).v[0];
+  uint y = (*(tint_symbol)).v[1];
+  uint z = (*(tint_symbol)).v[2];
+  uint2 xx = uint3((*(tint_symbol)).v).xx;
+  uint2 xy = uint3((*(tint_symbol)).v).xy;
+  uint2 xz = uint3((*(tint_symbol)).v).xz;
+  uint2 yx = uint3((*(tint_symbol)).v).yx;
+  uint2 yy = uint3((*(tint_symbol)).v).yy;
+  uint2 yz = uint3((*(tint_symbol)).v).yz;
+  uint2 zx = uint3((*(tint_symbol)).v).zx;
+  uint2 zy = uint3((*(tint_symbol)).v).zy;
+  uint2 zz = uint3((*(tint_symbol)).v).zz;
+  uint3 xxx = uint3((*(tint_symbol)).v).xxx;
+  uint3 xxy = uint3((*(tint_symbol)).v).xxy;
+  uint3 xxz = uint3((*(tint_symbol)).v).xxz;
+  uint3 xyx = uint3((*(tint_symbol)).v).xyx;
+  uint3 xyy = uint3((*(tint_symbol)).v).xyy;
+  uint3 xyz = uint3((*(tint_symbol)).v).xyz;
+  uint3 xzx = uint3((*(tint_symbol)).v).xzx;
+  uint3 xzy = uint3((*(tint_symbol)).v).xzy;
+  uint3 xzz = uint3((*(tint_symbol)).v).xzz;
+  uint3 yxx = uint3((*(tint_symbol)).v).yxx;
+  uint3 yxy = uint3((*(tint_symbol)).v).yxy;
+  uint3 yxz = uint3((*(tint_symbol)).v).yxz;
+  uint3 yyx = uint3((*(tint_symbol)).v).yyx;
+  uint3 yyy = uint3((*(tint_symbol)).v).yyy;
+  uint3 yyz = uint3((*(tint_symbol)).v).yyz;
+  uint3 yzx = uint3((*(tint_symbol)).v).yzx;
+  uint3 yzy = uint3((*(tint_symbol)).v).yzy;
+  uint3 yzz = uint3((*(tint_symbol)).v).yzz;
+  uint3 zxx = uint3((*(tint_symbol)).v).zxx;
+  uint3 zxy = uint3((*(tint_symbol)).v).zxy;
+  uint3 zxz = uint3((*(tint_symbol)).v).zxz;
+  uint3 zyx = uint3((*(tint_symbol)).v).zyx;
+  uint3 zyy = uint3((*(tint_symbol)).v).zyy;
+  uint3 zyz = uint3((*(tint_symbol)).v).zyz;
+  uint3 zzx = uint3((*(tint_symbol)).v).zzx;
+  uint3 zzy = uint3((*(tint_symbol)).v).zzy;
+  uint3 zzz = uint3((*(tint_symbol)).v).zzz;
+  uint4 xxxx = uint3((*(tint_symbol)).v).xxxx;
+  uint4 xxxy = uint3((*(tint_symbol)).v).xxxy;
+  uint4 xxxz = uint3((*(tint_symbol)).v).xxxz;
+  uint4 xxyx = uint3((*(tint_symbol)).v).xxyx;
+  uint4 xxyy = uint3((*(tint_symbol)).v).xxyy;
+  uint4 xxyz = uint3((*(tint_symbol)).v).xxyz;
+  uint4 xxzx = uint3((*(tint_symbol)).v).xxzx;
+  uint4 xxzy = uint3((*(tint_symbol)).v).xxzy;
+  uint4 xxzz = uint3((*(tint_symbol)).v).xxzz;
+  uint4 xyxx = uint3((*(tint_symbol)).v).xyxx;
+  uint4 xyxy = uint3((*(tint_symbol)).v).xyxy;
+  uint4 xyxz = uint3((*(tint_symbol)).v).xyxz;
+  uint4 xyyx = uint3((*(tint_symbol)).v).xyyx;
+  uint4 xyyy = uint3((*(tint_symbol)).v).xyyy;
+  uint4 xyyz = uint3((*(tint_symbol)).v).xyyz;
+  uint4 xyzx = uint3((*(tint_symbol)).v).xyzx;
+  uint4 xyzy = uint3((*(tint_symbol)).v).xyzy;
+  uint4 xyzz = uint3((*(tint_symbol)).v).xyzz;
+  uint4 xzxx = uint3((*(tint_symbol)).v).xzxx;
+  uint4 xzxy = uint3((*(tint_symbol)).v).xzxy;
+  uint4 xzxz = uint3((*(tint_symbol)).v).xzxz;
+  uint4 xzyx = uint3((*(tint_symbol)).v).xzyx;
+  uint4 xzyy = uint3((*(tint_symbol)).v).xzyy;
+  uint4 xzyz = uint3((*(tint_symbol)).v).xzyz;
+  uint4 xzzx = uint3((*(tint_symbol)).v).xzzx;
+  uint4 xzzy = uint3((*(tint_symbol)).v).xzzy;
+  uint4 xzzz = uint3((*(tint_symbol)).v).xzzz;
+  uint4 yxxx = uint3((*(tint_symbol)).v).yxxx;
+  uint4 yxxy = uint3((*(tint_symbol)).v).yxxy;
+  uint4 yxxz = uint3((*(tint_symbol)).v).yxxz;
+  uint4 yxyx = uint3((*(tint_symbol)).v).yxyx;
+  uint4 yxyy = uint3((*(tint_symbol)).v).yxyy;
+  uint4 yxyz = uint3((*(tint_symbol)).v).yxyz;
+  uint4 yxzx = uint3((*(tint_symbol)).v).yxzx;
+  uint4 yxzy = uint3((*(tint_symbol)).v).yxzy;
+  uint4 yxzz = uint3((*(tint_symbol)).v).yxzz;
+  uint4 yyxx = uint3((*(tint_symbol)).v).yyxx;
+  uint4 yyxy = uint3((*(tint_symbol)).v).yyxy;
+  uint4 yyxz = uint3((*(tint_symbol)).v).yyxz;
+  uint4 yyyx = uint3((*(tint_symbol)).v).yyyx;
+  uint4 yyyy = uint3((*(tint_symbol)).v).yyyy;
+  uint4 yyyz = uint3((*(tint_symbol)).v).yyyz;
+  uint4 yyzx = uint3((*(tint_symbol)).v).yyzx;
+  uint4 yyzy = uint3((*(tint_symbol)).v).yyzy;
+  uint4 yyzz = uint3((*(tint_symbol)).v).yyzz;
+  uint4 yzxx = uint3((*(tint_symbol)).v).yzxx;
+  uint4 yzxy = uint3((*(tint_symbol)).v).yzxy;
+  uint4 yzxz = uint3((*(tint_symbol)).v).yzxz;
+  uint4 yzyx = uint3((*(tint_symbol)).v).yzyx;
+  uint4 yzyy = uint3((*(tint_symbol)).v).yzyy;
+  uint4 yzyz = uint3((*(tint_symbol)).v).yzyz;
+  uint4 yzzx = uint3((*(tint_symbol)).v).yzzx;
+  uint4 yzzy = uint3((*(tint_symbol)).v).yzzy;
+  uint4 yzzz = uint3((*(tint_symbol)).v).yzzz;
+  uint4 zxxx = uint3((*(tint_symbol)).v).zxxx;
+  uint4 zxxy = uint3((*(tint_symbol)).v).zxxy;
+  uint4 zxxz = uint3((*(tint_symbol)).v).zxxz;
+  uint4 zxyx = uint3((*(tint_symbol)).v).zxyx;
+  uint4 zxyy = uint3((*(tint_symbol)).v).zxyy;
+  uint4 zxyz = uint3((*(tint_symbol)).v).zxyz;
+  uint4 zxzx = uint3((*(tint_symbol)).v).zxzx;
+  uint4 zxzy = uint3((*(tint_symbol)).v).zxzy;
+  uint4 zxzz = uint3((*(tint_symbol)).v).zxzz;
+  uint4 zyxx = uint3((*(tint_symbol)).v).zyxx;
+  uint4 zyxy = uint3((*(tint_symbol)).v).zyxy;
+  uint4 zyxz = uint3((*(tint_symbol)).v).zyxz;
+  uint4 zyyx = uint3((*(tint_symbol)).v).zyyx;
+  uint4 zyyy = uint3((*(tint_symbol)).v).zyyy;
+  uint4 zyyz = uint3((*(tint_symbol)).v).zyyz;
+  uint4 zyzx = uint3((*(tint_symbol)).v).zyzx;
+  uint4 zyzy = uint3((*(tint_symbol)).v).zyzy;
+  uint4 zyzz = uint3((*(tint_symbol)).v).zyzz;
+  uint4 zzxx = uint3((*(tint_symbol)).v).zzxx;
+  uint4 zzxy = uint3((*(tint_symbol)).v).zzxy;
+  uint4 zzxz = uint3((*(tint_symbol)).v).zzxz;
+  uint4 zzyx = uint3((*(tint_symbol)).v).zzyx;
+  uint4 zzyy = uint3((*(tint_symbol)).v).zzyy;
+  uint4 zzyz = uint3((*(tint_symbol)).v).zzyz;
+  uint4 zzzx = uint3((*(tint_symbol)).v).zzzx;
+  uint4 zzzy = uint3((*(tint_symbol)).v).zzzy;
+  uint4 zzzz = uint3((*(tint_symbol)).v).zzzz;
+}
+
diff --git a/test/expressions/swizzle/read/vec3/u32.wgsl.expected.spvasm b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..5ded792
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,768 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 508
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %P "P"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpName %v "v"
+               OpName %x "x"
+               OpName %y "y"
+               OpName %z "z"
+               OpName %xx "xx"
+               OpName %xy "xy"
+               OpName %xz "xz"
+               OpName %yx "yx"
+               OpName %yy "yy"
+               OpName %yz "yz"
+               OpName %zx "zx"
+               OpName %zy "zy"
+               OpName %zz "zz"
+               OpName %xxx "xxx"
+               OpName %xxy "xxy"
+               OpName %xxz "xxz"
+               OpName %xyx "xyx"
+               OpName %xyy "xyy"
+               OpName %xyz "xyz"
+               OpName %xzx "xzx"
+               OpName %xzy "xzy"
+               OpName %xzz "xzz"
+               OpName %yxx "yxx"
+               OpName %yxy "yxy"
+               OpName %yxz "yxz"
+               OpName %yyx "yyx"
+               OpName %yyy "yyy"
+               OpName %yyz "yyz"
+               OpName %yzx "yzx"
+               OpName %yzy "yzy"
+               OpName %yzz "yzz"
+               OpName %zxx "zxx"
+               OpName %zxy "zxy"
+               OpName %zxz "zxz"
+               OpName %zyx "zyx"
+               OpName %zyy "zyy"
+               OpName %zyz "zyz"
+               OpName %zzx "zzx"
+               OpName %zzy "zzy"
+               OpName %zzz "zzz"
+               OpName %xxxx "xxxx"
+               OpName %xxxy "xxxy"
+               OpName %xxxz "xxxz"
+               OpName %xxyx "xxyx"
+               OpName %xxyy "xxyy"
+               OpName %xxyz "xxyz"
+               OpName %xxzx "xxzx"
+               OpName %xxzy "xxzy"
+               OpName %xxzz "xxzz"
+               OpName %xyxx "xyxx"
+               OpName %xyxy "xyxy"
+               OpName %xyxz "xyxz"
+               OpName %xyyx "xyyx"
+               OpName %xyyy "xyyy"
+               OpName %xyyz "xyyz"
+               OpName %xyzx "xyzx"
+               OpName %xyzy "xyzy"
+               OpName %xyzz "xyzz"
+               OpName %xzxx "xzxx"
+               OpName %xzxy "xzxy"
+               OpName %xzxz "xzxz"
+               OpName %xzyx "xzyx"
+               OpName %xzyy "xzyy"
+               OpName %xzyz "xzyz"
+               OpName %xzzx "xzzx"
+               OpName %xzzy "xzzy"
+               OpName %xzzz "xzzz"
+               OpName %yxxx "yxxx"
+               OpName %yxxy "yxxy"
+               OpName %yxxz "yxxz"
+               OpName %yxyx "yxyx"
+               OpName %yxyy "yxyy"
+               OpName %yxyz "yxyz"
+               OpName %yxzx "yxzx"
+               OpName %yxzy "yxzy"
+               OpName %yxzz "yxzz"
+               OpName %yyxx "yyxx"
+               OpName %yyxy "yyxy"
+               OpName %yyxz "yyxz"
+               OpName %yyyx "yyyx"
+               OpName %yyyy "yyyy"
+               OpName %yyyz "yyyz"
+               OpName %yyzx "yyzx"
+               OpName %yyzy "yyzy"
+               OpName %yyzz "yyzz"
+               OpName %yzxx "yzxx"
+               OpName %yzxy "yzxy"
+               OpName %yzxz "yzxz"
+               OpName %yzyx "yzyx"
+               OpName %yzyy "yzyy"
+               OpName %yzyz "yzyz"
+               OpName %yzzx "yzzx"
+               OpName %yzzy "yzzy"
+               OpName %yzzz "yzzz"
+               OpName %zxxx "zxxx"
+               OpName %zxxy "zxxy"
+               OpName %zxxz "zxxz"
+               OpName %zxyx "zxyx"
+               OpName %zxyy "zxyy"
+               OpName %zxyz "zxyz"
+               OpName %zxzx "zxzx"
+               OpName %zxzy "zxzy"
+               OpName %zxzz "zxzz"
+               OpName %zyxx "zyxx"
+               OpName %zyxy "zyxy"
+               OpName %zyxz "zyxz"
+               OpName %zyyx "zyyx"
+               OpName %zyyy "zyyy"
+               OpName %zyyz "zyyz"
+               OpName %zyzx "zyzx"
+               OpName %zyzy "zyzy"
+               OpName %zyzz "zyzz"
+               OpName %zzxx "zzxx"
+               OpName %zzxy "zzxy"
+               OpName %zzxz "zzxz"
+               OpName %zzyx "zzyx"
+               OpName %zzyy "zzyy"
+               OpName %zzyz "zzyz"
+               OpName %zzzx "zzzx"
+               OpName %zzzy "zzzy"
+               OpName %zzzz "zzzz"
+               OpMemberDecorate %S 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+          %S = OpTypeStruct %v3uint
+%_ptr_Private_S = OpTypePointer Private %S
+          %6 = OpConstantNull %S
+          %P = OpVariable %_ptr_Private_S Private %6
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+         %19 = OpConstantNull %v3uint
+%_ptr_Private_uint = OpTypePointer Private %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+         %25 = OpConstantNull %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %v2uint = OpTypeVector %uint 2
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+         %40 = OpConstantNull %v2uint
+     %v4uint = OpTypeVector %uint 4
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+        %187 = OpConstantNull %v4uint
+%unused_entry_point = OpFunction %void None %7
+         %10 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %7
+         %12 = OpLabel
+          %v = OpVariable %_ptr_Function_v3uint Function %19
+          %x = OpVariable %_ptr_Function_uint Function %25
+          %y = OpVariable %_ptr_Function_uint Function %25
+          %z = OpVariable %_ptr_Function_uint Function %25
+         %xx = OpVariable %_ptr_Function_v2uint Function %40
+         %xy = OpVariable %_ptr_Function_v2uint Function %40
+         %xz = OpVariable %_ptr_Function_v2uint Function %40
+         %yx = OpVariable %_ptr_Function_v2uint Function %40
+         %yy = OpVariable %_ptr_Function_v2uint Function %40
+         %yz = OpVariable %_ptr_Function_v2uint Function %40
+         %zx = OpVariable %_ptr_Function_v2uint Function %40
+         %zy = OpVariable %_ptr_Function_v2uint Function %40
+         %zz = OpVariable %_ptr_Function_v2uint Function %40
+        %xxx = OpVariable %_ptr_Function_v3uint Function %19
+        %xxy = OpVariable %_ptr_Function_v3uint Function %19
+        %xxz = OpVariable %_ptr_Function_v3uint Function %19
+        %xyx = OpVariable %_ptr_Function_v3uint Function %19
+        %xyy = OpVariable %_ptr_Function_v3uint Function %19
+        %xyz = OpVariable %_ptr_Function_v3uint Function %19
+        %xzx = OpVariable %_ptr_Function_v3uint Function %19
+        %xzy = OpVariable %_ptr_Function_v3uint Function %19
+        %xzz = OpVariable %_ptr_Function_v3uint Function %19
+        %yxx = OpVariable %_ptr_Function_v3uint Function %19
+        %yxy = OpVariable %_ptr_Function_v3uint Function %19
+        %yxz = OpVariable %_ptr_Function_v3uint Function %19
+        %yyx = OpVariable %_ptr_Function_v3uint Function %19
+        %yyy = OpVariable %_ptr_Function_v3uint Function %19
+        %yyz = OpVariable %_ptr_Function_v3uint Function %19
+        %yzx = OpVariable %_ptr_Function_v3uint Function %19
+        %yzy = OpVariable %_ptr_Function_v3uint Function %19
+        %yzz = OpVariable %_ptr_Function_v3uint Function %19
+        %zxx = OpVariable %_ptr_Function_v3uint Function %19
+        %zxy = OpVariable %_ptr_Function_v3uint Function %19
+        %zxz = OpVariable %_ptr_Function_v3uint Function %19
+        %zyx = OpVariable %_ptr_Function_v3uint Function %19
+        %zyy = OpVariable %_ptr_Function_v3uint Function %19
+        %zyz = OpVariable %_ptr_Function_v3uint Function %19
+        %zzx = OpVariable %_ptr_Function_v3uint Function %19
+        %zzy = OpVariable %_ptr_Function_v3uint Function %19
+        %zzz = OpVariable %_ptr_Function_v3uint Function %19
+       %xxxx = OpVariable %_ptr_Function_v4uint Function %187
+       %xxxy = OpVariable %_ptr_Function_v4uint Function %187
+       %xxxz = OpVariable %_ptr_Function_v4uint Function %187
+       %xxyx = OpVariable %_ptr_Function_v4uint Function %187
+       %xxyy = OpVariable %_ptr_Function_v4uint Function %187
+       %xxyz = OpVariable %_ptr_Function_v4uint Function %187
+       %xxzx = OpVariable %_ptr_Function_v4uint Function %187
+       %xxzy = OpVariable %_ptr_Function_v4uint Function %187
+       %xxzz = OpVariable %_ptr_Function_v4uint Function %187
+       %xyxx = OpVariable %_ptr_Function_v4uint Function %187
+       %xyxy = OpVariable %_ptr_Function_v4uint Function %187
+       %xyxz = OpVariable %_ptr_Function_v4uint Function %187
+       %xyyx = OpVariable %_ptr_Function_v4uint Function %187
+       %xyyy = OpVariable %_ptr_Function_v4uint Function %187
+       %xyyz = OpVariable %_ptr_Function_v4uint Function %187
+       %xyzx = OpVariable %_ptr_Function_v4uint Function %187
+       %xyzy = OpVariable %_ptr_Function_v4uint Function %187
+       %xyzz = OpVariable %_ptr_Function_v4uint Function %187
+       %xzxx = OpVariable %_ptr_Function_v4uint Function %187
+       %xzxy = OpVariable %_ptr_Function_v4uint Function %187
+       %xzxz = OpVariable %_ptr_Function_v4uint Function %187
+       %xzyx = OpVariable %_ptr_Function_v4uint Function %187
+       %xzyy = OpVariable %_ptr_Function_v4uint Function %187
+       %xzyz = OpVariable %_ptr_Function_v4uint Function %187
+       %xzzx = OpVariable %_ptr_Function_v4uint Function %187
+       %xzzy = OpVariable %_ptr_Function_v4uint Function %187
+       %xzzz = OpVariable %_ptr_Function_v4uint Function %187
+       %yxxx = OpVariable %_ptr_Function_v4uint Function %187
+       %yxxy = OpVariable %_ptr_Function_v4uint Function %187
+       %yxxz = OpVariable %_ptr_Function_v4uint Function %187
+       %yxyx = OpVariable %_ptr_Function_v4uint Function %187
+       %yxyy = OpVariable %_ptr_Function_v4uint Function %187
+       %yxyz = OpVariable %_ptr_Function_v4uint Function %187
+       %yxzx = OpVariable %_ptr_Function_v4uint Function %187
+       %yxzy = OpVariable %_ptr_Function_v4uint Function %187
+       %yxzz = OpVariable %_ptr_Function_v4uint Function %187
+       %yyxx = OpVariable %_ptr_Function_v4uint Function %187
+       %yyxy = OpVariable %_ptr_Function_v4uint Function %187
+       %yyxz = OpVariable %_ptr_Function_v4uint Function %187
+       %yyyx = OpVariable %_ptr_Function_v4uint Function %187
+       %yyyy = OpVariable %_ptr_Function_v4uint Function %187
+       %yyyz = OpVariable %_ptr_Function_v4uint Function %187
+       %yyzx = OpVariable %_ptr_Function_v4uint Function %187
+       %yyzy = OpVariable %_ptr_Function_v4uint Function %187
+       %yyzz = OpVariable %_ptr_Function_v4uint Function %187
+       %yzxx = OpVariable %_ptr_Function_v4uint Function %187
+       %yzxy = OpVariable %_ptr_Function_v4uint Function %187
+       %yzxz = OpVariable %_ptr_Function_v4uint Function %187
+       %yzyx = OpVariable %_ptr_Function_v4uint Function %187
+       %yzyy = OpVariable %_ptr_Function_v4uint Function %187
+       %yzyz = OpVariable %_ptr_Function_v4uint Function %187
+       %yzzx = OpVariable %_ptr_Function_v4uint Function %187
+       %yzzy = OpVariable %_ptr_Function_v4uint Function %187
+       %yzzz = OpVariable %_ptr_Function_v4uint Function %187
+       %zxxx = OpVariable %_ptr_Function_v4uint Function %187
+       %zxxy = OpVariable %_ptr_Function_v4uint Function %187
+       %zxxz = OpVariable %_ptr_Function_v4uint Function %187
+       %zxyx = OpVariable %_ptr_Function_v4uint Function %187
+       %zxyy = OpVariable %_ptr_Function_v4uint Function %187
+       %zxyz = OpVariable %_ptr_Function_v4uint Function %187
+       %zxzx = OpVariable %_ptr_Function_v4uint Function %187
+       %zxzy = OpVariable %_ptr_Function_v4uint Function %187
+       %zxzz = OpVariable %_ptr_Function_v4uint Function %187
+       %zyxx = OpVariable %_ptr_Function_v4uint Function %187
+       %zyxy = OpVariable %_ptr_Function_v4uint Function %187
+       %zyxz = OpVariable %_ptr_Function_v4uint Function %187
+       %zyyx = OpVariable %_ptr_Function_v4uint Function %187
+       %zyyy = OpVariable %_ptr_Function_v4uint Function %187
+       %zyyz = OpVariable %_ptr_Function_v4uint Function %187
+       %zyzx = OpVariable %_ptr_Function_v4uint Function %187
+       %zyzy = OpVariable %_ptr_Function_v4uint Function %187
+       %zyzz = OpVariable %_ptr_Function_v4uint Function %187
+       %zzxx = OpVariable %_ptr_Function_v4uint Function %187
+       %zzxy = OpVariable %_ptr_Function_v4uint Function %187
+       %zzxz = OpVariable %_ptr_Function_v4uint Function %187
+       %zzyx = OpVariable %_ptr_Function_v4uint Function %187
+       %zzyy = OpVariable %_ptr_Function_v4uint Function %187
+       %zzyz = OpVariable %_ptr_Function_v4uint Function %187
+       %zzzx = OpVariable %_ptr_Function_v4uint Function %187
+       %zzzy = OpVariable %_ptr_Function_v4uint Function %187
+       %zzzz = OpVariable %_ptr_Function_v4uint Function %187
+         %15 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %16 = OpLoad %v3uint %15
+               OpStore %v %16
+         %21 = OpAccessChain %_ptr_Private_uint %P %uint_0 %uint_0
+         %22 = OpLoad %uint %21
+               OpStore %x %22
+         %27 = OpAccessChain %_ptr_Private_uint %P %uint_0 %uint_1
+         %28 = OpLoad %uint %27
+               OpStore %y %28
+         %31 = OpAccessChain %_ptr_Private_uint %P %uint_0 %uint_2
+         %32 = OpLoad %uint %31
+               OpStore %z %32
+         %34 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %36 = OpLoad %v3uint %34
+         %37 = OpVectorShuffle %v2uint %36 %36 0 0
+               OpStore %xx %37
+         %41 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %42 = OpLoad %v3uint %41
+         %43 = OpVectorShuffle %v2uint %42 %42 0 1
+               OpStore %xy %43
+         %45 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %46 = OpLoad %v3uint %45
+         %47 = OpVectorShuffle %v2uint %46 %46 0 2
+               OpStore %xz %47
+         %49 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %50 = OpLoad %v3uint %49
+         %51 = OpVectorShuffle %v2uint %50 %50 1 0
+               OpStore %yx %51
+         %53 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %54 = OpLoad %v3uint %53
+         %55 = OpVectorShuffle %v2uint %54 %54 1 1
+               OpStore %yy %55
+         %57 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %58 = OpLoad %v3uint %57
+         %59 = OpVectorShuffle %v2uint %58 %58 1 2
+               OpStore %yz %59
+         %61 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %62 = OpLoad %v3uint %61
+         %63 = OpVectorShuffle %v2uint %62 %62 2 0
+               OpStore %zx %63
+         %65 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %66 = OpLoad %v3uint %65
+         %67 = OpVectorShuffle %v2uint %66 %66 2 1
+               OpStore %zy %67
+         %69 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %70 = OpLoad %v3uint %69
+         %71 = OpVectorShuffle %v2uint %70 %70 2 2
+               OpStore %zz %71
+         %73 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %74 = OpLoad %v3uint %73
+         %75 = OpVectorShuffle %v3uint %74 %74 0 0 0
+               OpStore %xxx %75
+         %77 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %78 = OpLoad %v3uint %77
+         %79 = OpVectorShuffle %v3uint %78 %78 0 0 1
+               OpStore %xxy %79
+         %81 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %82 = OpLoad %v3uint %81
+         %83 = OpVectorShuffle %v3uint %82 %82 0 0 2
+               OpStore %xxz %83
+         %85 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %86 = OpLoad %v3uint %85
+         %87 = OpVectorShuffle %v3uint %86 %86 0 1 0
+               OpStore %xyx %87
+         %89 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %90 = OpLoad %v3uint %89
+         %91 = OpVectorShuffle %v3uint %90 %90 0 1 1
+               OpStore %xyy %91
+         %93 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %94 = OpLoad %v3uint %93
+         %95 = OpVectorShuffle %v3uint %94 %94 0 1 2
+               OpStore %xyz %95
+         %97 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+         %98 = OpLoad %v3uint %97
+         %99 = OpVectorShuffle %v3uint %98 %98 0 2 0
+               OpStore %xzx %99
+        %101 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %102 = OpLoad %v3uint %101
+        %103 = OpVectorShuffle %v3uint %102 %102 0 2 1
+               OpStore %xzy %103
+        %105 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %106 = OpLoad %v3uint %105
+        %107 = OpVectorShuffle %v3uint %106 %106 0 2 2
+               OpStore %xzz %107
+        %109 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %110 = OpLoad %v3uint %109
+        %111 = OpVectorShuffle %v3uint %110 %110 1 0 0
+               OpStore %yxx %111
+        %113 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %114 = OpLoad %v3uint %113
+        %115 = OpVectorShuffle %v3uint %114 %114 1 0 1
+               OpStore %yxy %115
+        %117 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %118 = OpLoad %v3uint %117
+        %119 = OpVectorShuffle %v3uint %118 %118 1 0 2
+               OpStore %yxz %119
+        %121 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %122 = OpLoad %v3uint %121
+        %123 = OpVectorShuffle %v3uint %122 %122 1 1 0
+               OpStore %yyx %123
+        %125 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %126 = OpLoad %v3uint %125
+        %127 = OpVectorShuffle %v3uint %126 %126 1 1 1
+               OpStore %yyy %127
+        %129 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %130 = OpLoad %v3uint %129
+        %131 = OpVectorShuffle %v3uint %130 %130 1 1 2
+               OpStore %yyz %131
+        %133 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %134 = OpLoad %v3uint %133
+        %135 = OpVectorShuffle %v3uint %134 %134 1 2 0
+               OpStore %yzx %135
+        %137 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %138 = OpLoad %v3uint %137
+        %139 = OpVectorShuffle %v3uint %138 %138 1 2 1
+               OpStore %yzy %139
+        %141 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %142 = OpLoad %v3uint %141
+        %143 = OpVectorShuffle %v3uint %142 %142 1 2 2
+               OpStore %yzz %143
+        %145 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %146 = OpLoad %v3uint %145
+        %147 = OpVectorShuffle %v3uint %146 %146 2 0 0
+               OpStore %zxx %147
+        %149 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %150 = OpLoad %v3uint %149
+        %151 = OpVectorShuffle %v3uint %150 %150 2 0 1
+               OpStore %zxy %151
+        %153 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %154 = OpLoad %v3uint %153
+        %155 = OpVectorShuffle %v3uint %154 %154 2 0 2
+               OpStore %zxz %155
+        %157 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %158 = OpLoad %v3uint %157
+        %159 = OpVectorShuffle %v3uint %158 %158 2 1 0
+               OpStore %zyx %159
+        %161 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %162 = OpLoad %v3uint %161
+        %163 = OpVectorShuffle %v3uint %162 %162 2 1 1
+               OpStore %zyy %163
+        %165 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %166 = OpLoad %v3uint %165
+        %167 = OpVectorShuffle %v3uint %166 %166 2 1 2
+               OpStore %zyz %167
+        %169 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %170 = OpLoad %v3uint %169
+        %171 = OpVectorShuffle %v3uint %170 %170 2 2 0
+               OpStore %zzx %171
+        %173 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %174 = OpLoad %v3uint %173
+        %175 = OpVectorShuffle %v3uint %174 %174 2 2 1
+               OpStore %zzy %175
+        %177 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %178 = OpLoad %v3uint %177
+        %179 = OpVectorShuffle %v3uint %178 %178 2 2 2
+               OpStore %zzz %179
+        %181 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %183 = OpLoad %v3uint %181
+        %184 = OpVectorShuffle %v4uint %183 %183 0 0 0 0
+               OpStore %xxxx %184
+        %188 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %189 = OpLoad %v3uint %188
+        %190 = OpVectorShuffle %v4uint %189 %189 0 0 0 1
+               OpStore %xxxy %190
+        %192 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %193 = OpLoad %v3uint %192
+        %194 = OpVectorShuffle %v4uint %193 %193 0 0 0 2
+               OpStore %xxxz %194
+        %196 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %197 = OpLoad %v3uint %196
+        %198 = OpVectorShuffle %v4uint %197 %197 0 0 1 0
+               OpStore %xxyx %198
+        %200 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %201 = OpLoad %v3uint %200
+        %202 = OpVectorShuffle %v4uint %201 %201 0 0 1 1
+               OpStore %xxyy %202
+        %204 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %205 = OpLoad %v3uint %204
+        %206 = OpVectorShuffle %v4uint %205 %205 0 0 1 2
+               OpStore %xxyz %206
+        %208 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %209 = OpLoad %v3uint %208
+        %210 = OpVectorShuffle %v4uint %209 %209 0 0 2 0
+               OpStore %xxzx %210
+        %212 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %213 = OpLoad %v3uint %212
+        %214 = OpVectorShuffle %v4uint %213 %213 0 0 2 1
+               OpStore %xxzy %214
+        %216 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %217 = OpLoad %v3uint %216
+        %218 = OpVectorShuffle %v4uint %217 %217 0 0 2 2
+               OpStore %xxzz %218
+        %220 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %221 = OpLoad %v3uint %220
+        %222 = OpVectorShuffle %v4uint %221 %221 0 1 0 0
+               OpStore %xyxx %222
+        %224 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %225 = OpLoad %v3uint %224
+        %226 = OpVectorShuffle %v4uint %225 %225 0 1 0 1
+               OpStore %xyxy %226
+        %228 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %229 = OpLoad %v3uint %228
+        %230 = OpVectorShuffle %v4uint %229 %229 0 1 0 2
+               OpStore %xyxz %230
+        %232 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %233 = OpLoad %v3uint %232
+        %234 = OpVectorShuffle %v4uint %233 %233 0 1 1 0
+               OpStore %xyyx %234
+        %236 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %237 = OpLoad %v3uint %236
+        %238 = OpVectorShuffle %v4uint %237 %237 0 1 1 1
+               OpStore %xyyy %238
+        %240 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %241 = OpLoad %v3uint %240
+        %242 = OpVectorShuffle %v4uint %241 %241 0 1 1 2
+               OpStore %xyyz %242
+        %244 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %245 = OpLoad %v3uint %244
+        %246 = OpVectorShuffle %v4uint %245 %245 0 1 2 0
+               OpStore %xyzx %246
+        %248 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %249 = OpLoad %v3uint %248
+        %250 = OpVectorShuffle %v4uint %249 %249 0 1 2 1
+               OpStore %xyzy %250
+        %252 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %253 = OpLoad %v3uint %252
+        %254 = OpVectorShuffle %v4uint %253 %253 0 1 2 2
+               OpStore %xyzz %254
+        %256 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %257 = OpLoad %v3uint %256
+        %258 = OpVectorShuffle %v4uint %257 %257 0 2 0 0
+               OpStore %xzxx %258
+        %260 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %261 = OpLoad %v3uint %260
+        %262 = OpVectorShuffle %v4uint %261 %261 0 2 0 1
+               OpStore %xzxy %262
+        %264 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %265 = OpLoad %v3uint %264
+        %266 = OpVectorShuffle %v4uint %265 %265 0 2 0 2
+               OpStore %xzxz %266
+        %268 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %269 = OpLoad %v3uint %268
+        %270 = OpVectorShuffle %v4uint %269 %269 0 2 1 0
+               OpStore %xzyx %270
+        %272 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %273 = OpLoad %v3uint %272
+        %274 = OpVectorShuffle %v4uint %273 %273 0 2 1 1
+               OpStore %xzyy %274
+        %276 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %277 = OpLoad %v3uint %276
+        %278 = OpVectorShuffle %v4uint %277 %277 0 2 1 2
+               OpStore %xzyz %278
+        %280 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %281 = OpLoad %v3uint %280
+        %282 = OpVectorShuffle %v4uint %281 %281 0 2 2 0
+               OpStore %xzzx %282
+        %284 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %285 = OpLoad %v3uint %284
+        %286 = OpVectorShuffle %v4uint %285 %285 0 2 2 1
+               OpStore %xzzy %286
+        %288 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %289 = OpLoad %v3uint %288
+        %290 = OpVectorShuffle %v4uint %289 %289 0 2 2 2
+               OpStore %xzzz %290
+        %292 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %293 = OpLoad %v3uint %292
+        %294 = OpVectorShuffle %v4uint %293 %293 1 0 0 0
+               OpStore %yxxx %294
+        %296 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %297 = OpLoad %v3uint %296
+        %298 = OpVectorShuffle %v4uint %297 %297 1 0 0 1
+               OpStore %yxxy %298
+        %300 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %301 = OpLoad %v3uint %300
+        %302 = OpVectorShuffle %v4uint %301 %301 1 0 0 2
+               OpStore %yxxz %302
+        %304 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %305 = OpLoad %v3uint %304
+        %306 = OpVectorShuffle %v4uint %305 %305 1 0 1 0
+               OpStore %yxyx %306
+        %308 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %309 = OpLoad %v3uint %308
+        %310 = OpVectorShuffle %v4uint %309 %309 1 0 1 1
+               OpStore %yxyy %310
+        %312 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %313 = OpLoad %v3uint %312
+        %314 = OpVectorShuffle %v4uint %313 %313 1 0 1 2
+               OpStore %yxyz %314
+        %316 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %317 = OpLoad %v3uint %316
+        %318 = OpVectorShuffle %v4uint %317 %317 1 0 2 0
+               OpStore %yxzx %318
+        %320 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %321 = OpLoad %v3uint %320
+        %322 = OpVectorShuffle %v4uint %321 %321 1 0 2 1
+               OpStore %yxzy %322
+        %324 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %325 = OpLoad %v3uint %324
+        %326 = OpVectorShuffle %v4uint %325 %325 1 0 2 2
+               OpStore %yxzz %326
+        %328 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %329 = OpLoad %v3uint %328
+        %330 = OpVectorShuffle %v4uint %329 %329 1 1 0 0
+               OpStore %yyxx %330
+        %332 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %333 = OpLoad %v3uint %332
+        %334 = OpVectorShuffle %v4uint %333 %333 1 1 0 1
+               OpStore %yyxy %334
+        %336 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %337 = OpLoad %v3uint %336
+        %338 = OpVectorShuffle %v4uint %337 %337 1 1 0 2
+               OpStore %yyxz %338
+        %340 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %341 = OpLoad %v3uint %340
+        %342 = OpVectorShuffle %v4uint %341 %341 1 1 1 0
+               OpStore %yyyx %342
+        %344 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %345 = OpLoad %v3uint %344
+        %346 = OpVectorShuffle %v4uint %345 %345 1 1 1 1
+               OpStore %yyyy %346
+        %348 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %349 = OpLoad %v3uint %348
+        %350 = OpVectorShuffle %v4uint %349 %349 1 1 1 2
+               OpStore %yyyz %350
+        %352 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %353 = OpLoad %v3uint %352
+        %354 = OpVectorShuffle %v4uint %353 %353 1 1 2 0
+               OpStore %yyzx %354
+        %356 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %357 = OpLoad %v3uint %356
+        %358 = OpVectorShuffle %v4uint %357 %357 1 1 2 1
+               OpStore %yyzy %358
+        %360 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %361 = OpLoad %v3uint %360
+        %362 = OpVectorShuffle %v4uint %361 %361 1 1 2 2
+               OpStore %yyzz %362
+        %364 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %365 = OpLoad %v3uint %364
+        %366 = OpVectorShuffle %v4uint %365 %365 1 2 0 0
+               OpStore %yzxx %366
+        %368 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %369 = OpLoad %v3uint %368
+        %370 = OpVectorShuffle %v4uint %369 %369 1 2 0 1
+               OpStore %yzxy %370
+        %372 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %373 = OpLoad %v3uint %372
+        %374 = OpVectorShuffle %v4uint %373 %373 1 2 0 2
+               OpStore %yzxz %374
+        %376 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %377 = OpLoad %v3uint %376
+        %378 = OpVectorShuffle %v4uint %377 %377 1 2 1 0
+               OpStore %yzyx %378
+        %380 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %381 = OpLoad %v3uint %380
+        %382 = OpVectorShuffle %v4uint %381 %381 1 2 1 1
+               OpStore %yzyy %382
+        %384 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %385 = OpLoad %v3uint %384
+        %386 = OpVectorShuffle %v4uint %385 %385 1 2 1 2
+               OpStore %yzyz %386
+        %388 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %389 = OpLoad %v3uint %388
+        %390 = OpVectorShuffle %v4uint %389 %389 1 2 2 0
+               OpStore %yzzx %390
+        %392 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %393 = OpLoad %v3uint %392
+        %394 = OpVectorShuffle %v4uint %393 %393 1 2 2 1
+               OpStore %yzzy %394
+        %396 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %397 = OpLoad %v3uint %396
+        %398 = OpVectorShuffle %v4uint %397 %397 1 2 2 2
+               OpStore %yzzz %398
+        %400 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %401 = OpLoad %v3uint %400
+        %402 = OpVectorShuffle %v4uint %401 %401 2 0 0 0
+               OpStore %zxxx %402
+        %404 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %405 = OpLoad %v3uint %404
+        %406 = OpVectorShuffle %v4uint %405 %405 2 0 0 1
+               OpStore %zxxy %406
+        %408 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %409 = OpLoad %v3uint %408
+        %410 = OpVectorShuffle %v4uint %409 %409 2 0 0 2
+               OpStore %zxxz %410
+        %412 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %413 = OpLoad %v3uint %412
+        %414 = OpVectorShuffle %v4uint %413 %413 2 0 1 0
+               OpStore %zxyx %414
+        %416 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %417 = OpLoad %v3uint %416
+        %418 = OpVectorShuffle %v4uint %417 %417 2 0 1 1
+               OpStore %zxyy %418
+        %420 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %421 = OpLoad %v3uint %420
+        %422 = OpVectorShuffle %v4uint %421 %421 2 0 1 2
+               OpStore %zxyz %422
+        %424 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %425 = OpLoad %v3uint %424
+        %426 = OpVectorShuffle %v4uint %425 %425 2 0 2 0
+               OpStore %zxzx %426
+        %428 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %429 = OpLoad %v3uint %428
+        %430 = OpVectorShuffle %v4uint %429 %429 2 0 2 1
+               OpStore %zxzy %430
+        %432 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %433 = OpLoad %v3uint %432
+        %434 = OpVectorShuffle %v4uint %433 %433 2 0 2 2
+               OpStore %zxzz %434
+        %436 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %437 = OpLoad %v3uint %436
+        %438 = OpVectorShuffle %v4uint %437 %437 2 1 0 0
+               OpStore %zyxx %438
+        %440 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %441 = OpLoad %v3uint %440
+        %442 = OpVectorShuffle %v4uint %441 %441 2 1 0 1
+               OpStore %zyxy %442
+        %444 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %445 = OpLoad %v3uint %444
+        %446 = OpVectorShuffle %v4uint %445 %445 2 1 0 2
+               OpStore %zyxz %446
+        %448 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %449 = OpLoad %v3uint %448
+        %450 = OpVectorShuffle %v4uint %449 %449 2 1 1 0
+               OpStore %zyyx %450
+        %452 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %453 = OpLoad %v3uint %452
+        %454 = OpVectorShuffle %v4uint %453 %453 2 1 1 1
+               OpStore %zyyy %454
+        %456 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %457 = OpLoad %v3uint %456
+        %458 = OpVectorShuffle %v4uint %457 %457 2 1 1 2
+               OpStore %zyyz %458
+        %460 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %461 = OpLoad %v3uint %460
+        %462 = OpVectorShuffle %v4uint %461 %461 2 1 2 0
+               OpStore %zyzx %462
+        %464 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %465 = OpLoad %v3uint %464
+        %466 = OpVectorShuffle %v4uint %465 %465 2 1 2 1
+               OpStore %zyzy %466
+        %468 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %469 = OpLoad %v3uint %468
+        %470 = OpVectorShuffle %v4uint %469 %469 2 1 2 2
+               OpStore %zyzz %470
+        %472 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %473 = OpLoad %v3uint %472
+        %474 = OpVectorShuffle %v4uint %473 %473 2 2 0 0
+               OpStore %zzxx %474
+        %476 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %477 = OpLoad %v3uint %476
+        %478 = OpVectorShuffle %v4uint %477 %477 2 2 0 1
+               OpStore %zzxy %478
+        %480 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %481 = OpLoad %v3uint %480
+        %482 = OpVectorShuffle %v4uint %481 %481 2 2 0 2
+               OpStore %zzxz %482
+        %484 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %485 = OpLoad %v3uint %484
+        %486 = OpVectorShuffle %v4uint %485 %485 2 2 1 0
+               OpStore %zzyx %486
+        %488 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %489 = OpLoad %v3uint %488
+        %490 = OpVectorShuffle %v4uint %489 %489 2 2 1 1
+               OpStore %zzyy %490
+        %492 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %493 = OpLoad %v3uint %492
+        %494 = OpVectorShuffle %v4uint %493 %493 2 2 1 2
+               OpStore %zzyz %494
+        %496 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %497 = OpLoad %v3uint %496
+        %498 = OpVectorShuffle %v4uint %497 %497 2 2 2 0
+               OpStore %zzzx %498
+        %500 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %501 = OpLoad %v3uint %500
+        %502 = OpVectorShuffle %v4uint %501 %501 2 2 2 1
+               OpStore %zzzy %502
+        %504 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+        %505 = OpLoad %v3uint %504
+        %506 = OpVectorShuffle %v4uint %505 %505 2 2 2 2
+               OpStore %zzzz %506
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/read/vec3/u32.wgsl.expected.wgsl b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..390ba90
--- /dev/null
+++ b/test/expressions/swizzle/read/vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,129 @@
+struct S {
+  v : vec3<u32>;
+};
+
+var<private> P : S;
+
+fn f() {
+  var v = P.v;
+  var x = P.v.x;
+  var y = P.v.y;
+  var z = P.v.z;
+  var xx = P.v.xx;
+  var xy = P.v.xy;
+  var xz = P.v.xz;
+  var yx = P.v.yx;
+  var yy = P.v.yy;
+  var yz = P.v.yz;
+  var zx = P.v.zx;
+  var zy = P.v.zy;
+  var zz = P.v.zz;
+  var xxx = P.v.xxx;
+  var xxy = P.v.xxy;
+  var xxz = P.v.xxz;
+  var xyx = P.v.xyx;
+  var xyy = P.v.xyy;
+  var xyz = P.v.xyz;
+  var xzx = P.v.xzx;
+  var xzy = P.v.xzy;
+  var xzz = P.v.xzz;
+  var yxx = P.v.yxx;
+  var yxy = P.v.yxy;
+  var yxz = P.v.yxz;
+  var yyx = P.v.yyx;
+  var yyy = P.v.yyy;
+  var yyz = P.v.yyz;
+  var yzx = P.v.yzx;
+  var yzy = P.v.yzy;
+  var yzz = P.v.yzz;
+  var zxx = P.v.zxx;
+  var zxy = P.v.zxy;
+  var zxz = P.v.zxz;
+  var zyx = P.v.zyx;
+  var zyy = P.v.zyy;
+  var zyz = P.v.zyz;
+  var zzx = P.v.zzx;
+  var zzy = P.v.zzy;
+  var zzz = P.v.zzz;
+  var xxxx = P.v.xxxx;
+  var xxxy = P.v.xxxy;
+  var xxxz = P.v.xxxz;
+  var xxyx = P.v.xxyx;
+  var xxyy = P.v.xxyy;
+  var xxyz = P.v.xxyz;
+  var xxzx = P.v.xxzx;
+  var xxzy = P.v.xxzy;
+  var xxzz = P.v.xxzz;
+  var xyxx = P.v.xyxx;
+  var xyxy = P.v.xyxy;
+  var xyxz = P.v.xyxz;
+  var xyyx = P.v.xyyx;
+  var xyyy = P.v.xyyy;
+  var xyyz = P.v.xyyz;
+  var xyzx = P.v.xyzx;
+  var xyzy = P.v.xyzy;
+  var xyzz = P.v.xyzz;
+  var xzxx = P.v.xzxx;
+  var xzxy = P.v.xzxy;
+  var xzxz = P.v.xzxz;
+  var xzyx = P.v.xzyx;
+  var xzyy = P.v.xzyy;
+  var xzyz = P.v.xzyz;
+  var xzzx = P.v.xzzx;
+  var xzzy = P.v.xzzy;
+  var xzzz = P.v.xzzz;
+  var yxxx = P.v.yxxx;
+  var yxxy = P.v.yxxy;
+  var yxxz = P.v.yxxz;
+  var yxyx = P.v.yxyx;
+  var yxyy = P.v.yxyy;
+  var yxyz = P.v.yxyz;
+  var yxzx = P.v.yxzx;
+  var yxzy = P.v.yxzy;
+  var yxzz = P.v.yxzz;
+  var yyxx = P.v.yyxx;
+  var yyxy = P.v.yyxy;
+  var yyxz = P.v.yyxz;
+  var yyyx = P.v.yyyx;
+  var yyyy = P.v.yyyy;
+  var yyyz = P.v.yyyz;
+  var yyzx = P.v.yyzx;
+  var yyzy = P.v.yyzy;
+  var yyzz = P.v.yyzz;
+  var yzxx = P.v.yzxx;
+  var yzxy = P.v.yzxy;
+  var yzxz = P.v.yzxz;
+  var yzyx = P.v.yzyx;
+  var yzyy = P.v.yzyy;
+  var yzyz = P.v.yzyz;
+  var yzzx = P.v.yzzx;
+  var yzzy = P.v.yzzy;
+  var yzzz = P.v.yzzz;
+  var zxxx = P.v.zxxx;
+  var zxxy = P.v.zxxy;
+  var zxxz = P.v.zxxz;
+  var zxyx = P.v.zxyx;
+  var zxyy = P.v.zxyy;
+  var zxyz = P.v.zxyz;
+  var zxzx = P.v.zxzx;
+  var zxzy = P.v.zxzy;
+  var zxzz = P.v.zxzz;
+  var zyxx = P.v.zyxx;
+  var zyxy = P.v.zyxy;
+  var zyxz = P.v.zyxz;
+  var zyyx = P.v.zyyx;
+  var zyyy = P.v.zyyy;
+  var zyyz = P.v.zyyz;
+  var zyzx = P.v.zyzx;
+  var zyzy = P.v.zyzy;
+  var zyzz = P.v.zyzz;
+  var zzxx = P.v.zzxx;
+  var zzxy = P.v.zzxy;
+  var zzxz = P.v.zzxz;
+  var zzyx = P.v.zzyx;
+  var zzyy = P.v.zzyy;
+  var zzyz = P.v.zzyz;
+  var zzzx = P.v.zzzx;
+  var zzzy = P.v.zzzy;
+  var zzzz = P.v.zzzz;
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl b/test/expressions/swizzle/write/packed_vec3/f32.wgsl
new file mode 100644
index 0000000..7703af9
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl
@@ -0,0 +1,14 @@
+[[block]]
+struct S {
+    v: vec3<f32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> U : S;
+
+fn f() {
+    U.v = vec3<f32>(1.0, 2.0, 3.0);
+
+    U.v.x = 1.0;
+    U.v.y = 2.0;
+    U.v.z = 3.0;
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.hlsl b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..bd302bc
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,13 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+RWByteAddressBuffer U : register(u0, space0);
+
+void f() {
+  U.Store3(0u, asuint(float3(1.0f, 2.0f, 3.0f)));
+  U.Store(0u, asuint(1.0f));
+  U.Store(4u, asuint(2.0f));
+  U.Store(8u, asuint(3.0f));
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..80ad293
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.msl
@@ -0,0 +1,26 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+template<typename T, int N, int M>
+inline auto operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
+  return lhs * vec<T, N>(rhs);
+}
+
+template<typename T, int N, int M>
+inline auto operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
+  return vec<T, M>(lhs) * rhs;
+}
+
+struct S {
+  /* 0x0000 */ packed_float3 v;
+  /* 0x000c */ int8_t tint_pad[4];
+};
+
+void f(device S& U) {
+  U.v = float3(1.0f, 2.0f, 3.0f);
+  U.v[0] = 1.0f;
+  U.v[1] = 2.0f;
+  U.v[2] = 3.0f;
+}
+
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.spvasm b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..06c6c10
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %U "U"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %U DescriptorSet 0
+               OpDecorate %U Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %S = OpTypeStruct %v3float
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+          %U = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %19 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+%unused_entry_point = OpFunction %void None %6
+          %9 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %6
+         %11 = OpLabel
+         %15 = OpAccessChain %_ptr_StorageBuffer_v3float %U %uint_0
+               OpStore %15 %19
+         %21 = OpAccessChain %_ptr_StorageBuffer_float %U %uint_0 %uint_0
+               OpStore %21 %float_1
+         %23 = OpAccessChain %_ptr_StorageBuffer_float %U %uint_0 %uint_1
+               OpStore %23 %float_2
+         %25 = OpAccessChain %_ptr_StorageBuffer_float %U %uint_0 %uint_2
+               OpStore %25 %float_3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..db3ef39
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+[[block]]
+struct S {
+  v : vec3<f32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> U : S;
+
+fn f() {
+  U.v = vec3<f32>(1.0, 2.0, 3.0);
+  U.v.x = 1.0;
+  U.v.y = 2.0;
+  U.v.z = 3.0;
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl b/test/expressions/swizzle/write/packed_vec3/i32.wgsl
new file mode 100644
index 0000000..fb1ebc5
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl
@@ -0,0 +1,14 @@
+[[block]]
+struct S {
+    v: vec3<i32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> U : S;
+
+fn f() {
+    U.v = vec3<i32>(1, 2, 3);
+
+    U.v.x = 1;
+    U.v.y = 2;
+    U.v.z = 3;
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.hlsl b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..1be931d
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,13 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+RWByteAddressBuffer U : register(u0, space0);
+
+void f() {
+  U.Store3(0u, asuint(int3(1, 2, 3)));
+  U.Store(0u, asuint(1));
+  U.Store(4u, asuint(2));
+  U.Store(8u, asuint(3));
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..3a519e5
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.msl
@@ -0,0 +1,15 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ packed_int3 v;
+  /* 0x000c */ int8_t tint_pad[4];
+};
+
+void f(device S& U) {
+  U.v = int3(1, 2, 3);
+  U.v[0] = 1;
+  U.v[1] = 2;
+  U.v[2] = 3;
+}
+
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.spvasm b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..b61e867
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %U "U"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %U DescriptorSet 0
+               OpDecorate %U Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+          %S = OpTypeStruct %v3int
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+          %U = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+         %19 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+%unused_entry_point = OpFunction %void None %6
+          %9 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %6
+         %11 = OpLabel
+         %15 = OpAccessChain %_ptr_StorageBuffer_v3int %U %uint_0
+               OpStore %15 %19
+         %21 = OpAccessChain %_ptr_StorageBuffer_int %U %uint_0 %uint_0
+               OpStore %21 %int_1
+         %23 = OpAccessChain %_ptr_StorageBuffer_int %U %uint_0 %uint_1
+               OpStore %23 %int_2
+         %25 = OpAccessChain %_ptr_StorageBuffer_int %U %uint_0 %uint_2
+               OpStore %25 %int_3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..b84a23a
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+[[block]]
+struct S {
+  v : vec3<i32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> U : S;
+
+fn f() {
+  U.v = vec3<i32>(1, 2, 3);
+  U.v.x = 1;
+  U.v.y = 2;
+  U.v.z = 3;
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl b/test/expressions/swizzle/write/packed_vec3/u32.wgsl
new file mode 100644
index 0000000..306e540
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl
@@ -0,0 +1,14 @@
+[[block]]
+struct S {
+    v: vec3<u32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> U : S;
+
+fn f() {
+    U.v = vec3<u32>(1u, 2u, 3u);
+
+    U.v.x = 1u;
+    U.v.y = 2u;
+    U.v.z = 3u;
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.hlsl b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..fd7ff48
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,13 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+RWByteAddressBuffer U : register(u0, space0);
+
+void f() {
+  U.Store3(0u, asuint(uint3(1u, 2u, 3u)));
+  U.Store(0u, asuint(1u));
+  U.Store(4u, asuint(2u));
+  U.Store(8u, asuint(3u));
+}
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..b12b460
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.msl
@@ -0,0 +1,15 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  /* 0x0000 */ packed_uint3 v;
+  /* 0x000c */ int8_t tint_pad[4];
+};
+
+void f(device S& U) {
+  U.v = uint3(1u, 2u, 3u);
+  U.v[0] = 1u;
+  U.v[1] = 2u;
+  U.v[2] = 3u;
+}
+
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.spvasm b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..622a16e
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %U "U"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpDecorate %S Block
+               OpMemberDecorate %S 0 Offset 0
+               OpDecorate %U DescriptorSet 0
+               OpDecorate %U Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+          %S = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_S = OpTypePointer StorageBuffer %S
+          %U = OpVariable %_ptr_StorageBuffer_S StorageBuffer
+       %void = OpTypeVoid
+          %6 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+         %18 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+%unused_entry_point = OpFunction %void None %6
+          %9 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %6
+         %11 = OpLabel
+         %14 = OpAccessChain %_ptr_StorageBuffer_v3uint %U %uint_0
+               OpStore %14 %18
+         %20 = OpAccessChain %_ptr_StorageBuffer_uint %U %uint_0 %uint_0
+               OpStore %20 %uint_1
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %U %uint_0 %uint_1
+               OpStore %21 %uint_2
+         %22 = OpAccessChain %_ptr_StorageBuffer_uint %U %uint_0 %uint_2
+               OpStore %22 %uint_3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..0e7c8da
--- /dev/null
+++ b/test/expressions/swizzle/write/packed_vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+[[block]]
+struct S {
+  v : vec3<u32>;
+};
+
+[[group(0), binding(0)]] var<storage, read_write> U : S;
+
+fn f() {
+  U.v = vec3<u32>(1u, 2u, 3u);
+  U.v.x = 1u;
+  U.v.y = 2u;
+  U.v.z = 3u;
+}
diff --git a/test/expressions/swizzle/write/vec3/f32.wgsl b/test/expressions/swizzle/write/vec3/f32.wgsl
new file mode 100644
index 0000000..c7d1633
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/f32.wgsl
@@ -0,0 +1,13 @@
+struct S {
+    v: vec3<f32>;
+};
+
+var<private> P : S;
+
+fn f() {
+    P.v = vec3<f32>(1.0, 2.0, 3.0);
+
+    P.v.x = 1.0;
+    P.v.y = 2.0;
+    P.v.z = 3.0;
+}
diff --git a/test/expressions/swizzle/write/vec3/f32.wgsl.expected.hlsl b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.hlsl
new file mode 100644
index 0000000..4cfaf20
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.hlsl
@@ -0,0 +1,17 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+struct S {
+  float3 v;
+};
+
+static S P = (S)0;
+
+void f() {
+  P.v = float3(1.0f, 2.0f, 3.0f);
+  P.v.x = 1.0f;
+  P.v.y = 2.0f;
+  P.v.z = 3.0f;
+}
diff --git a/test/expressions/swizzle/write/vec3/f32.wgsl.expected.msl b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.msl
new file mode 100644
index 0000000..17624cf
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.msl
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  float3 v;
+};
+
+void f(thread S* const tint_symbol) {
+  (*(tint_symbol)).v = float3(1.0f, 2.0f, 3.0f);
+  (*(tint_symbol)).v[0] = 1.0f;
+  (*(tint_symbol)).v[1] = 2.0f;
+  (*(tint_symbol)).v[2] = 3.0f;
+}
+
diff --git a/test/expressions/swizzle/write/vec3/f32.wgsl.expected.spvasm b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.spvasm
new file mode 100644
index 0000000..4c38eeb
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %P "P"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpMemberDecorate %S 0 Offset 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+          %S = OpTypeStruct %v3float
+%_ptr_Private_S = OpTypePointer Private %S
+          %6 = OpConstantNull %S
+          %P = OpVariable %_ptr_Private_S Private %6
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_v3float = OpTypePointer Private %v3float
+    %float_1 = OpConstant %float 1
+    %float_2 = OpConstant %float 2
+    %float_3 = OpConstant %float 3
+         %20 = OpConstantComposite %v3float %float_1 %float_2 %float_3
+%_ptr_Private_float = OpTypePointer Private %float
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+%unused_entry_point = OpFunction %void None %7
+         %10 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %7
+         %12 = OpLabel
+         %16 = OpAccessChain %_ptr_Private_v3float %P %uint_0
+               OpStore %16 %20
+         %22 = OpAccessChain %_ptr_Private_float %P %uint_0 %uint_0
+               OpStore %22 %float_1
+         %24 = OpAccessChain %_ptr_Private_float %P %uint_0 %uint_1
+               OpStore %24 %float_2
+         %26 = OpAccessChain %_ptr_Private_float %P %uint_0 %uint_2
+               OpStore %26 %float_3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/write/vec3/f32.wgsl.expected.wgsl b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.wgsl
new file mode 100644
index 0000000..83e6e31
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/f32.wgsl.expected.wgsl
@@ -0,0 +1,12 @@
+struct S {
+  v : vec3<f32>;
+};
+
+var<private> P : S;
+
+fn f() {
+  P.v = vec3<f32>(1.0, 2.0, 3.0);
+  P.v.x = 1.0;
+  P.v.y = 2.0;
+  P.v.z = 3.0;
+}
diff --git a/test/expressions/swizzle/write/vec3/i32.wgsl b/test/expressions/swizzle/write/vec3/i32.wgsl
new file mode 100644
index 0000000..9abf24a
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/i32.wgsl
@@ -0,0 +1,13 @@
+struct S {
+    v: vec3<i32>;
+};
+
+var<private> P : S;
+
+fn f() {
+    P.v = vec3<i32>(1, 2, 3);
+
+    P.v.x = 1;
+    P.v.y = 2;
+    P.v.z = 3;
+}
diff --git a/test/expressions/swizzle/write/vec3/i32.wgsl.expected.hlsl b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.hlsl
new file mode 100644
index 0000000..e3ecfbc
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.hlsl
@@ -0,0 +1,17 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+struct S {
+  int3 v;
+};
+
+static S P = (S)0;
+
+void f() {
+  P.v = int3(1, 2, 3);
+  P.v.x = 1;
+  P.v.y = 2;
+  P.v.z = 3;
+}
diff --git a/test/expressions/swizzle/write/vec3/i32.wgsl.expected.msl b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.msl
new file mode 100644
index 0000000..bbd4748
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.msl
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  int3 v;
+};
+
+void f(thread S* const tint_symbol) {
+  (*(tint_symbol)).v = int3(1, 2, 3);
+  (*(tint_symbol)).v[0] = 1;
+  (*(tint_symbol)).v[1] = 2;
+  (*(tint_symbol)).v[2] = 3;
+}
+
diff --git a/test/expressions/swizzle/write/vec3/i32.wgsl.expected.spvasm b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.spvasm
new file mode 100644
index 0000000..804efe4
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %P "P"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpMemberDecorate %S 0 Offset 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+          %S = OpTypeStruct %v3int
+%_ptr_Private_S = OpTypePointer Private %S
+          %6 = OpConstantNull %S
+          %P = OpVariable %_ptr_Private_S Private %6
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+       %uint = OpTypeInt 32 0
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_v3int = OpTypePointer Private %v3int
+      %int_1 = OpConstant %int 1
+      %int_2 = OpConstant %int 2
+      %int_3 = OpConstant %int 3
+         %20 = OpConstantComposite %v3int %int_1 %int_2 %int_3
+%_ptr_Private_int = OpTypePointer Private %int
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+%unused_entry_point = OpFunction %void None %7
+         %10 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %7
+         %12 = OpLabel
+         %16 = OpAccessChain %_ptr_Private_v3int %P %uint_0
+               OpStore %16 %20
+         %22 = OpAccessChain %_ptr_Private_int %P %uint_0 %uint_0
+               OpStore %22 %int_1
+         %24 = OpAccessChain %_ptr_Private_int %P %uint_0 %uint_1
+               OpStore %24 %int_2
+         %26 = OpAccessChain %_ptr_Private_int %P %uint_0 %uint_2
+               OpStore %26 %int_3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/write/vec3/i32.wgsl.expected.wgsl b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.wgsl
new file mode 100644
index 0000000..0c055df
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/i32.wgsl.expected.wgsl
@@ -0,0 +1,12 @@
+struct S {
+  v : vec3<i32>;
+};
+
+var<private> P : S;
+
+fn f() {
+  P.v = vec3<i32>(1, 2, 3);
+  P.v.x = 1;
+  P.v.y = 2;
+  P.v.z = 3;
+}
diff --git a/test/expressions/swizzle/write/vec3/u32.wgsl b/test/expressions/swizzle/write/vec3/u32.wgsl
new file mode 100644
index 0000000..427e61e
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/u32.wgsl
@@ -0,0 +1,13 @@
+struct S {
+    v: vec3<u32>;
+};
+
+var<private> P : S;
+
+fn f() {
+    P.v = vec3<u32>(1u, 2u, 3u);
+
+    P.v.x = 1u;
+    P.v.y = 2u;
+    P.v.z = 3u;
+}
diff --git a/test/expressions/swizzle/write/vec3/u32.wgsl.expected.hlsl b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.hlsl
new file mode 100644
index 0000000..172c699
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.hlsl
@@ -0,0 +1,17 @@
+[numthreads(1, 1, 1)]
+void unused_entry_point() {
+  return;
+}
+
+struct S {
+  uint3 v;
+};
+
+static S P = (S)0;
+
+void f() {
+  P.v = uint3(1u, 2u, 3u);
+  P.v.x = 1u;
+  P.v.y = 2u;
+  P.v.z = 3u;
+}
diff --git a/test/expressions/swizzle/write/vec3/u32.wgsl.expected.msl b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.msl
new file mode 100644
index 0000000..f665ab6
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.msl
@@ -0,0 +1,14 @@
+#include <metal_stdlib>
+
+using namespace metal;
+struct S {
+  uint3 v;
+};
+
+void f(thread S* const tint_symbol) {
+  (*(tint_symbol)).v = uint3(1u, 2u, 3u);
+  (*(tint_symbol)).v[0] = 1u;
+  (*(tint_symbol)).v[1] = 2u;
+  (*(tint_symbol)).v[2] = 3u;
+}
+
diff --git a/test/expressions/swizzle/write/vec3/u32.wgsl.expected.spvasm b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.spvasm
new file mode 100644
index 0000000..7c3f26b
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.spvasm
@@ -0,0 +1,46 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %unused_entry_point "unused_entry_point"
+               OpExecutionMode %unused_entry_point LocalSize 1 1 1
+               OpName %S "S"
+               OpMemberName %S 0 "v"
+               OpName %P "P"
+               OpName %unused_entry_point "unused_entry_point"
+               OpName %f "f"
+               OpMemberDecorate %S 0 Offset 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+          %S = OpTypeStruct %v3uint
+%_ptr_Private_S = OpTypePointer Private %S
+          %6 = OpConstantNull %S
+          %P = OpVariable %_ptr_Private_S Private %6
+       %void = OpTypeVoid
+          %7 = OpTypeFunction %void
+     %uint_0 = OpConstant %uint 0
+%_ptr_Private_v3uint = OpTypePointer Private %v3uint
+     %uint_1 = OpConstant %uint 1
+     %uint_2 = OpConstant %uint 2
+     %uint_3 = OpConstant %uint 3
+         %19 = OpConstantComposite %v3uint %uint_1 %uint_2 %uint_3
+%_ptr_Private_uint = OpTypePointer Private %uint
+%unused_entry_point = OpFunction %void None %7
+         %10 = OpLabel
+               OpReturn
+               OpFunctionEnd
+          %f = OpFunction %void None %7
+         %12 = OpLabel
+         %15 = OpAccessChain %_ptr_Private_v3uint %P %uint_0
+               OpStore %15 %19
+         %21 = OpAccessChain %_ptr_Private_uint %P %uint_0 %uint_0
+               OpStore %21 %uint_1
+         %22 = OpAccessChain %_ptr_Private_uint %P %uint_0 %uint_1
+               OpStore %22 %uint_2
+         %23 = OpAccessChain %_ptr_Private_uint %P %uint_0 %uint_2
+               OpStore %23 %uint_3
+               OpReturn
+               OpFunctionEnd
diff --git a/test/expressions/swizzle/write/vec3/u32.wgsl.expected.wgsl b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.wgsl
new file mode 100644
index 0000000..301f985
--- /dev/null
+++ b/test/expressions/swizzle/write/vec3/u32.wgsl.expected.wgsl
@@ -0,0 +1,12 @@
+struct S {
+  v : vec3<u32>;
+};
+
+var<private> P : S;
+
+fn f() {
+  P.v = vec3<u32>(1u, 2u, 3u);
+  P.v.x = 1u;
+  P.v.y = 2u;
+  P.v.z = 3u;
+}
diff --git a/test/intrinsics/textureLoad/depth_ms.spvasm.expected.msl b/test/intrinsics/textureLoad/depth_ms.spvasm.expected.msl
index 9b56186..0923cc4 100644
--- a/test/intrinsics/textureLoad/depth_ms.spvasm.expected.msl
+++ b/test/intrinsics/textureLoad/depth_ms.spvasm.expected.msl
@@ -11,7 +11,7 @@
 void textureLoad_6273b1(depth2d_ms<float, access::read> tint_symbol_5) {
   float res = 0.0f;
   float4 const x_17 = float4(tint_symbol_5.read(uint2(int2(0, 0)), 1), 0.0f, 0.0f, 0.0f);
-  res = x_17.x;
+  res = x_17[0];
   return;
 }
 
diff --git a/test/loops/continue_in_switch.wgsl.expected.hlsl b/test/loops/continue_in_switch.wgsl.expected.hlsl
index 966973f..610efee 100644
--- a/test/loops/continue_in_switch.wgsl.expected.hlsl
+++ b/test/loops/continue_in_switch.wgsl.expected.hlsl
@@ -18,4 +18,3 @@
   return;
 }
 C:\src\tint\test\Shader@0x0000022998AE1EF0(7,11-19): error X3708: continue cannot be used in a switch
-
diff --git a/test/ptr_ref/access/vector.spvasm.expected.msl b/test/ptr_ref/access/vector.spvasm.expected.msl
index 2d93596..442948f 100644
--- a/test/ptr_ref/access/vector.spvasm.expected.msl
+++ b/test/ptr_ref/access/vector.spvasm.expected.msl
@@ -4,7 +4,7 @@
 void main_1() {
   float3 v = float3(0.0f, 0.0f, 0.0f);
   v = float3(1.0f, 2.0f, 3.0f);
-  v.y = 5.0f;
+  v[1] = 5.0f;
   return;
 }
 
diff --git a/test/ptr_ref/access/vector.wgsl.expected.msl b/test/ptr_ref/access/vector.wgsl.expected.msl
index 6625cdb..9df7578 100644
--- a/test/ptr_ref/access/vector.wgsl.expected.msl
+++ b/test/ptr_ref/access/vector.wgsl.expected.msl
@@ -3,7 +3,7 @@
 using namespace metal;
 kernel void tint_symbol() {
   float3 v = float3(1.0f, 2.0f, 3.0f);
-  v.y = 5.0f;
+  v[1] = 5.0f;
   return;
 }
 
diff --git a/test/samples/compute_boids.wgsl.expected.msl b/test/samples/compute_boids.wgsl.expected.msl
index 9c1b8a8..48252a3 100644
--- a/test/samples/compute_boids.wgsl.expected.msl
+++ b/test/samples/compute_boids.wgsl.expected.msl
@@ -33,8 +33,8 @@
 };
 
 float4 vert_main_inner(float2 a_particlePos, float2 a_particleVel, float2 a_pos) {
-  float angle = -(atan2(a_particleVel.x, a_particleVel.y));
-  float2 pos = float2(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
+  float angle = -(atan2(a_particleVel[0], a_particleVel[1]));
+  float2 pos = float2(((a_pos[0] * cos(angle)) - (a_pos[1] * sin(angle))), ((a_pos[0] * sin(angle)) + (a_pos[1] * cos(angle))));
   return float4((pos + a_particlePos), 0.0f, 1.0f);
 }
 
@@ -57,7 +57,7 @@
 }
 
 void comp_main_inner(constant SimParams& params, device Particles& particlesA, device Particles& particlesB, uint3 gl_GlobalInvocationID) {
-  uint index = gl_GlobalInvocationID.x;
+  uint index = gl_GlobalInvocationID[0];
   if ((index >= 5u)) {
     return;
   }
@@ -74,8 +74,8 @@
     if ((i == index)) {
       continue;
     }
-    pos = particlesA.particles.arr[i].pos.xy;
-    vel = particlesA.particles.arr[i].vel.xy;
+    pos = float2(particlesA.particles.arr[i].pos).xy;
+    vel = float2(particlesA.particles.arr[i].vel).xy;
     if ((distance(pos, vPos) < params.rule1Distance)) {
       cMass = (cMass + pos);
       cMassCount = as_type<int>((as_type<uint>(cMassCount) + as_type<uint>(1)));
@@ -97,17 +97,17 @@
   vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
   vVel = (normalize(vVel) * clamp(length(vVel), 0.0f, 0.100000001f));
   vPos = (vPos + (vVel * params.deltaT));
-  if ((vPos.x < -1.0f)) {
-    vPos.x = 1.0f;
+  if ((vPos[0] < -1.0f)) {
+    vPos[0] = 1.0f;
   }
-  if ((vPos.x > 1.0f)) {
-    vPos.x = -1.0f;
+  if ((vPos[0] > 1.0f)) {
+    vPos[0] = -1.0f;
   }
-  if ((vPos.y < -1.0f)) {
-    vPos.y = 1.0f;
+  if ((vPos[1] < -1.0f)) {
+    vPos[1] = 1.0f;
   }
-  if ((vPos.y > 1.0f)) {
-    vPos.y = -1.0f;
+  if ((vPos[1] > 1.0f)) {
+    vPos[1] = -1.0f;
   }
   particlesB.particles.arr[index].pos = vPos;
   particlesB.particles.arr[index].vel = vVel;
diff --git a/test/shader_io/compute_input_builtins.wgsl.expected.msl b/test/shader_io/compute_input_builtins.wgsl.expected.msl
index 67ecc1b..64dee7c 100644
--- a/test/shader_io/compute_input_builtins.wgsl.expected.msl
+++ b/test/shader_io/compute_input_builtins.wgsl.expected.msl
@@ -2,7 +2,7 @@
 
 using namespace metal;
 void tint_symbol_inner(uint3 local_invocation_id, uint local_invocation_index, uint3 global_invocation_id, uint3 workgroup_id, uint3 num_workgroups) {
-  uint const foo = ((((local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + workgroup_id.x) + num_workgroups.x);
+  uint const foo = ((((local_invocation_id[0] + local_invocation_index) + global_invocation_id[0]) + workgroup_id[0]) + num_workgroups[0]);
 }
 
 kernel void tint_symbol(uint3 local_invocation_id [[thread_position_in_threadgroup]], uint local_invocation_index [[thread_index_in_threadgroup]], uint3 global_invocation_id [[thread_position_in_grid]], uint3 workgroup_id [[threadgroup_position_in_grid]], uint3 num_workgroups [[threadgroups_per_grid]]) {
diff --git a/test/shader_io/compute_input_builtins_struct.wgsl.expected.msl b/test/shader_io/compute_input_builtins_struct.wgsl.expected.msl
index 34db10e..dc5f7ca 100644
--- a/test/shader_io/compute_input_builtins_struct.wgsl.expected.msl
+++ b/test/shader_io/compute_input_builtins_struct.wgsl.expected.msl
@@ -10,7 +10,7 @@
 };
 
 void tint_symbol_inner(ComputeInputs inputs) {
-  uint const foo = ((((inputs.local_invocation_id.x + inputs.local_invocation_index) + inputs.global_invocation_id.x) + inputs.workgroup_id.x) + inputs.num_workgroups.x);
+  uint const foo = ((((inputs.local_invocation_id[0] + inputs.local_invocation_index) + inputs.global_invocation_id[0]) + inputs.workgroup_id[0]) + inputs.num_workgroups[0]);
 }
 
 kernel void tint_symbol(uint3 local_invocation_id [[thread_position_in_threadgroup]], uint local_invocation_index [[thread_index_in_threadgroup]], uint3 global_invocation_id [[thread_position_in_grid]], uint3 workgroup_id [[threadgroup_position_in_grid]], uint3 num_workgroups [[threadgroups_per_grid]]) {
diff --git a/test/shader_io/compute_input_mixed.wgsl.expected.msl b/test/shader_io/compute_input_mixed.wgsl.expected.msl
index 65ca123..e46f80d 100644
--- a/test/shader_io/compute_input_mixed.wgsl.expected.msl
+++ b/test/shader_io/compute_input_mixed.wgsl.expected.msl
@@ -9,7 +9,7 @@
 };
 
 void tint_symbol_inner(ComputeInputs0 inputs0, uint local_invocation_index, uint3 global_invocation_id, ComputeInputs1 inputs1) {
-  uint const foo = (((inputs0.local_invocation_id.x + local_invocation_index) + global_invocation_id.x) + inputs1.workgroup_id.x);
+  uint const foo = (((inputs0.local_invocation_id[0] + local_invocation_index) + global_invocation_id[0]) + inputs1.workgroup_id[0]);
 }
 
 kernel void tint_symbol(uint3 local_invocation_id [[thread_position_in_threadgroup]], uint local_invocation_index [[thread_index_in_threadgroup]], uint3 global_invocation_id [[thread_position_in_grid]], uint3 workgroup_id [[threadgroup_position_in_grid]]) {