reader/spirv: Always run the cleanup transforms

The SPIR-V cleanup transforms were only being run if the
DecomposeStridedMatrix transform needed to be run - despite
the RemoveUnreachableStatements transform needing to be run, always.

Change-Id: I5dc28a79200ab67c96fb793980412a5632e26026
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/78780
Reviewed-by: James Price <jrprice@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/reader/spirv/parser.cc b/src/reader/spirv/parser.cc
index 0191387..2711733 100644
--- a/src/reader/spirv/parser.cc
+++ b/src/reader/spirv/parser.cc
@@ -50,18 +50,12 @@
     return program;
   }
 
-  // If the generated program contains matrices with a custom MatrixStride
-  // attribute then we need to decompose these into an array of vectors
-  if (transform::DecomposeStridedMatrix().ShouldRun(&program)) {
-    transform::Manager manager;
-    manager.Add<transform::Unshadow>();
-    manager.Add<transform::SimplifyPointers>();
-    manager.Add<transform::DecomposeStridedMatrix>();
-    manager.Add<transform::RemoveUnreachableStatements>();
-    return manager.Run(&program).program;
-  }
-
-  return program;
+  transform::Manager manager;
+  manager.Add<transform::Unshadow>();
+  manager.Add<transform::SimplifyPointers>();
+  manager.Add<transform::DecomposeStridedMatrix>();
+  manager.Add<transform::RemoveUnreachableStatements>();
+  return manager.Run(&program).program;
 }
 
 }  // namespace spirv
diff --git a/test/bug/tint/749.spvasm.expected.wgsl b/test/bug/tint/749.spvasm.expected.wgsl
index f23b495..47d1cb8 100644
--- a/test/bug/tint/749.spvasm.expected.wgsl
+++ b/test/bug/tint/749.spvasm.expected.wgsl
@@ -31,11 +31,11 @@
   let x_935 : i32 = temp;
   temp = 0;
   temp = x_935;
-  let x_30 : ptr<private, i32> = &(obj.numbers[x_28]);
-  let x_936 : i32 = *(x_30);
-  *(x_30) = 0;
-  *(x_30) = x_936;
-  let x_31 : i32 = *(x_30);
+  let x_30_save = x_28;
+  let x_936 : i32 = obj.numbers[x_30_save];
+  obj.numbers[x_30_save] = 0;
+  obj.numbers[x_30_save] = x_936;
+  let x_31 : i32 = obj.numbers[x_30_save];
   let x_937 : i32 = temp;
   temp = 0;
   temp = x_937;
@@ -48,26 +48,26 @@
   *(i) = 0;
   *(i) = x_939;
   let x_32 : i32 = *(i);
-  let x_940 : i32 = *(x_30);
-  *(x_30) = 0;
-  *(x_30) = x_940;
+  let x_940 : i32 = obj.numbers[x_30_save];
+  obj.numbers[x_30_save] = 0;
+  obj.numbers[x_30_save] = x_940;
   let x_33 : i32 = *(j);
   let x_941 : i32 = *(i);
   *(i) = 0;
   *(i) = x_941;
   let x_526 : vec3<f32> = vec3<f32>(x_525.x, x_525.z, x_525.z);
-  let x_942 : i32 = *(x_30);
-  *(x_30) = 0;
-  *(x_30) = x_942;
-  let x_34 : ptr<private, i32> = &(obj.numbers[x_33]);
-  let x_35 : i32 = *(x_34);
+  let x_942 : i32 = obj.numbers[x_30_save];
+  obj.numbers[x_30_save] = 0;
+  obj.numbers[x_30_save] = x_942;
+  let x_34_save = x_33;
+  let x_35 : i32 = obj.numbers[x_34_save];
   let x_943 : QuicksortObject = obj;
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   obj = x_943;
   let x_527 : vec2<f32> = vec2<f32>(x_526.x, x_526.x);
-  let x_36 : ptr<private, i32> = &(obj.numbers[x_32]);
+  let x_36_save = x_32;
   let x_528 : vec3<f32> = vec3<f32>(x_524.x, x_524.z, x_524.x);
-  *(x_36) = x_35;
+  obj.numbers[x_36_save] = x_35;
   let x_944 : QuicksortObject = obj;
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   obj = x_944;
@@ -80,24 +80,24 @@
   temp = 0;
   temp = x_946;
   let x_530 : vec2<f32> = vec2<f32>(x_529.z, x_529.y);
-  let x_947 : i32 = *(x_34);
-  *(x_34) = 0;
-  *(x_34) = x_947;
+  let x_947 : i32 = obj.numbers[x_34_save];
+  obj.numbers[x_34_save] = 0;
+  obj.numbers[x_34_save] = x_947;
   let x_38 : i32 = temp;
   let x_948 : i32 = *(j);
   *(j) = 0;
   *(j) = x_948;
   let x_531 : vec3<f32> = vec3<f32>(x_527.x, x_526.y, x_526.x);
