[tint][msl] Add subgroup(Exclusive){Add,Mul}

Implement subgroup(Exclusive)Add and Mul in the MSL backend using the
following mapping:

+----------------------+-------------------------------+
|       Built-in       |              MSL              |
+----------------------+-------------------------------+
| subgroupAdd          | simd_sum                      |
| subgroupExclusiveAdd | simd_prefix_exclusive_sum     |
| subgroupMul          | simd_product                  |
| subgroupExclusiveMul | simd_prefix_exclusive_product |
+----------------------+-------------------------------+

Bug: 354738715
Change-Id: Ib0979fe1e62ce1002b6539358e4e039f4ba5f482
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/201074
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Natalie Chouinard <chouinard@google.com>
diff --git a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
index fe8ba5b..e4b7a10 100644
--- a/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/msl/writer/ast_printer/ast_printer.cc
@@ -805,6 +805,42 @@
             return true;
         }
 
+        case wgsl::BuiltinFn::kSubgroupAdd: {
+            out << "simd_sum(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
+        case wgsl::BuiltinFn::kSubgroupExclusiveAdd: {
+            out << "simd_prefix_exclusive_sum(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
+        case wgsl::BuiltinFn::kSubgroupMul: {
+            out << "simd_product(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
+        case wgsl::BuiltinFn::kSubgroupExclusiveMul: {
+            out << "simd_prefix_exclusive_product(";
+            if (!EmitExpression(out, expr->args[0])) {
+                return false;
+            }
+            out << ")";
+            return true;
+        }
+
         default:
             break;
     }
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 2d6d849..ad64f17 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -876,6 +876,8 @@
     }
 
     void EmitCoreBuiltinName(StringStream& out, core::BuiltinFn func) {
+        // TODO(crbug.com/354738715): Implement subgroupBallot and subgroupBroadcast in MSL
+        // IR backend.
         switch (func) {
             case core::BuiltinFn::kAbs:
             case core::BuiltinFn::kAcos:
@@ -976,6 +978,18 @@
             case core::BuiltinFn::kSmoothstep:
                 out << "smoothstep";
                 break;
+            case core::BuiltinFn::kSubgroupAdd:
+                out << "simd_sum";
+                break;
+            case core::BuiltinFn::kSubgroupExclusiveAdd:
+                out << "simd_prefix_exclusive_sum";
+                break;
+            case core::BuiltinFn::kSubgroupMul:
+                out << "simd_product";
+                break;
+            case core::BuiltinFn::kSubgroupExclusiveMul:
+                out << "simd_prefix_exclusive_product";
+                break;
             case core::BuiltinFn::kInverseSqrt:
                 out << "rsqrt";
                 break;
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..ac492e0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupAdd_0dd12a() {
+  half3 res = simd_sum(half3(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_0dd12a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl
index 06eaf1c..26798e0 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupAdd_0dd12a() -> vec3<f16> {
-  var res : vec3<f16> = subgroupAdd(vec3<f16>(1.0h));
+using namespace metal;
+half3 subgroupAdd_0dd12a() {
+  half3 res = simd_sum(half3(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_0dd12a();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupAdd_0dd12a());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl
new file mode 100644
index 0000000..47c684f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupAdd_1280c8() {
+  uint2 res = simd_sum(uint2(1u));
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1280c8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl
index c2da93d..2b29e3a 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupAdd_1280c8() -> vec2<u32> {
-  var res : vec2<u32> = subgroupAdd(vec2<u32>(1u));
+using namespace metal;
+uint2 subgroupAdd_1280c8() {
+  uint2 res = simd_sum(uint2(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_1280c8();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_1280c8();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl
new file mode 100644
index 0000000..734bad7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupAdd_1eb429() {
+  int2 res = simd_sum(int2(1));
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1eb429();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl
index 178f18b..444bdb1 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupAdd_1eb429() -> vec2<i32> {
-  var res : vec2<i32> = subgroupAdd(vec2<i32>(1i));
+using namespace metal;
+int2 subgroupAdd_1eb429() {
+  int2 res = simd_sum(int2(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_1eb429();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_1eb429();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9bbad35
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupAdd_225207() {
+  half res = simd_sum(1.0h);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_225207();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl
index c131b6c..b63b70a 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupAdd_225207() -> f16 {
-  var res : f16 = subgroupAdd(1.0h);
+using namespace metal;
+half subgroupAdd_225207() {
+  half res = simd_sum(1.0h);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_225207();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_225207();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl
new file mode 100644
index 0000000..94b82a1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupAdd_22d041() {
+  int3 res = simd_sum(int3(1));
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_22d041();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl
index 3e6533d..cba89c2 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupAdd_22d041() -> vec3<i32> {
-  var res : vec3<i32> = subgroupAdd(vec3<i32>(1i));
+using namespace metal;
+int3 subgroupAdd_22d041() {
+  int3 res = simd_sum(int3(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_22d041();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupAdd_22d041());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e645afe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupAdd_28db2c() {
+  int4 res = simd_sum(int4(1));
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_28db2c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl
index 43b1b80..b965d3e 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupAdd_28db2c() -> vec4<i32> {
-  var res : vec4<i32> = subgroupAdd(vec4<i32>(1i));
+using namespace metal;
+int4 subgroupAdd_28db2c() {
+  int4 res = simd_sum(int4(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_28db2c();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_28db2c();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..cd777ee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupAdd_2ab40a() {
+  half4 res = simd_sum(half4(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_2ab40a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl
index 377a8c8..c34c475 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupAdd_2ab40a() -> vec4<f16> {
-  var res : vec4<f16> = subgroupAdd(vec4<f16>(1.0h));
+using namespace metal;
+half4 subgroupAdd_2ab40a() {
+  half4 res = simd_sum(half4(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_2ab40a();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_2ab40a();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl
new file mode 100644
index 0000000..09752ea
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupAdd_3854ae() {
+  float res = simd_sum(1.0f);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_3854ae();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl
index dbdbb0b..bee8c16 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupAdd_3854ae() -> f32 {
-  var res : f32 = subgroupAdd(1.0f);
+using namespace metal;
+float subgroupAdd_3854ae() {
+  float res = simd_sum(1.0f);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_3854ae();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_3854ae();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5cb63ff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupAdd_6587ff() {
+  uint3 res = simd_sum(uint3(1u));
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_6587ff();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl
index bede1d9..c2c0b84 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupAdd_6587ff() -> vec3<u32> {
-  var res : vec3<u32> = subgroupAdd(vec3<u32>(1u));
+using namespace metal;
+uint3 subgroupAdd_6587ff() {
+  uint3 res = simd_sum(uint3(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_6587ff();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupAdd_6587ff());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl
new file mode 100644
index 0000000..16b35fc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupAdd_7d1215() {
+  float3 res = simd_sum(float3(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_7d1215();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl
index 3f535fa..7bf3aae 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupAdd_7d1215() -> vec3<f32> {
-  var res : vec3<f32> = subgroupAdd(vec3<f32>(1.0f));
+using namespace metal;
+float3 subgroupAdd_7d1215() {
+  float3 res = simd_sum(float3(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_7d1215();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupAdd_7d1215());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl
new file mode 100644
index 0000000..11faa14
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupAdd_8f4c15() {
+  float4 res = simd_sum(float4(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_8f4c15();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl
index ac5875c..3923981 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupAdd_8f4c15() -> vec4<f32> {
-  var res : vec4<f32> = subgroupAdd(vec4<f32>(1.0f));
+using namespace metal;
+float4 subgroupAdd_8f4c15() {
+  float4 res = simd_sum(float4(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_8f4c15();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_8f4c15();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl
new file mode 100644
index 0000000..db917f8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupAdd_b61df7() {
+  uint res = simd_sum(1u);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_b61df7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl
index 889d329..613b4d9 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupAdd_b61df7() -> u32 {
-  var res : u32 = subgroupAdd(1u);
+using namespace metal;
+uint subgroupAdd_b61df7() {
+  uint res = simd_sum(1u);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_b61df7();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_b61df7();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e19e783
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupAdd_ba53f9() {
+  int res = simd_sum(1);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_ba53f9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl
index 810b372..f919c52 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupAdd_ba53f9() -> i32 {
-  var res : i32 = subgroupAdd(1i);
+using namespace metal;
+int subgroupAdd_ba53f9() {
+  int res = simd_sum(1);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_ba53f9();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_ba53f9();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4899492
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupAdd_cae1ed() {
+  half2 res = simd_sum(half2(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_cae1ed();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl
index 9576828..a067472 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupAdd_cae1ed() -> vec2<f16> {
-  var res : vec2<f16> = subgroupAdd(vec2<f16>(1.0h));
+using namespace metal;
+half2 subgroupAdd_cae1ed() {
+  half2 res = simd_sum(half2(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_cae1ed();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_cae1ed();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..2019047
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupAdd_dcf73f() {
+  float2 res = simd_sum(float2(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_dcf73f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl
index cee484a..73ba83a 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupAdd_dcf73f() -> vec2<f32> {
-  var res : vec2<f32> = subgroupAdd(vec2<f32>(1.0f));
+using namespace metal;
+float2 subgroupAdd_dcf73f() {
+  float2 res = simd_sum(float2(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_dcf73f();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_dcf73f();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl
new file mode 100644
index 0000000..dd5e4fe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupAdd_fbc357() {
+  uint4 res = simd_sum(uint4(1u));
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_fbc357();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl
index b07b13d..8e94ec5 100644
--- a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupAdd_fbc357() -> vec4<u32> {
-  var res : vec4<u32> = subgroupAdd(vec4<u32>(1u));
+using namespace metal;
+uint4 subgroupAdd_fbc357() {
+  uint4 res = simd_sum(uint4(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_fbc357();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_fbc357();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f595c4a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupExclusiveAdd_01de08() {
+  half2 res = simd_prefix_exclusive_sum(half2(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_01de08();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl
index b9a56ed..e1c515e 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupExclusiveAdd_01de08() -> vec2<f16> {
-  var res : vec2<f16> = subgroupExclusiveAdd(vec2<f16>(1.0h));
+using namespace metal;
+half2 subgroupExclusiveAdd_01de08() {
+  half2 res = simd_prefix_exclusive_sum(half2(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_01de08();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_01de08();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..a2c95f9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupExclusiveAdd_0ff95a() {
+  uint3 res = simd_prefix_exclusive_sum(uint3(1u));
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_0ff95a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
index 10f14a5..710a088 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupExclusiveAdd_0ff95a() -> vec3<u32> {
-  var res : vec3<u32> = subgroupExclusiveAdd(vec3<u32>(1u));
+using namespace metal;
+uint3 subgroupExclusiveAdd_0ff95a() {
+  uint3 res = simd_prefix_exclusive_sum(uint3(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_0ff95a();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupExclusiveAdd_0ff95a());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e2adb10
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupExclusiveAdd_406ab4() {
+  int4 res = simd_prefix_exclusive_sum(int4(1));
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_406ab4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
index 79a957a..c962258 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupExclusiveAdd_406ab4() -> vec4<i32> {
-  var res : vec4<i32> = subgroupExclusiveAdd(vec4<i32>(1i));
+using namespace metal;
+int4 subgroupExclusiveAdd_406ab4() {
+  int4 res = simd_prefix_exclusive_sum(int4(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_406ab4();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_406ab4();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d400884
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupExclusiveAdd_41cfde() {
+  float3 res = simd_prefix_exclusive_sum(float3(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_41cfde();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
index e5d015d..e803149 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupExclusiveAdd_41cfde() -> vec3<f32> {
-  var res : vec3<f32> = subgroupExclusiveAdd(vec3<f32>(1.0f));
+using namespace metal;
+float3 subgroupExclusiveAdd_41cfde() {
+  float3 res = simd_prefix_exclusive_sum(float3(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_41cfde();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupExclusiveAdd_41cfde());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d192852
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupExclusiveAdd_42684c() {
+  uint res = simd_prefix_exclusive_sum(1u);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_42684c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl
index 84a26b7..d6399b9 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupExclusiveAdd_42684c() -> u32 {
-  var res : u32 = subgroupExclusiveAdd(1u);
+using namespace metal;
+uint subgroupExclusiveAdd_42684c() {
+  uint res = simd_prefix_exclusive_sum(1u);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_42684c();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_42684c();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
new file mode 100644
index 0000000..349ff97
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupExclusiveAdd_48acea() {
+  uint2 res = simd_prefix_exclusive_sum(uint2(1u));
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_48acea();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl
index e981a67..e7102c6 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupExclusiveAdd_48acea() -> vec2<u32> {
-  var res : vec2<u32> = subgroupExclusiveAdd(vec2<u32>(1u));
+using namespace metal;
+uint2 subgroupExclusiveAdd_48acea() {
+  uint2 res = simd_prefix_exclusive_sum(uint2(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_48acea();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_48acea();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
new file mode 100644
index 0000000..ea83663
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupExclusiveAdd_4a1568() {
+  half res = simd_prefix_exclusive_sum(1.0h);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4a1568();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
index 6d99143..627b505 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupExclusiveAdd_4a1568() -> f16 {
-  var res : f16 = subgroupExclusiveAdd(1.0h);
+using namespace metal;
+half subgroupExclusiveAdd_4a1568() {
+  half res = simd_prefix_exclusive_sum(1.0h);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_4a1568();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_4a1568();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c9e215c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupExclusiveAdd_4c8024() {
+  float2 res = simd_prefix_exclusive_sum(float2(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4c8024();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
index 738ce30..295197d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupExclusiveAdd_4c8024() -> vec2<f32> {
-  var res : vec2<f32> = subgroupExclusiveAdd(vec2<f32>(1.0f));
+using namespace metal;
+float2 subgroupExclusiveAdd_4c8024() {
+  float2 res = simd_prefix_exclusive_sum(float2(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_4c8024();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_4c8024();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b4bd39d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupExclusiveAdd_71ad0f() {
+  float4 res = simd_prefix_exclusive_sum(float4(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_71ad0f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
index 186a08e..5755269 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupExclusiveAdd_71ad0f() -> vec4<f32> {
-  var res : vec4<f32> = subgroupExclusiveAdd(vec4<f32>(1.0f));
+using namespace metal;
+float4 subgroupExclusiveAdd_71ad0f() {
+  float4 res = simd_prefix_exclusive_sum(float4(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_71ad0f();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_71ad0f();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
new file mode 100644
index 0000000..75ba999
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupExclusiveAdd_95e984() {
+  half4 res = simd_prefix_exclusive_sum(half4(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_95e984();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl
index ec6b47d..02d3da3 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupExclusiveAdd_95e984() -> vec4<f16> {
-  var res : vec4<f16> = subgroupExclusiveAdd(vec4<f16>(1.0h));
+using namespace metal;
+half4 subgroupExclusiveAdd_95e984() {
+  half4 res = simd_prefix_exclusive_sum(half4(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_95e984();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_95e984();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9d358dd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupExclusiveAdd_967e38() {
+  float res = simd_prefix_exclusive_sum(1.0f);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_967e38();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl
index 2024c8e..ba00371 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupExclusiveAdd_967e38() -> f32 {
-  var res : f32 = subgroupExclusiveAdd(1.0f);
+using namespace metal;
+float subgroupExclusiveAdd_967e38() {
+  float res = simd_prefix_exclusive_sum(1.0f);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_967e38();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_967e38();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8d49f49
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupExclusiveAdd_b0c261() {
+  int res = simd_prefix_exclusive_sum(1);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_b0c261();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
index 625491b..9dcc63b 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupExclusiveAdd_b0c261() -> i32 {
-  var res : i32 = subgroupExclusiveAdd(1i);
+using namespace metal;
+int subgroupExclusiveAdd_b0c261() {
+  int res = simd_prefix_exclusive_sum(1);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_b0c261();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_b0c261();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b6d018f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupExclusiveAdd_c08160() {
+  int3 res = simd_prefix_exclusive_sum(int3(1));
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_c08160();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl
index 9429d91..86d8cde 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupExclusiveAdd_c08160() -> vec3<i32> {
-  var res : vec3<i32> = subgroupExclusiveAdd(vec3<i32>(1i));
+using namespace metal;
+int3 subgroupExclusiveAdd_c08160() {
+  int3 res = simd_prefix_exclusive_sum(int3(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_c08160();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupExclusiveAdd_c08160());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
new file mode 100644
index 0000000..bdf1bd4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupExclusiveAdd_e58e23() {
+  half3 res = simd_prefix_exclusive_sum(half3(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_e58e23();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
index e8fbd40..1e9b4b6 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupExclusiveAdd_e58e23() -> vec3<f16> {
-  var res : vec3<f16> = subgroupExclusiveAdd(vec3<f16>(1.0h));
+using namespace metal;
+half3 subgroupExclusiveAdd_e58e23() {
+  half3 res = simd_prefix_exclusive_sum(half3(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_e58e23();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupExclusiveAdd_e58e23());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9bfac87
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupExclusiveAdd_ec300f() {
+  uint4 res = simd_prefix_exclusive_sum(uint4(1u));
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_ec300f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
index 6ec76fb..4739fcb 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupExclusiveAdd_ec300f() -> vec4<u32> {
-  var res : vec4<u32> = subgroupExclusiveAdd(vec4<u32>(1u));
+using namespace metal;
+uint4 subgroupExclusiveAdd_ec300f() {
+  uint4 res = simd_prefix_exclusive_sum(uint4(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_ec300f();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_ec300f();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d7a6be8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupExclusiveAdd_f0f712() {
+  int2 res = simd_prefix_exclusive_sum(int2(1));
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_f0f712();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
index 7f44aa1..dc4a7b8 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupExclusiveAdd_f0f712() -> vec2<i32> {
-  var res : vec2<i32> = subgroupExclusiveAdd(vec2<i32>(1i));
+using namespace metal;
+int2 subgroupExclusiveAdd_f0f712() {
+  int2 res = simd_prefix_exclusive_sum(int2(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_f0f712();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_f0f712();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8a3de1c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupExclusiveMul_000b92() {
+  uint4 res = simd_prefix_exclusive_product(uint4(1u));
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_000b92();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl
index 27162ab..334cdcb 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupExclusiveMul_000b92() -> vec4<u32> {
-  var res : vec4<u32> = subgroupExclusiveMul(vec4<u32>(1u));
+using namespace metal;
+uint4 subgroupExclusiveMul_000b92() {
+  uint4 res = simd_prefix_exclusive_product(uint4(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_000b92();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_000b92();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e0f69a9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupExclusiveMul_019660() {
+  int4 res = simd_prefix_exclusive_product(int4(1));
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_019660();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl
index 5f1f7ee..98e1884 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupExclusiveMul_019660() -> vec4<i32> {
-  var res : vec4<i32> = subgroupExclusiveMul(vec4<i32>(1i));
+using namespace metal;
+int4 subgroupExclusiveMul_019660() {
+  int4 res = simd_prefix_exclusive_product(int4(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_019660();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_019660();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
new file mode 100644
index 0000000..a141b09
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupExclusiveMul_0a04d5() {
+  float3 res = simd_prefix_exclusive_product(float3(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_0a04d5();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
index e50e55f..6cd0175 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupExclusiveMul_0a04d5() -> vec3<f32> {
-  var res : vec3<f32> = subgroupExclusiveMul(vec3<f32>(1.0f));
+using namespace metal;
+float3 subgroupExclusiveMul_0a04d5() {
+  float3 res = simd_prefix_exclusive_product(float3(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_0a04d5();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupExclusiveMul_0a04d5());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d9ac306
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupExclusiveMul_13ba26() {
+  half3 res = simd_prefix_exclusive_product(half3(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_13ba26();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl
index 31a1ff5..9903534 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupExclusiveMul_13ba26() -> vec3<f16> {
-  var res : vec3<f16> = subgroupExclusiveMul(vec3<f16>(1.0h));
+using namespace metal;
+half3 subgroupExclusiveMul_13ba26() {
+  half3 res = simd_prefix_exclusive_product(half3(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_13ba26();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupExclusiveMul_13ba26());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e09651a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupExclusiveMul_25d1b9() {
+  float2 res = simd_prefix_exclusive_product(float2(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_25d1b9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
index 6f6293b..ce876f5 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupExclusiveMul_25d1b9() -> vec2<f32> {
-  var res : vec2<f32> = subgroupExclusiveMul(vec2<f32>(1.0f));
+using namespace metal;
+float2 subgroupExclusiveMul_25d1b9() {
+  float2 res = simd_prefix_exclusive_product(float2(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_25d1b9();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_25d1b9();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..50c126f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupExclusiveMul_4525a3() {
+  int2 res = simd_prefix_exclusive_product(int2(1));
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_4525a3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl
index f9f0124..cc05e6e 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupExclusiveMul_4525a3() -> vec2<i32> {
-  var res : vec2<i32> = subgroupExclusiveMul(vec2<i32>(1i));
+using namespace metal;
+int2 subgroupExclusiveMul_4525a3() {
+  int2 res = simd_prefix_exclusive_product(int2(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_4525a3();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_4525a3();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
new file mode 100644
index 0000000..10b6369
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupExclusiveMul_6f431e() {
+  half res = simd_prefix_exclusive_product(1.0h);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_6f431e();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl
index 2d8cabe..3b79eaf 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupExclusiveMul_6f431e() -> f16 {
-  var res : f16 = subgroupExclusiveMul(1.0h);
+using namespace metal;
+half subgroupExclusiveMul_6f431e() {
+  half res = simd_prefix_exclusive_product(1.0h);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_6f431e();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_6f431e();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e584e4d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupExclusiveMul_7b5f57() {
+  float4 res = simd_prefix_exclusive_product(float4(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_7b5f57();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
index d6e2984..38a3122 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupExclusiveMul_7b5f57() -> vec4<f32> {
-  var res : vec4<f32> = subgroupExclusiveMul(vec4<f32>(1.0f));
+using namespace metal;
+float4 subgroupExclusiveMul_7b5f57() {
+  float4 res = simd_prefix_exclusive_product(float4(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_7b5f57();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_7b5f57();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
new file mode 100644
index 0000000..7dd3584
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupExclusiveMul_87f23e() {
+  int3 res = simd_prefix_exclusive_product(int3(1));
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_87f23e();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl
index 68c7a9d..959308d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupExclusiveMul_87f23e() -> vec3<i32> {
-  var res : vec3<i32> = subgroupExclusiveMul(vec3<i32>(1i));
+using namespace metal;
+int3 subgroupExclusiveMul_87f23e() {
+  int3 res = simd_prefix_exclusive_product(int3(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_87f23e();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupExclusiveMul_87f23e());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..dbcebe3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupExclusiveMul_98b2e4() {
+  float res = simd_prefix_exclusive_product(1.0f);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_98b2e4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
index 0637e61..a828ed1 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupExclusiveMul_98b2e4() -> f32 {
-  var res : f32 = subgroupExclusiveMul(1.0f);
+using namespace metal;
+float subgroupExclusiveMul_98b2e4() {
+  float res = simd_prefix_exclusive_product(1.0f);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_98b2e4();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_98b2e4();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e9d947c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupExclusiveMul_a07956() {
+  half4 res = simd_prefix_exclusive_product(half4(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a07956();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl
index df73ff3..237f904 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupExclusiveMul_a07956() -> vec4<f16> {
-  var res : vec4<f16> = subgroupExclusiveMul(vec4<f16>(1.0h));
+using namespace metal;
+half4 subgroupExclusiveMul_a07956() {
+  half4 res = simd_prefix_exclusive_product(half4(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_a07956();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_a07956();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
new file mode 100644
index 0000000..ece7a0a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupExclusiveMul_a23002() {
+  int res = simd_prefix_exclusive_product(1);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a23002();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl
index 6ea7898..ea740d4 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupExclusiveMul_a23002() -> i32 {
-  var res : i32 = subgroupExclusiveMul(1i);
+using namespace metal;
+int subgroupExclusiveMul_a23002() {
+  int res = simd_prefix_exclusive_product(1);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_a23002();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_a23002();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
new file mode 100644
index 0000000..170b39f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupExclusiveMul_d1d490() {
+  uint2 res = simd_prefix_exclusive_product(uint2(1u));
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_d1d490();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl
index 4516b64..90aab98 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupExclusiveMul_d1d490() -> vec2<u32> {
-  var res : vec2<u32> = subgroupExclusiveMul(vec2<u32>(1u));
+using namespace metal;
+uint2 subgroupExclusiveMul_d1d490() {
+  uint2 res = simd_prefix_exclusive_product(uint2(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_d1d490();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_d1d490();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
new file mode 100644
index 0000000..dbd8707
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupExclusiveMul_dc51f8() {
+  uint res = simd_prefix_exclusive_product(1u);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_dc51f8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
index e0c5ca7..b21909d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupExclusiveMul_dc51f8() -> u32 {
-  var res : u32 = subgroupExclusiveMul(1u);
+using namespace metal;
+uint subgroupExclusiveMul_dc51f8() {
+  uint res = simd_prefix_exclusive_product(1u);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_dc51f8();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_dc51f8();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
new file mode 100644
index 0000000..6833a93
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupExclusiveMul_e88d1c() {
+  half2 res = simd_prefix_exclusive_product(half2(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_e88d1c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
index 5d6e10a..d7ebee3 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupExclusiveMul_e88d1c() -> vec2<f16> {
-  var res : vec2<f16> = subgroupExclusiveMul(vec2<f16>(1.0h));
+using namespace metal;
+half2 subgroupExclusiveMul_e88d1c() {
+  half2 res = simd_prefix_exclusive_product(half2(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_e88d1c();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_e88d1c();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..590f77b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupExclusiveMul_f039f4() {
+  uint3 res = simd_prefix_exclusive_product(uint3(1u));
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_f039f4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl
index 23f5857..29de04d 100644
--- a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupExclusiveMul_f039f4() -> vec3<u32> {
-  var res : vec3<u32> = subgroupExclusiveMul(vec3<u32>(1u));
+using namespace metal;
+uint3 subgroupExclusiveMul_f039f4() {
+  uint3 res = simd_prefix_exclusive_product(uint3(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_f039f4();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupExclusiveMul_f039f4());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e19decc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupMul_0de9d3() {
+  float res = simd_product(1.0f);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_0de9d3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl
index 6b40369..f0ed449 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupMul_0de9d3() -> f32 {
-  var res : f32 = subgroupMul(1.0f);
+using namespace metal;
+float subgroupMul_0de9d3() {
+  float res = simd_product(1.0f);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_0de9d3();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_0de9d3();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl
new file mode 100644
index 0000000..74cf643
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupMul_2941a2() {
+  half res = simd_product(1.0h);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_2941a2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl
index e6525f0..b868e64 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupMul_2941a2() -> f16 {
-  var res : f16 = subgroupMul(1.0h);
+using namespace metal;
+half subgroupMul_2941a2() {
+  half res = simd_product(1.0h);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_2941a2();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_2941a2();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl
new file mode 100644
index 0000000..da663c4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupMul_3fe886() {
+  int res = simd_product(1);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_3fe886();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl
index dcb5c61..e5737ea 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupMul_3fe886() -> i32 {
-  var res : i32 = subgroupMul(1i);
+using namespace metal;
+int subgroupMul_3fe886() {
+  int res = simd_product(1);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_3fe886();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_3fe886();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..984264d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupMul_4f8ee6() {
+  uint res = simd_product(1u);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_4f8ee6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl
index f98a558..2e26981 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupMul_4f8ee6() -> u32 {
-  var res : u32 = subgroupMul(1u);
+using namespace metal;
+uint subgroupMul_4f8ee6() {
+  uint res = simd_product(1u);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_4f8ee6();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_4f8ee6();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl
new file mode 100644
index 0000000..6fbfb14
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupMul_53aee2() {
+  half3 res = simd_product(half3(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_53aee2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl
index 94ace2f..b150913 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupMul_53aee2() -> vec3<f16> {
-  var res : vec3<f16> = subgroupMul(vec3<f16>(1.0h));
+using namespace metal;
+half3 subgroupMul_53aee2() {
+  half3 res = simd_product(half3(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_53aee2();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupMul_53aee2());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl
new file mode 100644
index 0000000..88a528c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupMul_5a8c86() {
+  int3 res = simd_product(int3(1));
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_5a8c86();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl
index 05e01c9..1deda7d 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupMul_5a8c86() -> vec3<i32> {
-  var res : vec3<i32> = subgroupMul(vec3<i32>(1i));
+using namespace metal;
+int3 subgroupMul_5a8c86() {
+  int3 res = simd_product(int3(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_5a8c86();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupMul_5a8c86());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl
new file mode 100644
index 0000000..df341d2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupMul_66c813() {
+  float4 res = simd_product(float4(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_66c813();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl
index 144c23b..2cf815d 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupMul_66c813() -> vec4<f32> {
-  var res : vec4<f32> = subgroupMul(vec4<f32>(1.0f));
+using namespace metal;
+float4 subgroupMul_66c813() {
+  float4 res = simd_product(float4(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_66c813();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_66c813();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..f64b1c4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupMul_6aaaf3() {
+  half2 res = simd_product(half2(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_6aaaf3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl
index 23d4166..5c471d6 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupMul_6aaaf3() -> vec2<f16> {
-  var res : vec2<f16> = subgroupMul(vec2<f16>(1.0h));
+using namespace metal;
+half2 subgroupMul_6aaaf3() {
+  half2 res = simd_product(half2(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_6aaaf3();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_6aaaf3();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c928ea7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupMul_93eccd() {
+  float3 res = simd_product(float3(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_93eccd();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl
index 47d6184..1624328 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupMul_93eccd() -> vec3<f32> {
-  var res : vec3<f32> = subgroupMul(vec3<f32>(1.0f));
+using namespace metal;
+float3 subgroupMul_93eccd() {
+  float3 res = simd_product(float3(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_93eccd();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupMul_93eccd());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl
new file mode 100644
index 0000000..2be49de
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupMul_d584a2() {
+  int2 res = simd_product(int2(1));
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_d584a2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl
index dd071f0..a5ec967 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupMul_d584a2() -> vec2<i32> {
-  var res : vec2<i32> = subgroupMul(vec2<i32>(1i));
+using namespace metal;
+int2 subgroupMul_d584a2() {
+  int2 res = simd_product(int2(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_d584a2();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_d584a2();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0814398
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupMul_dc672a() {
+  uint2 res = simd_product(uint2(1u));
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dc672a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl
index e14a785..8f91865 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupMul_dc672a() -> vec2<u32> {
-  var res : vec2<u32> = subgroupMul(vec2<u32>(1u));
+using namespace metal;
+uint2 subgroupMul_dc672a() {
+  uint2 res = simd_product(uint2(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_dc672a();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_dc672a();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl
new file mode 100644
index 0000000..70d9503
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupMul_dd1333() {
+  uint4 res = simd_product(uint4(1u));
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dd1333();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl
index cfcf008..cfa414a 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupMul_dd1333() -> vec4<u32> {
-  var res : vec4<u32> = subgroupMul(vec4<u32>(1u));
+using namespace metal;
+uint4 subgroupMul_dd1333() {
+  uint4 res = simd_product(uint4(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_dd1333();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_dd1333();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl
new file mode 100644
index 0000000..334c605
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupMul_f2ac5b() {
+  half4 res = simd_product(half4(1.0h));
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f2ac5b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl
index ca31b4e..5505f0b 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl
@@ -1,18 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupMul_f2ac5b() -> vec4<f16> {
-  var res : vec4<f16> = subgroupMul(vec4<f16>(1.0h));
+using namespace metal;
+half4 subgroupMul_f2ac5b() {
+  half4 res = simd_product(half4(1.0h));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_f2ac5b();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_f2ac5b();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl
new file mode 100644
index 0000000..bca0a0c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupMul_f78398() {
+  float2 res = simd_product(float2(1.0f));
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f78398();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl
index 74d265c..03bab43 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupMul_f78398() -> vec2<f32> {
-  var res : vec2<f32> = subgroupMul(vec2<f32>(1.0f));
+using namespace metal;
+float2 subgroupMul_f78398() {
+  float2 res = simd_product(float2(1.0f));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_f78398();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_f78398();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl
new file mode 100644
index 0000000..91cf98d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupMul_fa781b() {
+  uint3 res = simd_product(uint3(1u));
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fa781b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl
index 59c2e0e..8c2cdb1 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupMul_fa781b() -> vec3<u32> {
-  var res : vec3<u32> = subgroupMul(vec3<u32>(1u));
+using namespace metal;
+uint3 subgroupMul_fa781b() {
+  uint3 res = simd_product(uint3(1u));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_fa781b();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupMul_fa781b());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl
new file mode 100644
index 0000000..97d7888
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.msl
@@ -0,0 +1,16 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupMul_fab258() {
+  int4 res = simd_product(int4(1));
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fab258();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl
index 14338ac..6c5ce03 100644
--- a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl
@@ -1,16 +1,13 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupMul_fab258() -> vec4<i32> {
-  var res : vec4<i32> = subgroupMul(vec4<i32>(1i));
+using namespace metal;
+int4 subgroupMul_fab258() {
+  int4 res = simd_product(int4(1));
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_fab258();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_fab258();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4271282
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupAdd_0dd12a() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_0dd12a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl
index 63f8572..c19133d 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupAdd_0dd12a() -> vec3<f16> {
-  var arg_0 = vec3<f16>(1.0h);
-  var res : vec3<f16> = subgroupAdd(arg_0);
+using namespace metal;
+half3 subgroupAdd_0dd12a() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_0dd12a();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupAdd_0dd12a());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl
new file mode 100644
index 0000000..11e0e47
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupAdd_1280c8() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1280c8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl
index eb7fe05..6915b3b 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupAdd_1280c8() -> vec2<u32> {
-  var arg_0 = vec2<u32>(1u);
-  var res : vec2<u32> = subgroupAdd(arg_0);
+using namespace metal;
+uint2 subgroupAdd_1280c8() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_1280c8();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_1280c8();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl
new file mode 100644
index 0000000..98f4590
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupAdd_1eb429() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_1eb429();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl
index 89fc8e0..cc6410d 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupAdd_1eb429() -> vec2<i32> {
-  var arg_0 = vec2<i32>(1i);
-  var res : vec2<i32> = subgroupAdd(arg_0);
+using namespace metal;
+int2 subgroupAdd_1eb429() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_1eb429();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_1eb429();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d99ff30
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupAdd_225207() {
+  half arg_0 = 1.0h;
+  half res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_225207();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl
index e32e38c..11ab8e7 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupAdd_225207() -> f16 {
-  var arg_0 = 1.0h;
-  var res : f16 = subgroupAdd(arg_0);
+using namespace metal;
+half subgroupAdd_225207() {
+  half arg_0 = 1.0h;
+  half res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_225207();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_225207();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl
new file mode 100644
index 0000000..d5374c0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupAdd_22d041() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_22d041();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl
index 22c1efe..07b7e1a 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupAdd_22d041() -> vec3<i32> {
-  var arg_0 = vec3<i32>(1i);
-  var res : vec3<i32> = subgroupAdd(arg_0);
+using namespace metal;
+int3 subgroupAdd_22d041() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_22d041();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupAdd_22d041());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl
new file mode 100644
index 0000000..948e5a0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupAdd_28db2c() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_28db2c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl
index 2291caf..26d7471 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupAdd_28db2c() -> vec4<i32> {
-  var arg_0 = vec4<i32>(1i);
-  var res : vec4<i32> = subgroupAdd(arg_0);
+using namespace metal;
+int4 subgroupAdd_28db2c() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_28db2c();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_28db2c();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..fa53f0d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupAdd_2ab40a() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_2ab40a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl
index 32da36d..20a134e 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupAdd_2ab40a() -> vec4<f16> {
-  var arg_0 = vec4<f16>(1.0h);
-  var res : vec4<f16> = subgroupAdd(arg_0);
+using namespace metal;
+half4 subgroupAdd_2ab40a() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_2ab40a();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_2ab40a();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl
new file mode 100644
index 0000000..ff5d336
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupAdd_3854ae() {
+  float arg_0 = 1.0f;
+  float res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_3854ae();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl
index c514cf2..58f6aa4 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupAdd_3854ae() -> f32 {
-  var arg_0 = 1.0f;
-  var res : f32 = subgroupAdd(arg_0);
+using namespace metal;
+float subgroupAdd_3854ae() {
+  float arg_0 = 1.0f;
+  float res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_3854ae();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_3854ae();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl
new file mode 100644
index 0000000..dfbb76d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupAdd_6587ff() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_6587ff();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl
index ebe62fd..6b26b1a 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupAdd_6587ff() -> vec3<u32> {
-  var arg_0 = vec3<u32>(1u);
-  var res : vec3<u32> = subgroupAdd(arg_0);
+using namespace metal;
+uint3 subgroupAdd_6587ff() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_6587ff();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupAdd_6587ff());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl
new file mode 100644
index 0000000..7355d22
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupAdd_7d1215() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_7d1215();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl
index fe19d42..8486548 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupAdd_7d1215() -> vec3<f32> {
-  var arg_0 = vec3<f32>(1.0f);
-  var res : vec3<f32> = subgroupAdd(arg_0);
+using namespace metal;
+float3 subgroupAdd_7d1215() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_7d1215();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupAdd_7d1215());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl
new file mode 100644
index 0000000..ce4100f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupAdd_8f4c15() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_8f4c15();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl
index 91d85c7..1768f35 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupAdd_8f4c15() -> vec4<f32> {
-  var arg_0 = vec4<f32>(1.0f);
-  var res : vec4<f32> = subgroupAdd(arg_0);
+using namespace metal;
+float4 subgroupAdd_8f4c15() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_8f4c15();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_8f4c15();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl
new file mode 100644
index 0000000..53e7014
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupAdd_b61df7() {
+  uint arg_0 = 1u;
+  uint res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_b61df7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl
index 8f92832..1356812 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupAdd_b61df7() -> u32 {
-  var arg_0 = 1u;
-  var res : u32 = subgroupAdd(arg_0);
+using namespace metal;
+uint subgroupAdd_b61df7() {
+  uint arg_0 = 1u;
+  uint res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_b61df7();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_b61df7();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl
new file mode 100644
index 0000000..fe287af
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupAdd_ba53f9() {
+  int arg_0 = 1;
+  int res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_ba53f9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl
index 7b5d0f8..e48dc92 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupAdd_ba53f9() -> i32 {
-  var arg_0 = 1i;
-  var res : i32 = subgroupAdd(arg_0);
+using namespace metal;
+int subgroupAdd_ba53f9() {
+  int arg_0 = 1;
+  int res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_ba53f9();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_ba53f9();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl
new file mode 100644
index 0000000..499801a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupAdd_cae1ed() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_cae1ed();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl
index db4dc6f..b8b1819 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupAdd_cae1ed() -> vec2<f16> {
-  var arg_0 = vec2<f16>(1.0h);
-  var res : vec2<f16> = subgroupAdd(arg_0);
+using namespace metal;
+half2 subgroupAdd_cae1ed() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_cae1ed();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_cae1ed();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..93e7f0f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupAdd_dcf73f() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_dcf73f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl
index 74a2d5a..c1ed02d 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupAdd_dcf73f() -> vec2<f32> {
-  var arg_0 = vec2<f32>(1.0f);
-  var res : vec2<f32> = subgroupAdd(arg_0);
+using namespace metal;
+float2 subgroupAdd_dcf73f() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_dcf73f();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_dcf73f();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl
new file mode 100644
index 0000000..38f63a3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupAdd_fbc357() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupAdd_fbc357();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl
index f2915ee..aca031a 100644
--- a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupAdd_fbc357() -> vec4<u32> {
-  var arg_0 = vec4<u32>(1u);
-  var res : vec4<u32> = subgroupAdd(arg_0);
+using namespace metal;
+uint4 subgroupAdd_fbc357() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupAdd_fbc357();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupAdd_fbc357();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
new file mode 100644
index 0000000..05f536f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupExclusiveAdd_01de08() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_01de08();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl
index 8465ca0..86be0f4 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupExclusiveAdd_01de08() -> vec2<f16> {
-  var arg_0 = vec2<f16>(1.0h);
-  var res : vec2<f16> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+half2 subgroupExclusiveAdd_01de08() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_01de08();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_01de08();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0b59b35
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupExclusiveAdd_0ff95a() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_0ff95a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
index a3d2cc1..c85dc97 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupExclusiveAdd_0ff95a() -> vec3<u32> {
-  var arg_0 = vec3<u32>(1u);
-  var res : vec3<u32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+uint3 subgroupExclusiveAdd_0ff95a() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_0ff95a();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupExclusiveAdd_0ff95a());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..77a2827
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupExclusiveAdd_406ab4() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_406ab4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
index 3abc1a2..032e643 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupExclusiveAdd_406ab4() -> vec4<i32> {
-  var arg_0 = vec4<i32>(1i);
-  var res : vec4<i32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+int4 subgroupExclusiveAdd_406ab4() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_406ab4();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_406ab4();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
new file mode 100644
index 0000000..46931b4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupExclusiveAdd_41cfde() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_41cfde();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
index be32974..b697f31 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupExclusiveAdd_41cfde() -> vec3<f32> {
-  var arg_0 = vec3<f32>(1.0f);
-  var res : vec3<f32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+float3 subgroupExclusiveAdd_41cfde() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_41cfde();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupExclusiveAdd_41cfde());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0cbeb50
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupExclusiveAdd_42684c() {
+  uint arg_0 = 1u;
+  uint res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_42684c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl
index 3fe11de..bd1ad5a 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupExclusiveAdd_42684c() -> u32 {
-  var arg_0 = 1u;
-  var res : u32 = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+uint subgroupExclusiveAdd_42684c() {
+  uint arg_0 = 1u;
+  uint res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_42684c();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_42684c();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
new file mode 100644
index 0000000..29d8438
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupExclusiveAdd_48acea() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_48acea();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl
index 26eab9d..3772a5a 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupExclusiveAdd_48acea() -> vec2<u32> {
-  var arg_0 = vec2<u32>(1u);
-  var res : vec2<u32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+uint2 subgroupExclusiveAdd_48acea() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_48acea();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_48acea();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
new file mode 100644
index 0000000..85ce507
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupExclusiveAdd_4a1568() {
+  half arg_0 = 1.0h;
+  half res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4a1568();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
index bd94553..89321dd 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupExclusiveAdd_4a1568() -> f16 {
-  var arg_0 = 1.0h;
-  var res : f16 = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+half subgroupExclusiveAdd_4a1568() {
+  half arg_0 = 1.0h;
+  half res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_4a1568();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_4a1568();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
new file mode 100644
index 0000000..ffcc35f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupExclusiveAdd_4c8024() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_4c8024();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
index f2f27f8..32a5e72 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupExclusiveAdd_4c8024() -> vec2<f32> {
-  var arg_0 = vec2<f32>(1.0f);
-  var res : vec2<f32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+float2 subgroupExclusiveAdd_4c8024() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_4c8024();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_4c8024();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b1ed3c5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupExclusiveAdd_71ad0f() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_71ad0f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
index 3b41db4..0942052 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupExclusiveAdd_71ad0f() -> vec4<f32> {
-  var arg_0 = vec4<f32>(1.0f);
-  var res : vec4<f32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+float4 subgroupExclusiveAdd_71ad0f() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_71ad0f();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_71ad0f();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0bff85d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupExclusiveAdd_95e984() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_95e984();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl
index 03f0913..0b63839 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupExclusiveAdd_95e984() -> vec4<f16> {
-  var arg_0 = vec4<f16>(1.0h);
-  var res : vec4<f16> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+half4 subgroupExclusiveAdd_95e984() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_95e984();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_95e984();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8d70f30
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupExclusiveAdd_967e38() {
+  float arg_0 = 1.0f;
+  float res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_967e38();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl
index f1eaf40..42bf9bd 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupExclusiveAdd_967e38() -> f32 {
-  var arg_0 = 1.0f;
-  var res : f32 = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+float subgroupExclusiveAdd_967e38() {
+  float arg_0 = 1.0f;
+  float res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_967e38();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_967e38();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4915122
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupExclusiveAdd_b0c261() {
+  int arg_0 = 1;
+  int res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_b0c261();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
index 5abe3d9..ea8f2e8 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupExclusiveAdd_b0c261() -> i32 {
-  var arg_0 = 1i;
-  var res : i32 = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+int subgroupExclusiveAdd_b0c261() {
+  int arg_0 = 1;
+  int res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_b0c261();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_b0c261();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
new file mode 100644
index 0000000..dea6388
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupExclusiveAdd_c08160() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_c08160();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl
index be2ef8a..746a170 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupExclusiveAdd_c08160() -> vec3<i32> {
-  var arg_0 = vec3<i32>(1i);
-  var res : vec3<i32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+int3 subgroupExclusiveAdd_c08160() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_c08160();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupExclusiveAdd_c08160());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
new file mode 100644
index 0000000..13dd3e9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupExclusiveAdd_e58e23() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_e58e23();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
index 7ab69fc..ebd4323 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupExclusiveAdd_e58e23() -> vec3<f16> {
-  var arg_0 = vec3<f16>(1.0h);
-  var res : vec3<f16> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+half3 subgroupExclusiveAdd_e58e23() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_e58e23();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupExclusiveAdd_e58e23());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
new file mode 100644
index 0000000..01f2777
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupExclusiveAdd_ec300f() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_ec300f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
index 3566b44..d37e368 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupExclusiveAdd_ec300f() -> vec4<u32> {
-  var arg_0 = vec4<u32>(1u);
-  var res : vec4<u32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+uint4 subgroupExclusiveAdd_ec300f() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_ec300f();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_ec300f();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
new file mode 100644
index 0000000..2eeecda
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupExclusiveAdd_f0f712() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_prefix_exclusive_sum(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveAdd_f0f712();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
index c09fb2e..e87bd27 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupExclusiveAdd_f0f712() -> vec2<i32> {
-  var arg_0 = vec2<i32>(1i);
-  var res : vec2<i32> = subgroupExclusiveAdd(arg_0);
+using namespace metal;
+int2 subgroupExclusiveAdd_f0f712() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_prefix_exclusive_sum(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveAdd_f0f712();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveAdd_f0f712();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3c3fe00
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupExclusiveMul_000b92() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_000b92();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl
index 61bfb7f..1db342d 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupExclusiveMul_000b92() -> vec4<u32> {
-  var arg_0 = vec4<u32>(1u);
-  var res : vec4<u32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+uint4 subgroupExclusiveMul_000b92() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_000b92();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_000b92();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
new file mode 100644
index 0000000..6230845
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupExclusiveMul_019660() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_019660();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl
index f5b82ff..c911c79 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupExclusiveMul_019660() -> vec4<i32> {
-  var arg_0 = vec4<i32>(1i);
-  var res : vec4<i32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+int4 subgroupExclusiveMul_019660() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_019660();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_019660();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
new file mode 100644
index 0000000..c98ef0f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupExclusiveMul_0a04d5() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_0a04d5();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
index 312b6ac..539052a 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupExclusiveMul_0a04d5() -> vec3<f32> {
-  var arg_0 = vec3<f32>(1.0f);
-  var res : vec3<f32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+float3 subgroupExclusiveMul_0a04d5() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_0a04d5();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupExclusiveMul_0a04d5());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
new file mode 100644
index 0000000..78cb3c0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupExclusiveMul_13ba26() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_13ba26();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl
index 8e249c8..1401aaf 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupExclusiveMul_13ba26() -> vec3<f16> {
-  var arg_0 = vec3<f16>(1.0h);
-  var res : vec3<f16> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+half3 subgroupExclusiveMul_13ba26() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_13ba26();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupExclusiveMul_13ba26());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
new file mode 100644
index 0000000..05ddc75
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupExclusiveMul_25d1b9() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_25d1b9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
index 9de1725..b8cf980 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupExclusiveMul_25d1b9() -> vec2<f32> {
-  var arg_0 = vec2<f32>(1.0f);
-  var res : vec2<f32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+float2 subgroupExclusiveMul_25d1b9() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_25d1b9();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_25d1b9();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..5fcc501
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupExclusiveMul_4525a3() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_4525a3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl
index ddf8812..5f94ca8 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupExclusiveMul_4525a3() -> vec2<i32> {
-  var arg_0 = vec2<i32>(1i);
-  var res : vec2<i32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+int2 subgroupExclusiveMul_4525a3() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_4525a3();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_4525a3();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b592cca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupExclusiveMul_6f431e() {
+  half arg_0 = 1.0h;
+  half res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_6f431e();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl
index c968d5c..c5976ee 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupExclusiveMul_6f431e() -> f16 {
-  var arg_0 = 1.0h;
-  var res : f16 = subgroupExclusiveMul(arg_0);
+using namespace metal;
+half subgroupExclusiveMul_6f431e() {
+  half arg_0 = 1.0h;
+  half res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_6f431e();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_6f431e();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
new file mode 100644
index 0000000..a632666
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupExclusiveMul_7b5f57() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_7b5f57();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
index 411d1eb..f63c922 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupExclusiveMul_7b5f57() -> vec4<f32> {
-  var arg_0 = vec4<f32>(1.0f);
-  var res : vec4<f32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+float4 subgroupExclusiveMul_7b5f57() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_7b5f57();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_7b5f57();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8496c29
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupExclusiveMul_87f23e() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_87f23e();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl
index 2625eeb..e4e28e8 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupExclusiveMul_87f23e() -> vec3<i32> {
-  var arg_0 = vec3<i32>(1i);
-  var res : vec3<i32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+int3 subgroupExclusiveMul_87f23e() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_87f23e();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupExclusiveMul_87f23e());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..087c46b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupExclusiveMul_98b2e4() {
+  float arg_0 = 1.0f;
+  float res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_98b2e4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
index 6f57f57..55d7311 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupExclusiveMul_98b2e4() -> f32 {
-  var arg_0 = 1.0f;
-  var res : f32 = subgroupExclusiveMul(arg_0);
+using namespace metal;
+float subgroupExclusiveMul_98b2e4() {
+  float arg_0 = 1.0f;
+  float res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_98b2e4();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_98b2e4();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4e9fb2c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupExclusiveMul_a07956() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a07956();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl
index e854a59..34bf43a 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupExclusiveMul_a07956() -> vec4<f16> {
-  var arg_0 = vec4<f16>(1.0h);
-  var res : vec4<f16> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+half4 subgroupExclusiveMul_a07956() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_a07956();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_a07956();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3fa153e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupExclusiveMul_a23002() {
+  int arg_0 = 1;
+  int res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_a23002();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl
index f426a9f..d6465b4 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupExclusiveMul_a23002() -> i32 {
-  var arg_0 = 1i;
-  var res : i32 = subgroupExclusiveMul(arg_0);
+using namespace metal;
+int subgroupExclusiveMul_a23002() {
+  int arg_0 = 1;
+  int res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_a23002();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_a23002();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
new file mode 100644
index 0000000..b4ac97a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupExclusiveMul_d1d490() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_d1d490();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl
index 6910712..a7eddac 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupExclusiveMul_d1d490() -> vec2<u32> {
-  var arg_0 = vec2<u32>(1u);
-  var res : vec2<u32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+uint2 subgroupExclusiveMul_d1d490() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_d1d490();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_d1d490();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0135dc7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupExclusiveMul_dc51f8() {
+  uint arg_0 = 1u;
+  uint res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_dc51f8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
index 2b41b7d..9c7cf4a 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupExclusiveMul_dc51f8() -> u32 {
-  var arg_0 = 1u;
-  var res : u32 = subgroupExclusiveMul(arg_0);
+using namespace metal;
+uint subgroupExclusiveMul_dc51f8() {
+  uint arg_0 = 1u;
+  uint res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_dc51f8();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_dc51f8();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
new file mode 100644
index 0000000..cd8132d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupExclusiveMul_e88d1c() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_e88d1c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
index 3e97a2f..aaf8c53 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupExclusiveMul_e88d1c() -> vec2<f16> {
-  var arg_0 = vec2<f16>(1.0h);
-  var res : vec2<f16> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+half2 subgroupExclusiveMul_e88d1c() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_e88d1c();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupExclusiveMul_e88d1c();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
new file mode 100644
index 0000000..79899c0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupExclusiveMul_f039f4() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_prefix_exclusive_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupExclusiveMul_f039f4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl
index fff2956..f3babf1 100644
--- a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupExclusiveMul_f039f4() -> vec3<u32> {
-  var arg_0 = vec3<u32>(1u);
-  var res : vec3<u32> = subgroupExclusiveMul(arg_0);
+using namespace metal;
+uint3 subgroupExclusiveMul_f039f4() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_prefix_exclusive_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupExclusiveMul_f039f4();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupExclusiveMul_f039f4());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e227c90
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float* prevent_dce;
+};
+
+float subgroupMul_0de9d3() {
+  float arg_0 = 1.0f;
+  float res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_0de9d3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl
index 9f88e9f..8501f0e 100644
--- a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
-
-fn subgroupMul_0de9d3() -> f32 {
-  var arg_0 = 1.0f;
-  var res : f32 = subgroupMul(arg_0);
+using namespace metal;
+float subgroupMul_0de9d3() {
+  float arg_0 = 1.0f;
+  float res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_0de9d3();
+kernel void compute_main(device float* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_0de9d3();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl
new file mode 100644
index 0000000..982234f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half* prevent_dce;
+};
+
+half subgroupMul_2941a2() {
+  half arg_0 = 1.0h;
+  half res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_2941a2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl
index d552977..a463e18 100644
--- a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
-
-fn subgroupMul_2941a2() -> f16 {
-  var arg_0 = 1.0h;
-  var res : f16 = subgroupMul(arg_0);
+using namespace metal;
+half subgroupMul_2941a2() {
+  half arg_0 = 1.0h;
+  half res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_2941a2();
+kernel void compute_main(device half* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_2941a2();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl
new file mode 100644
index 0000000..099a54d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int* prevent_dce;
+};
+
+int subgroupMul_3fe886() {
+  int arg_0 = 1;
+  int res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_3fe886();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl
index 65b222f..8b9fdbd 100644
--- a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
-
-fn subgroupMul_3fe886() -> i32 {
-  var arg_0 = 1i;
-  var res : i32 = subgroupMul(arg_0);
+using namespace metal;
+int subgroupMul_3fe886() {
+  int arg_0 = 1;
+  int res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_3fe886();
+kernel void compute_main(device int* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_3fe886();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl
new file mode 100644
index 0000000..82a0d89
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint* prevent_dce;
+};
+
+uint subgroupMul_4f8ee6() {
+  uint arg_0 = 1u;
+  uint res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_4f8ee6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl
index b5fbc62..b8bc942 100644
--- a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
-
-fn subgroupMul_4f8ee6() -> u32 {
-  var arg_0 = 1u;
-  var res : u32 = subgroupMul(arg_0);
+using namespace metal;
+uint subgroupMul_4f8ee6() {
+  uint arg_0 = 1u;
+  uint res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_4f8ee6();
+kernel void compute_main(device uint* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_4f8ee6();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl
new file mode 100644
index 0000000..8ff7385
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half3* prevent_dce;
+};
+
+half3 subgroupMul_53aee2() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_53aee2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl
index e557cd2..5c87dac 100644
--- a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
-
-fn subgroupMul_53aee2() -> vec3<f16> {
-  var arg_0 = vec3<f16>(1.0h);
-  var res : vec3<f16> = subgroupMul(arg_0);
+using namespace metal;
+half3 subgroupMul_53aee2() {
+  half3 arg_0 = half3(1.0h);
+  half3 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_53aee2();
+kernel void compute_main(device packed_half3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_half3(subgroupMul_53aee2());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl
new file mode 100644
index 0000000..fcc76de
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int3* prevent_dce;
+};
+
+int3 subgroupMul_5a8c86() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_5a8c86();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl
index bbbeffa..17ac335 100644
--- a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
-
-fn subgroupMul_5a8c86() -> vec3<i32> {
-  var arg_0 = vec3<i32>(1i);
-  var res : vec3<i32> = subgroupMul(arg_0);
+using namespace metal;
+int3 subgroupMul_5a8c86() {
+  int3 arg_0 = int3(1);
+  int3 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_5a8c86();
+kernel void compute_main(device packed_int3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_int3(subgroupMul_5a8c86());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9a889e7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float4* prevent_dce;
+};
+
+float4 subgroupMul_66c813() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_66c813();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl
index a8affac..bd40f0a 100644
--- a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
-
-fn subgroupMul_66c813() -> vec4<f32> {
-  var arg_0 = vec4<f32>(1.0f);
-  var res : vec4<f32> = subgroupMul(arg_0);
+using namespace metal;
+float4 subgroupMul_66c813() {
+  float4 arg_0 = float4(1.0f);
+  float4 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_66c813();
+kernel void compute_main(device float4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_66c813();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl
new file mode 100644
index 0000000..2a7ce99
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half2* prevent_dce;
+};
+
+half2 subgroupMul_6aaaf3() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_6aaaf3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl
index 29fa3bd..a6f905d 100644
--- a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
-
-fn subgroupMul_6aaaf3() -> vec2<f16> {
-  var arg_0 = vec2<f16>(1.0h);
-  var res : vec2<f16> = subgroupMul(arg_0);
+using namespace metal;
+half2 subgroupMul_6aaaf3() {
+  half2 arg_0 = half2(1.0h);
+  half2 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_6aaaf3();
+kernel void compute_main(device half2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_6aaaf3();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl
new file mode 100644
index 0000000..e706376
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float3* prevent_dce;
+};
+
+float3 subgroupMul_93eccd() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_93eccd();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl
index 3d6217f..1e0903a 100644
--- a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
-
-fn subgroupMul_93eccd() -> vec3<f32> {
-  var arg_0 = vec3<f32>(1.0f);
-  var res : vec3<f32> = subgroupMul(arg_0);
+using namespace metal;
+float3 subgroupMul_93eccd() {
+  float3 arg_0 = float3(1.0f);
+  float3 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_93eccd();
+kernel void compute_main(device packed_float3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_float3(subgroupMul_93eccd());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl
new file mode 100644
index 0000000..3352874
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int2* prevent_dce;
+};
+
+int2 subgroupMul_d584a2() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_d584a2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl
index dcc93b4..f5be4f1 100644
--- a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
-
-fn subgroupMul_d584a2() -> vec2<i32> {
-  var arg_0 = vec2<i32>(1i);
-  var res : vec2<i32> = subgroupMul(arg_0);
+using namespace metal;
+int2 subgroupMul_d584a2() {
+  int2 arg_0 = int2(1);
+  int2 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_d584a2();
+kernel void compute_main(device int2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_d584a2();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl
new file mode 100644
index 0000000..800252f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint2* prevent_dce;
+};
+
+uint2 subgroupMul_dc672a() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dc672a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl
index abd0f5d..b9ac834 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
-
-fn subgroupMul_dc672a() -> vec2<u32> {
-  var arg_0 = vec2<u32>(1u);
-  var res : vec2<u32> = subgroupMul(arg_0);
+using namespace metal;
+uint2 subgroupMul_dc672a() {
+  uint2 arg_0 = uint2(1u);
+  uint2 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_dc672a();
+kernel void compute_main(device uint2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_dc672a();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl
new file mode 100644
index 0000000..9c06632
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint4* prevent_dce;
+};
+
+uint4 subgroupMul_dd1333() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_dd1333();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl
index f716ad0..fde0c5d 100644
--- a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-fn subgroupMul_dd1333() -> vec4<u32> {
-  var arg_0 = vec4<u32>(1u);
-  var res : vec4<u32> = subgroupMul(arg_0);
+using namespace metal;
+uint4 subgroupMul_dd1333() {
+  uint4 arg_0 = uint4(1u);
+  uint4 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_dd1333();
+kernel void compute_main(device uint4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_dd1333();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl
new file mode 100644
index 0000000..0112b17
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device half4* prevent_dce;
+};
+
+half4 subgroupMul_f2ac5b() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device half4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f2ac5b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl
index ea66a94..f273994 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl
@@ -1,19 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-enable f16;
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
-
-fn subgroupMul_f2ac5b() -> vec4<f16> {
-  var arg_0 = vec4<f16>(1.0h);
-  var res : vec4<f16> = subgroupMul(arg_0);
+using namespace metal;
+half4 subgroupMul_f2ac5b() {
+  half4 arg_0 = half4(1.0h);
+  half4 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_f2ac5b();
+kernel void compute_main(device half4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_f2ac5b();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl
new file mode 100644
index 0000000..4e2b704
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device float2* prevent_dce;
+};
+
+float2 subgroupMul_f78398() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device float2* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_f78398();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl
index 6e8b845..dbf9684 100644
--- a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
-
-fn subgroupMul_f78398() -> vec2<f32> {
-  var arg_0 = vec2<f32>(1.0f);
-  var res : vec2<f32> = subgroupMul(arg_0);
+using namespace metal;
+float2 subgroupMul_f78398() {
+  float2 arg_0 = float2(1.0f);
+  float2 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_f78398();
+kernel void compute_main(device float2* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_f78398();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl
new file mode 100644
index 0000000..a403e72
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device uint3* prevent_dce;
+};
+
+uint3 subgroupMul_fa781b() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device uint3* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fa781b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl
index bf91419..51efecd 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
-
-fn subgroupMul_fa781b() -> vec3<u32> {
-  var arg_0 = vec3<u32>(1u);
-  var res : vec3<u32> = subgroupMul(arg_0);
+using namespace metal;
+uint3 subgroupMul_fa781b() {
+  uint3 arg_0 = uint3(1u);
+  uint3 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_fa781b();
+kernel void compute_main(device packed_uint3* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = packed_uint3(subgroupMul_fa781b());
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl
new file mode 100644
index 0000000..a26d662
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.msl
@@ -0,0 +1,17 @@
+#include <metal_stdlib>
+using namespace metal;
+
+struct tint_module_vars_struct {
+  device int4* prevent_dce;
+};
+
+int4 subgroupMul_fab258() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_product(arg_0);
+  return res;
+}
+
+kernel void compute_main(device int4* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = subgroupMul_fab258();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl
index aefb640..f2e212f 100644
--- a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl
@@ -1,17 +1,14 @@
-SKIP: FAILED
+#include <metal_stdlib>
 
-
-@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
-
-fn subgroupMul_fab258() -> vec4<i32> {
-  var arg_0 = vec4<i32>(1i);
-  var res : vec4<i32> = subgroupMul(arg_0);
+using namespace metal;
+int4 subgroupMul_fab258() {
+  int4 arg_0 = int4(1);
+  int4 res = simd_product(arg_0);
   return res;
 }
 
-@compute @workgroup_size(1)
-fn compute_main() {
-  prevent_dce = subgroupMul_fab258();
+kernel void compute_main(device int4* tint_symbol [[buffer(0)]]) {
+  *(tint_symbol) = subgroupMul_fab258();
+  return;
 }
 
-Failed to generate: error: Unknown import method: subgroupMul