-  let x_949 : i32 = *(x_36);
-  *(x_36) = 0;
-  *(x_36) = x_949;
+  let x_949 : i32 = obj.numbers[x_36_save];
+  obj.numbers[x_36_save] = 0;
+  obj.numbers[x_36_save] = x_949;
   let x_950 : QuicksortObject = obj;
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   obj = x_950;
   let x_532 : vec3<f32> = vec3<f32>(x_528.x, x_528.y, x_528.x);
-  let x_951 : i32 = *(x_34);
-  *(x_34) = 0;
-  *(x_34) = x_951;
+  let x_951 : i32 = obj.numbers[x_34_save];
+  obj.numbers[x_34_save] = 0;
+  obj.numbers[x_34_save] = x_951;
   obj.numbers[x_37] = x_38;
   return;
 }
@@ -119,11 +119,11 @@
   let x_953 : i32 = *(l);
   *(l) = 0;
   *(l) = x_953;
-  let x_42 : ptr<private, i32> = &(obj.numbers[x_41]);
-  let x_954 : i32 = *(x_42);
-  *(x_42) = 0;
-  *(x_42) = x_954;
-  let x_43 : i32 = *(x_42);
+  let x_42_save = x_41;
+  let x_954 : i32 = obj.numbers[x_42_save];
+  obj.numbers[x_42_save] = 0;
+  obj.numbers[x_42_save] = x_954;
+  let x_43 : i32 = obj.numbers[x_42_save];
   let x_955 : i32 = param_3;
   param_3 = 0;
   param_3 = x_955;
@@ -184,10 +184,10 @@
       break;
     }
     let x_60 : i32 = j_1;
-    let x_969 : i32 = *(x_42);
-    *(x_42) = 0;
-    *(x_42) = x_969;
-    let x_61 : ptr<private, i32> = &(obj.numbers[x_60]);
+    let x_969 : i32 = obj.numbers[x_42_save];
+    obj.numbers[x_42_save] = 0;
+    obj.numbers[x_42_save] = x_969;
+    let x_61_save = x_60;
     let x_970 : i32 = *(h);
     *(h) = 0;
     *(h) = x_970;
@@ -195,7 +195,7 @@
     let x_971 : i32 = param_1;
     param_1 = 0;
     param_1 = x_971;
-    let x_62 : i32 = *(x_61);
+    let x_62 : i32 = obj.numbers[x_61_save];
     let x_972 : QuicksortObject = obj;
     obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
     obj = x_972;
@@ -268,9 +268,9 @@
       *(h) = 0;
       *(h) = x_988;
       let x_547 : vec3<f32> = vec3<f32>(x_539.x, x_541.z, x_541.z);
-      let x_989 : i32 = *(x_61);
-      *(x_61) = 0;
-      *(x_61) = x_989;
+      let x_989 : i32 = obj.numbers[x_61_save];
+      obj.numbers[x_61_save] = 0;
+      obj.numbers[x_61_save] = x_989;
       let x_990 : i32 = param;
       param = 0;
       param = x_990;
@@ -279,15 +279,15 @@
       param_1 = 0;
       param_1 = x_991;
       let x_548 : vec3<f32> = vec3<f32>(x_541.y, x_541.z, x_541.x);
-      let x_992 : i32 = *(x_61);
-      *(x_61) = 0;
-      *(x_61) = x_992;
+      let x_992 : i32 = obj.numbers[x_61_save];
+      obj.numbers[x_61_save] = 0;
+      obj.numbers[x_61_save] = x_992;
     }
   }
   let x_76 : i32 = i_1;
-  let x_993 : i32 = *(x_42);
-  *(x_42) = 0;
-  *(x_42) = x_993;
+  let x_993 : i32 = obj.numbers[x_42_save];
+  obj.numbers[x_42_save] = 0;
+  obj.numbers[x_42_save] = x_993;
   let x_549 : vec2<f32> = vec2<f32>(x_534.x, x_534.y);
   let x_994 : QuicksortObject = obj;
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
@@ -394,7 +394,7 @@
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   obj = x_1016;
   let x_560 : vec3<f32> = vec3<f32>(x_559.y, x_559.x, x_557.x);
-  let x_96 : ptr<function, i32> = &(stack[x_94]);
+  let x_96_save = x_94;
   let x_1017 : array<i32, 10u> = stack;
   stack = array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
   stack = x_1017;
@@ -402,7 +402,7 @@
   let x_1018 : i32 = l_1;
   l_1 = 0;
   l_1 = 0;
-  *(x_96) = x_95;
+  stack[x_96_save] = x_95;
   let x_1019 : i32 = param_5;
   param_5 = 0;
   param_5 = x_1019;
@@ -411,13 +411,13 @@
   param_4 = 0;
   param_4 = x_1020;
   let x_562 : vec3<f32> = vec3<f32>(vec3<f32>(1.0, 2.0, 3.0).z, x_558.y, vec3<f32>(1.0, 2.0, 3.0).y);
-  let x_1021 : i32 = *(x_96);
-  *(x_96) = 0;
-  *(x_96) = x_1021;
+  let x_1021 : i32 = stack[x_96_save];
+  stack[x_96_save] = 0;
+  stack[x_96_save] = x_1021;
   let x_98 : i32 = (x_97 + 1);
-  let x_1022 : i32 = *(x_96);
-  *(x_96) = 0;
-  *(x_96) = x_1022;
+  let x_1022 : i32 = stack[x_96_save];
+  stack[x_96_save] = 0;
+  stack[x_96_save] = x_1022;
   let x_563 : vec3<f32> = vec3<f32>(x_559.x, x_559.z, x_556.y);
   top = x_98;
   let x_1023 : i32 = param_4;
@@ -431,7 +431,7 @@
   let x_1025 : i32 = l_1;
   l_1 = 0;
   l_1 = x_1025;
-  let x_100 : ptr<function, i32> = &(stack[x_98]);
+  let x_100_save = x_98;
   let x_1026 : i32 = param_5;
   param_5 = 0;
   param_5 = x_1026;
@@ -439,7 +439,7 @@
   let x_1027 : i32 = p;
   p = 0;
   p = x_1027;
-  *(x_100) = x_99;
+  stack[x_100_save] = x_99;
   loop {
     let x_566 : vec3<f32> = vec3<f32>(x_563.x, x_563.x, x_563.x);
     let x_1028 : i32 = h_1;
@@ -480,11 +480,11 @@
     let x_1036 : i32 = p;
     p = 0;
     p = x_1036;
-    let x_110 : ptr<function, i32> = &(stack[x_108]);
-    let x_1037 : i32 = *(x_96);
-    *(x_96) = 0;
-    *(x_96) = x_1037;
-    let x_111 : i32 = *(x_110);
+    let x_110_save = x_108;
+    let x_1037 : i32 = stack[x_96_save];
+    stack[x_96_save] = 0;
+    stack[x_96_save] = x_1037;
+    let x_111 : i32 = stack[x_110_save];
     let x_1038 : array<i32, 10u> = stack;
     stack = array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
     stack = x_1038;
@@ -504,9 +504,9 @@
     let x_1042 : i32 = param_4;
     param_4 = 0;
     param_4 = x_1042;
-    let x_1043 : i32 = *(x_100);
-    *(x_100) = 0;
-    *(x_100) = x_1043;
+    let x_1043 : i32 = stack[x_100_save];
+    stack[x_100_save] = 0;
+    stack[x_100_save] = x_1043;
     let x_573 : vec2<f32> = vec2<f32>(vec3<f32>(1.0, 2.0, 3.0).y, vec3<f32>(1.0, 2.0, 3.0).z);
     top = (x_112 - 1);
     let x_1044 : i32 = param_5;
@@ -516,12 +516,12 @@
     let x_1045 : i32 = h_1;
     h_1 = 0;
     h_1 = x_1045;
-    let x_114 : ptr<function, i32> = &(stack[x_112]);
+    let x_114_save = x_112;
     let x_575 : vec2<f32> = vec2<f32>(x_564.y, x_564.z);
-    let x_1046 : i32 = *(x_100);
-    *(x_100) = 0;
-    *(x_100) = x_1046;
-    let x_115 : i32 = *(x_114);
+    let x_1046 : i32 = stack[x_100_save];
+    stack[x_100_save] = 0;
+    stack[x_100_save] = x_1046;
+    let x_115 : i32 = stack[x_114_save];
     let x_1047 : i32 = p;
     p = 0;
     p = x_1047;
@@ -535,16 +535,16 @@
     top = x_1049;
     let x_118 : i32 = l_1;
     param_4 = x_118;
-    let x_1050 : i32 = *(x_110);
-    *(x_110) = 0;
-    *(x_110) = x_1050;
+    let x_1050 : i32 = stack[x_110_save];
+    stack[x_110_save] = 0;
+    stack[x_110_save] = x_1050;
     let x_577 : vec2<f32> = vec2<f32>(x_569.y, x_569.z);
     let x_120 : i32 = h_1;
     let x_578 : vec2<f32> = vec2<f32>(x_558.x, vec3<f32>(1.0, 2.0, 3.0).y);
     param_5 = x_120;
-    let x_1051 : i32 = *(x_100);
-    *(x_100) = 0;
-    *(x_100) = x_1051;
+    let x_1051 : i32 = stack[x_100_save];
+    stack[x_100_save] = 0;
+    stack[x_100_save] = x_1051;
     let x_121 : i32 = performPartition_i1_i1_(&(param_4), &(param_5));
     let x_579 : vec2<f32> = vec2<f32>(x_567.x, x_568.x);
     let x_1052 : i32 = param_5;
@@ -566,59 +566,59 @@
     h_1 = 0;
     h_1 = x_1056;
     let x_124 : i32 = l_1;
-    let x_1057 : i32 = *(x_110);
-    *(x_110) = 0;
-    *(x_110) = x_1057;
+    let x_1057 : i32 = stack[x_110_save];
+    stack[x_110_save] = 0;
+    stack[x_110_save] = x_1057;
     let x_1058 : i32 = h_1;
     h_1 = 0;
     h_1 = x_1058;
     let x_582 : vec2<f32> = vec2<f32>(x_567.y, x_573.x);
-    let x_1059 : i32 = *(x_100);
-    *(x_100) = 0;
-    *(x_100) = x_1059;
+    let x_1059 : i32 = stack[x_100_save];
+    stack[x_100_save] = 0;
+    stack[x_100_save] = x_1059;
     if (((x_122 - bitcast<i32>(1u)) > x_124)) {
       let x_1060 : i32 = param_4;
       param_4 = 0;
       param_4 = x_1060;
       let x_128 : i32 = top;
       let x_583 : vec2<f32> = vec2<f32>(x_571.y, x_556.y);
-      let x_1061 : i32 = *(x_100);
-      *(x_100) = 0;
-      *(x_100) = x_1061;
+      let x_1061 : i32 = stack[x_100_save];
+      stack[x_100_save] = 0;
+      stack[x_100_save] = x_1061;
       let x_1062 : array<i32, 10u> = stack;
       stack = array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
       stack = x_1062;
       let x_584 : vec2<f32> = vec2<f32>(x_569.z, x_569.y);
       let x_585 : vec3<f32> = vec3<f32>(x_580.y, x_577.x, x_577.x);
       let x_130 : i32 = l_1;
-      let x_1063 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1063;
+      let x_1063 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1063;
       let x_586 : vec2<f32> = vec2<f32>(x_564.x, x_585.x);
       let x_1064 : i32 = param_5;
       param_5 = 0;
       param_5 = x_1064;
-      let x_131 : ptr<function, i32> = &(stack[(1 + x_128)]);
-      let x_1065 : i32 = *(x_110);
-      *(x_110) = 0;
-      *(x_110) = x_1065;
+      let x_131_save = (1 + x_128);
+      let x_1065 : i32 = stack[x_110_save];
+      stack[x_110_save] = 0;
+      stack[x_110_save] = x_1065;
       let x_587 : vec3<f32> = vec3<f32>(x_566.y, x_566.y, x_563.x);
       let x_1066 : i32 = param_5;
       param_5 = 0;
       param_5 = x_1066;
-      *(x_131) = x_130;
+      stack[x_131_save] = x_130;
       let x_132 : i32 = top;
-      let x_1067 : i32 = *(x_100);
-      *(x_100) = 0;
-      *(x_100) = x_1067;
+      let x_1067 : i32 = stack[x_100_save];
+      stack[x_100_save] = 0;
+      stack[x_100_save] = x_1067;
       let x_588 : vec2<f32> = vec2<f32>(x_575.y, x_575.x);
-      let x_1068 : i32 = *(x_131);
-      *(x_131) = 0;
-      *(x_131) = x_1068;
+      let x_1068 : i32 = stack[x_131_save];
+      stack[x_131_save] = 0;
+      stack[x_131_save] = x_1068;
       let x_133 : i32 = bitcast<i32>((1u + bitcast<u32>(x_132)));
-      let x_1069 : i32 = *(x_100);
-      *(x_100) = 0;
-      *(x_100) = x_1069;
+      let x_1069 : i32 = stack[x_100_save];
+      stack[x_100_save] = 0;
+      stack[x_100_save] = x_1069;
       let x_589 : vec3<f32> = vec3<f32>(x_576.z, x_588.y, x_576.z);
       let x_1070 : i32 = h_1;
       h_1 = 0;
@@ -629,73 +629,73 @@
       stack = x_1071;
       let x_134 : i32 = p;
       let x_590 : vec2<f32> = vec2<f32>(x_576.x, x_573.y);
-      let x_1072 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1072;
-      let x_136 : ptr<function, i32> = &(stack[x_133]);
-      let x_1073 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1073;
-      *(x_136) = (x_134 - bitcast<i32>(1u));
-      let x_1074 : i32 = *(x_96);
-      *(x_96) = 0;
-      *(x_96) = x_1074;
+      let x_1072 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1072;
+      let x_136_save = x_133;
+      let x_1073 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1073;
+      stack[x_136_save] = (x_134 - bitcast<i32>(1u));
+      let x_1074 : i32 = stack[x_96_save];
+      stack[x_96_save] = 0;
+      stack[x_96_save] = x_1074;
       let x_591 : vec2<f32> = vec2<f32>(x_569.z, x_569.y);
-      let x_1075 : i32 = *(x_136);
-      *(x_136) = 0;
-      *(x_136) = x_1075;
+      let x_1075 : i32 = stack[x_136_save];
+      stack[x_136_save] = 0;
+      stack[x_136_save] = x_1075;
     }
-    let x_1076 : i32 = *(x_96);
-    *(x_96) = 0;
-    *(x_96) = x_1076;
+    let x_1076 : i32 = stack[x_96_save];
+    stack[x_96_save] = 0;
+    stack[x_96_save] = x_1076;
     let x_592 : vec2<f32> = vec2<f32>(vec3<f32>(1.0, 2.0, 3.0).x, vec3<f32>(1.0, 2.0, 3.0).y);
     let x_1077 : QuicksortObject = obj;
     obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
     obj = x_1077;
     let x_137 : i32 = p;
-    let x_1078 : i32 = *(x_114);
-    *(x_114) = 0;
-    *(x_114) = x_1078;
+    let x_1078 : i32 = stack[x_114_save];
+    stack[x_114_save] = 0;
+    stack[x_114_save] = x_1078;
     let x_593 : vec3<f32> = vec3<f32>(x_571.z, x_556.x, x_556.y);
     let x_1079 : i32 = p;
     p = 0;
     p = x_1079;
     let x_594 : vec3<f32> = vec3<f32>(x_563.z, x_563.x, x_575.x);
-    let x_1080 : i32 = *(x_114);
-    *(x_114) = 0;
-    *(x_114) = x_1080;
+    let x_1080 : i32 = stack[x_114_save];
+    stack[x_114_save] = 0;
+    stack[x_114_save] = x_1080;
     let x_139 : i32 = h_1;
     let x_1081 : i32 = top;
     top = 0;
     top = x_1081;
     let x_595 : vec3<f32> = vec3<f32>(x_560.z, x_568.x, x_560.x);
-    let x_1082 : i32 = *(x_100);
-    *(x_100) = 0;
-    *(x_100) = x_1082;
+    let x_1082 : i32 = stack[x_100_save];
+    stack[x_100_save] = 0;
+    stack[x_100_save] = x_1082;
     let x_1083 : i32 = p;
     p = 0;
     p = x_1083;
     if ((bitcast<i32>((1u + bitcast<u32>(x_137))) < x_139)) {
-      let x_1084 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1084;
+      let x_1084 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1084;
       let x_596 : vec2<f32> = vec2<f32>(x_592.y, x_582.x);
       let x_1085 : i32 = l_1;
       l_1 = 0;
       l_1 = x_1085;
       let x_143 : i32 = top;
-      let x_1086 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1086;
+      let x_1086 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1086;
       let x_597 : vec3<f32> = vec3<f32>(x_562.y, x_560.y, x_560.y);
       let x_144 : i32 = (x_143 + 1);
       let x_1087 : i32 = param_5;
       param_5 = 0;
       param_5 = x_1087;
       top = x_144;
-      let x_1088 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1088;
+      let x_1088 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1088;
       let x_145 : i32 = p;
       let x_1089 : i32 = param_5;
       param_5 = 0;
@@ -705,53 +705,53 @@
       p = 0;
       p = x_1090;
       let x_600 : vec3<f32> = vec3<f32>(x_556.x, x_580.x, x_580.x);
-      let x_1091 : i32 = *(x_100);
-      *(x_100) = 0;
-      *(x_100) = x_1091;
-      let x_147 : ptr<function, i32> = &(stack[x_144]);
-      let x_1092 : i32 = *(x_110);
-      *(x_110) = 0;
-      *(x_110) = x_1092;
+      let x_1091 : i32 = stack[x_100_save];
+      stack[x_100_save] = 0;
+      stack[x_100_save] = x_1091;
+      let x_147_save = x_144;
+      let x_1092 : i32 = stack[x_110_save];
+      stack[x_110_save] = 0;
+      stack[x_110_save] = x_1092;
       let x_601 : vec2<f32> = vec2<f32>(x_563.x, x_563.y);
-      *(x_147) = bitcast<i32>((1u + bitcast<u32>(x_145)));
+      stack[x_147_save] = bitcast<i32>((1u + bitcast<u32>(x_145)));
       let x_1093 : array<i32, 10u> = stack;
       stack = array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
       stack = x_1093;
       let x_148 : i32 = top;
-      let x_1094 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1094;
+      let x_1094 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1094;
       let x_602 : vec2<f32> = vec2<f32>(x_565.y, x_599.y);
       let x_1095 : array<i32, 10u> = stack;
       stack = array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
       stack = x_1095;
       let x_149 : i32 = (x_148 + bitcast<i32>(1u));
-      let x_1096 : i32 = *(x_147);
-      *(x_147) = 0;
-      *(x_147) = x_1096;
+      let x_1096 : i32 = stack[x_147_save];
+      stack[x_147_save] = 0;
+      stack[x_147_save] = x_1096;
       top = x_149;
       let x_1097 : i32 = param_4;
       param_4 = 0;
       param_4 = x_1097;
       let x_150 : i32 = h_1;
-      let x_1098 : i32 = *(x_100);
-      *(x_100) = 0;
-      *(x_100) = x_1098;
-      let x_1099 : i32 = *(x_96);
-      *(x_96) = 0;
-      *(x_96) = x_1099;
+      let x_1098 : i32 = stack[x_100_save];
+      stack[x_100_save] = 0;
+      stack[x_100_save] = x_1098;
+      let x_1099 : i32 = stack[x_96_save];
+      stack[x_96_save] = 0;
+      stack[x_96_save] = x_1099;
       stack[x_149] = x_150;
-      let x_1100 : i32 = *(x_114);
-      *(x_114) = 0;
-      *(x_114) = x_1100;
+      let x_1100 : i32 = stack[x_114_save];
+      stack[x_114_save] = 0;
+      stack[x_114_save] = x_1100;
       let x_603 : vec3<f32> = vec3<f32>(x_568.y, x_564.x, x_564.x);
       let x_1101 : i32 = l_1;
       l_1 = 0;
       l_1 = x_1101;
     }
-    let x_1102 : i32 = *(x_100);
-    *(x_100) = 0;
-    *(x_100) = x_1102;
+    let x_1102 : i32 = stack[x_100_save];
+    stack[x_100_save] = 0;
+    stack[x_100_save] = x_1102;
 
     continuing {
       let x_1103 : i32 = l_1;
@@ -852,17 +852,16 @@
   let x_769 : QuicksortObject = obj;
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   obj = x_769;
-  let x_200 : ptr<private, i32> = &(obj.numbers[0u]);
-  let x_770 : i32 = *(x_200);
-  *(x_200) = 0;
-  *(x_200) = x_770;
-  let x_201 : i32 = *(x_200);
+  let x_770 : i32 = obj.numbers[0u];
+  obj.numbers[0u] = 0;
+  obj.numbers[0u] = x_770;
+  let x_201 : i32 = obj.numbers[0u];
   let x_771 : QuicksortObject = obj;
   obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
   obj = x_771;
-  let x_772 : i32 = *(x_200);
-  *(x_200) = 0;
-  *(x_200) = x_772;
+  let x_772 : i32 = obj.numbers[0u];
+  obj.numbers[0u] = 0;
+  obj.numbers[0u] = x_772;
   let x_206 : f32 = color.x;
   let x_773 : f32 = color.x;
   color.x = 0.0;
@@ -895,9 +894,9 @@
     let x_780 : i32 = i_2;
     i_2 = 0;
     i_2 = x_780;
-    let x_781 : i32 = *(x_200);
-    *(x_200) = 0;
-    *(x_200) = x_781;
+    let x_781 : i32 = obj.numbers[0u];
+    obj.numbers[0u] = 0;
+    obj.numbers[0u] = x_781;
     let x_456 : vec3<f32> = vec3<f32>(vec2<f32>().y, x_448.y, x_448.y);
     let x_782 : f32 = uv.x;
     uv.x = 0.0;
@@ -932,9 +931,9 @@
     color[0] = 0.0;
     color[0] = x_790;
     color.x = (f32(x_216) + x_219);
-    let x_791 : i32 = *(x_200);
-    *(x_200) = 0;
-    *(x_200) = x_791;
+    let x_791 : i32 = obj.numbers[0u];
+    obj.numbers[0u] = 0;
+    obj.numbers[0u] = x_791;
   }
   let x_792 : f32 = uv.x;
   uv.x = 0.0;
@@ -965,7 +964,6 @@
     let x_799 : f32 = color.x;
     color.x = 0.0;
     color.x = x_799;
-    let x_229 : ptr<private, i32> = &(obj.numbers[2u]);
     let x_800 : f32 = color.x;
     color.x = 0.0;
     color.x = x_800;
@@ -973,24 +971,24 @@
     let x_801 : f32 = color.x;
     color.x = 0.0;
     color.x = x_801;
-    let x_230 : i32 = *(x_229);
+    let x_230 : i32 = obj.numbers[2u];
     let x_802 : f32 = uv.x;
     uv.x = 0.0;
     uv.x = x_802;
     let x_803 : f32 = color.x;
     color.x = 0.0;
     color.x = x_803;
-    let x_804 : i32 = *(x_229);
-    *(x_229) = 0;
-    *(x_229) = x_804;
+    let x_804 : i32 = obj.numbers[2u];
+    obj.numbers[2u] = 0;
+    obj.numbers[2u] = x_804;
     let x_464 : vec2<f32> = vec2<f32>(x_450.y, x_191.x);
     let x_805 : f32 = color.y;
     color.y = 0.0;
     color.y = x_805;
     let x_234 : f32 = color.y;
-    let x_806 : i32 = *(x_229);
-    *(x_229) = 0;
-    *(x_229) = x_806;
+    let x_806 : i32 = obj.numbers[2u];
+    obj.numbers[2u] = 0;
+    obj.numbers[2u] = x_806;
     let x_465 : vec2<f32> = vec2<f32>(x_463.x, x_185.x);
     let x_807 : f32 = color.x;
     color.x = 0.0;
@@ -1047,9 +1045,9 @@
     let x_821 : f32 = color.z;
     color.z = 0.0;
     color.z = x_821;
-    let x_822 : i32 = *(x_200);
-    *(x_200) = 0;
-    *(x_200) = x_822;
+    let x_822 : i32 = obj.numbers[0u];
+    obj.numbers[0u] = 0;
+    obj.numbers[0u] = x_822;
     let x_470 : vec2<f32> = vec2<f32>(vec2<f32>().x, vec2<f32>().y);
     let x_823 : f32 = color.z;
     color.z = 0.0;
@@ -1064,8 +1062,7 @@
   uv[0] = 0.0;
   uv[0] = x_825;
   let x_472 : vec3<f32> = vec3<f32>(x_454.x, x_454.y, x_454.y);
-  let x_253 : ptr<private, i32> = &(obj.numbers[4]);
-  let x_254 : i32 = *(x_253);
+  let x_254 : i32 = obj.numbers[4];
   let x_826 : f32 = uv[0];
   uv[0] = 0.0;
   uv[0] = x_826;
@@ -1073,9 +1070,9 @@
   color = vec3<f32>(0.0, 0.0, 0.0);
   color = x_827;
   let x_473 : vec3<f32> = vec3<f32>(x_446.y, x_453.x, x_453.x);
-  let x_828 : i32 = *(x_253);
-  *(x_253) = 0;
-  *(x_253) = x_828;
+  let x_828 : i32 = obj.numbers[4];
+  obj.numbers[4] = 0;
+  obj.numbers[4] = x_828;
   let x_474 : vec2<f32> = vec2<f32>(x_191.x, x_184.z);
   let x_829 : f32 = uv.x;
   uv.x = 0.0;
@@ -1109,9 +1106,9 @@
   i_2 = 0;
   i_2 = x_836;
   let x_479 : vec3<f32> = vec3<f32>(vec2<f32>().y, x_454.y, vec2<f32>().x);
-  let x_837 : i32 = *(x_200);
-  *(x_200) = 0;
-  *(x_200) = x_837;
+  let x_837 : i32 = obj.numbers[0u];
+  obj.numbers[0u] = 0;
+  obj.numbers[0u] = x_837;
   let x_838 : f32 = color.y;
   color.y = 0.0;
   color.y = x_838;
@@ -1165,19 +1162,18 @@
   let x_851 : f32 = uv.y;
   uv.y = 0.0;
   uv.y = x_851;
-  let x_852 : i32 = *(x_253);
-  *(x_253) = 0;
-  *(x_253) = x_852;
+  let x_852 : i32 = obj.numbers[4];
+  obj.numbers[4] = 0;
+  obj.numbers[4] = x_852;
   let x_274 : f32 = uv.y;
-  let x_853 : i32 = *(x_200);
-  *(x_200) = 0;
-  *(x_200) = x_853;
+  let x_853 : i32 = obj.numbers[0u];
+  obj.numbers[0u] = 0;
+  obj.numbers[0u] = x_853;
   if ((x_274 > 0.5)) {
     let x_854 : f32 = uv.x;
     uv.x = 0.0;
     uv.x = x_854;
     let x_486 : vec2<f32> = vec2<f32>(x_480.y, x_455.y);
-    let x_279 : ptr<private, i32> = &(obj.numbers[6u]);
     let x_855 : f32 = color.y;
     color.y = 0.0;
     color.y = x_855;
@@ -1185,16 +1181,16 @@
     let x_856 : f32 = uv.y;
     uv.y = 0.0;
     uv.y = x_856;
-    let x_280 : i32 = *(x_279);
+    let x_280 : i32 = obj.numbers[6u];
     let x_857 : f32 = uv.y;
     uv.y = 0.0;
     uv.y = x_857;
     let x_858 : i32 = i_2;
     i_2 = 0;
     i_2 = x_858;
-    let x_859 : i32 = *(x_253);
-    *(x_253) = 0;
-    *(x_253) = x_859;
+    let x_859 : i32 = obj.numbers[4];
+    obj.numbers[4] = 0;
+    obj.numbers[4] = x_859;
     let x_488 : vec2<f32> = vec2<f32>(x_473.z, x_473.y);
     let x_283 : f32 = color.y;
     let x_860 : vec2<f32> = uv;
@@ -1204,12 +1200,12 @@
     color.x = 0.0;
     color.x = x_861;
     let x_489 : vec2<f32> = vec2<f32>(x_475.y, x_475.x);
-    let x_862 : i32 = *(x_279);
-    *(x_279) = 0;
-    *(x_279) = x_862;
-    let x_863 : i32 = *(x_279);
-    *(x_279) = 0;
-    *(x_279) = x_863;
+    let x_862 : i32 = obj.numbers[6u];
+    obj.numbers[6u] = 0;
+    obj.numbers[6u] = x_862;
+    let x_863 : i32 = obj.numbers[6u];
+    obj.numbers[6u] = 0;
+    obj.numbers[6u] = x_863;
     let x_490 : vec2<f32> = vec2<f32>(x_480.z, x_480.z);
     let x_864 : QuicksortObject = obj;
     obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
@@ -1239,9 +1235,9 @@
   color.y = 0.0;
   color.y = x_870;
   let x_494 : vec3<f32> = vec3<f32>(x_191.x, x_191.y, x_191.y);
-  let x_871 : i32 = *(x_253);
-  *(x_253) = 0;
-  *(x_253) = x_871;
+  let x_871 : i32 = obj.numbers[4];
+  obj.numbers[4] = 0;
+  obj.numbers[4] = x_871;
   if ((x_287 > 0.75)) {
     let x_872 : vec3<f32> = color;
     color = vec3<f32>(0.0, 0.0, 0.0);
@@ -1262,9 +1258,9 @@
     color.y = 0.0;
     color.y = x_876;
     let x_497 : vec2<f32> = vec2<f32>(x_477.x, x_461.y);
-    let x_877 : i32 = *(x_200);
-    *(x_200) = 0;
-    *(x_200) = x_877;
+    let x_877 : i32 = obj.numbers[0u];
+    obj.numbers[0u] = 0;
+    obj.numbers[0u] = x_877;
     let x_878 : f32 = color.y;
     color.y = 0.0;
     color.y = x_878;
@@ -1306,15 +1302,14 @@
   let x_888 : vec2<f32> = uv;
   uv = vec2<f32>(0.0, 0.0);
   uv = x_888;
-  let x_300 : ptr<private, i32> = &(obj.numbers[8]);
-  let x_301 : i32 = *(x_300);
+  let x_301 : i32 = obj.numbers[8];
   let x_889 : i32 = i_2;
   i_2 = 0;
   i_2 = x_889;
   let x_503 : vec2<f32> = vec2<f32>(x_185.x, x_451.z);
-  let x_890 : i32 = *(x_300);
-  *(x_300) = 0;
-  *(x_300) = x_890;
+  let x_890 : i32 = obj.numbers[8];
+  obj.numbers[8] = 0;
+  obj.numbers[8] = x_890;
   let x_891 : f32 = color.y;
   color.y = 0.0;
   color.y = x_891;
@@ -1331,9 +1326,9 @@
   color.x = 0.0;
   color.x = x_894;
   let x_506 : vec2<f32> = vec2<f32>(x_493.x, x_492.x);
-  let x_895 : i32 = *(x_253);
-  *(x_253) = 0;
-  *(x_253) = x_895;
+  let x_895 : i32 = obj.numbers[4];
+  obj.numbers[4] = 0;
+  obj.numbers[4] = x_895;
   let x_896 : f32 = uv.y;
   uv.y = 0.0;
   uv.y = x_896;
@@ -1382,9 +1377,9 @@
   uv.y = 0.0;
   uv.y = x_908;
   let x_512 : vec3<f32> = vec3<f32>(x_455.y, x_455.y, x_455.y);
-  let x_909 : i32 = *(x_253);
-  *(x_253) = 0;
-  *(x_253) = x_909;
+  let x_909 : i32 = obj.numbers[4];
+  obj.numbers[4] = 0;
+  obj.numbers[4] = x_909;
   if ((abs((x_308 - x_310)) < 0.25)) {
     let x_910 : f32 = uv.x;
     uv.x = 0.0;
@@ -1393,9 +1388,9 @@
     obj = QuicksortObject(array<i32, 10u>(0, 0, 0, 0, 0, 0, 0, 0, 0, 0));
     obj = x_911;
     let x_513 : vec3<f32> = vec3<f32>(x_505.z, x_505.x, x_448.x);
-    let x_912 : i32 = *(x_300);
-    *(x_300) = 0;
-    *(x_300) = x_912;
+    let x_912 : i32 = obj.numbers[8];
+    obj.numbers[8] = 0;
+    obj.numbers[8] = x_912;
     let x_317 : i32 = obj.numbers[9u];
     let x_514 : vec3<f32> = vec3<f32>(x_474.y, x_474.y, x_474.y);
     let x_913 : f32 = uv.y;
diff --git a/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl b/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl
index 82d9c5a..c70da4e 100644
--- a/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl
+++ b/test/ptr_ref/copy/ptr_copy.spvasm.expected.wgsl
@@ -1,7 +1,5 @@
 fn main_1() {
   var x_10 : u32;
-  let x_1 : ptr<function, u32> = &(x_10);
-  let x_2 : ptr<function, u32> = x_1;
   return;
 }