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

Add first set of arithmetic subgroup intrinsics and implement in the
SPIR-V IR backend using the following mapping:

+----------------------+--------------------------+-----------------+
|       Built-in       |    SPIR-V Instruction    | Group Operation |
+----------------------+--------------------------+-----------------+
| subgroupAdd          | OpGroupNonUniform[IF]Add | Reduce          |
| subgroupExclusiveAdd | OpGroupNonUniform[IF]Add | ExclusiveScan   |
| subgroupMul          | OpGroupNonUniform[IF]Mul | Reduce          |
| subgroupExclusiveMul | OpGroupNonUniform[IF]Mul | ExclusiveScan   |
+----------------------+--------------------------+-----------------+

Implementation in other backends will follow.

Bug: 354738715
Change-Id: I35db4731f73efa200ba3c6e0b5983943dfe77bf0
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/200918
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Natalie Chouinard <chouinard@google.com>
diff --git a/src/tint/cmd/fuzz/wgsl/dictionary.txt b/src/tint/cmd/fuzz/wgsl/dictionary.txt
index 6bf6c6f..1e9c846 100644
--- a/src/tint/cmd/fuzz/wgsl/dictionary.txt
+++ b/src/tint/cmd/fuzz/wgsl/dictionary.txt
@@ -367,8 +367,12 @@
 "storage"
 "storageBarrier"
 "struct"
+"subgroupAdd"
 "subgroupBallot"
 "subgroupBroadcast"
+"subgroupExclusiveAdd"
+"subgroupExclusiveMul"
+"subgroupMul"
 "subgroup_invocation_id"
 "subgroup_size"
 "subgroups"
diff --git a/src/tint/lang/core/builtin_fn.cc b/src/tint/lang/core/builtin_fn.cc
index 36b542f..eae42ab 100644
--- a/src/tint/lang/core/builtin_fn.cc
+++ b/src/tint/lang/core/builtin_fn.cc
@@ -405,6 +405,18 @@
     if (name == "subgroupBroadcast") {
         return BuiltinFn::kSubgroupBroadcast;
     }
+    if (name == "subgroupAdd") {
+        return BuiltinFn::kSubgroupAdd;
+    }
+    if (name == "subgroupExclusiveAdd") {
+        return BuiltinFn::kSubgroupExclusiveAdd;
+    }
+    if (name == "subgroupMul") {
+        return BuiltinFn::kSubgroupMul;
+    }
+    if (name == "subgroupExclusiveMul") {
+        return BuiltinFn::kSubgroupExclusiveMul;
+    }
     return BuiltinFn::kNone;
 }
 
@@ -656,6 +668,14 @@
             return "subgroupBallot";
         case BuiltinFn::kSubgroupBroadcast:
             return "subgroupBroadcast";
+        case BuiltinFn::kSubgroupAdd:
+            return "subgroupAdd";
+        case BuiltinFn::kSubgroupExclusiveAdd:
+            return "subgroupExclusiveAdd";
+        case BuiltinFn::kSubgroupMul:
+            return "subgroupMul";
+        case BuiltinFn::kSubgroupExclusiveMul:
+            return "subgroupExclusiveMul";
     }
     return "<unknown>";
 }
diff --git a/src/tint/lang/core/builtin_fn.h b/src/tint/lang/core/builtin_fn.h
index 5c6cf01..02e6396 100644
--- a/src/tint/lang/core/builtin_fn.h
+++ b/src/tint/lang/core/builtin_fn.h
@@ -169,6 +169,10 @@
     kAtomicCompareExchangeWeak,
     kSubgroupBallot,
     kSubgroupBroadcast,
+    kSubgroupAdd,
+    kSubgroupExclusiveAdd,
+    kSubgroupMul,
+    kSubgroupExclusiveMul,
     kNone,
 };
 
@@ -313,6 +317,10 @@
     BuiltinFn::kAtomicCompareExchangeWeak,
     BuiltinFn::kSubgroupBallot,
     BuiltinFn::kSubgroupBroadcast,
+    BuiltinFn::kSubgroupAdd,
+    BuiltinFn::kSubgroupExclusiveAdd,
+    BuiltinFn::kSubgroupMul,
+    BuiltinFn::kSubgroupExclusiveMul,
 };
 
 /// All builtin function names
@@ -439,6 +447,10 @@
     "atomicCompareExchangeWeak",
     "subgroupBallot",
     "subgroupBroadcast",
+    "subgroupAdd",
+    "subgroupExclusiveAdd",
+    "subgroupMul",
+    "subgroupExclusiveMul",
 };
 
 /// Determines if the given `f` is a coarse derivative.
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index 615b953..dcde884 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -702,6 +702,14 @@
 @must_use @stage("compute") fn subgroupBallot(bool) -> vec4<u32>
 @must_use @stage("compute") fn subgroupBroadcast[T: fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T
 @must_use @stage("compute") fn subgroupBroadcast[N: num, T: fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
+@must_use @stage("compute") fn subgroupAdd[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupAdd[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("compute") fn subgroupExclusiveAdd[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupExclusiveAdd[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("compute") fn subgroupMul[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("compute") fn subgroupExclusiveMul[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupExclusiveMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value constructors                                                         //
diff --git a/src/tint/lang/core/intrinsic/data.cc b/src/tint/lang/core/intrinsic/data.cc
index cd60be5..52eff9c 100644
--- a/src/tint/lang/core/intrinsic/data.cc
+++ b/src/tint/lang/core/intrinsic/data.cc
@@ -8865,6 +8865,28 @@
   },
   {
     /* [407] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(350),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [408] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(25),
+    /* parameters */ ParameterIndex(352),
+    /* return_matcher_indices */ MatcherIndicesIndex(38),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [409] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -8875,7 +8897,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
-    /* [408] */
+    /* [410] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -8886,7 +8908,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
-    /* [409] */
+    /* [411] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -8897,40 +8919,40 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
-    /* [410] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(42),
-    /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(44),
-    /* const_eval_fn */ ConstEvalFunctionIndex(82),
-  },
-  {
-    /* [411] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(36),
-    /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(83),
-  },
-  {
     /* [412] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
+    /* templates */ TemplateIndex(42),
+    /* parameters */ ParameterIndex(221),
+    /* return_matcher_indices */ MatcherIndicesIndex(44),
+    /* const_eval_fn */ ConstEvalFunctionIndex(82),
+  },
+  {
+    /* [413] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(36),
+    /* parameters */ ParameterIndex(1),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(83),
+  },
+  {
+    /* [414] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
     /* templates */ TemplateIndex(36),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(44),
     /* const_eval_fn */ ConstEvalFunctionIndex(83),
   },
   {
-    /* [413] */
+    /* [415] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -8941,7 +8963,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
   },
   {
-    /* [414] */
+    /* [416] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -8952,28 +8974,6 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(92),
   },
   {
-    /* [415] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(32),
-    /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(97),
-  },
-  {
-    /* [416] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(32),
-    /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(97),
-  },
-  {
     /* [417] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
@@ -8982,7 +8982,7 @@
     /* templates */ TemplateIndex(32),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(98),
+    /* const_eval_fn */ ConstEvalFunctionIndex(97),
   },
   {
     /* [418] */
@@ -8993,7 +8993,7 @@
     /* templates */ TemplateIndex(32),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(98),
+    /* const_eval_fn */ ConstEvalFunctionIndex(97),
   },
   {
     /* [419] */
@@ -9001,10 +9001,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(26),
+    /* templates */ TemplateIndex(32),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(99),
+    /* const_eval_fn */ ConstEvalFunctionIndex(98),
   },
   {
     /* [420] */
@@ -9012,10 +9012,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(26),
+    /* templates */ TemplateIndex(32),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(99),
+    /* const_eval_fn */ ConstEvalFunctionIndex(98),
   },
   {
     /* [421] */
@@ -9026,7 +9026,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [422] */
@@ -9037,7 +9037,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [423] */
@@ -9048,7 +9048,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(101),
+    /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
     /* [424] */
@@ -9059,7 +9059,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(101),
+    /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
     /* [425] */
@@ -9070,7 +9070,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(43),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [426] */
@@ -9081,7 +9081,7 @@
     /* templates */ TemplateIndex(26),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(156),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [427] */
@@ -9089,10 +9089,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(28),
-    /* parameters */ ParameterIndex(16),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(103),
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(1),
+    /* return_matcher_indices */ MatcherIndicesIndex(43),
+    /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
     /* [428] */
@@ -9100,10 +9100,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(42),
-    /* parameters */ ParameterIndex(356),
-    /* return_matcher_indices */ MatcherIndicesIndex(44),
-    /* const_eval_fn */ ConstEvalFunctionIndex(103),
+    /* templates */ TemplateIndex(26),
+    /* parameters */ ParameterIndex(221),
+    /* return_matcher_indices */ MatcherIndicesIndex(156),
+    /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
     /* [429] */
@@ -9114,7 +9114,7 @@
     /* templates */ TemplateIndex(28),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [430] */
@@ -9125,10 +9125,32 @@
     /* templates */ TemplateIndex(42),
     /* parameters */ ParameterIndex(356),
     /* return_matcher_indices */ MatcherIndicesIndex(44),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [431] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(28),
+    /* parameters */ ParameterIndex(16),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+  },
+  {
+    /* [432] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(42),
+    /* parameters */ ParameterIndex(356),
+    /* return_matcher_indices */ MatcherIndicesIndex(44),
+    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+  },
+  {
+    /* [433] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9139,7 +9161,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [432] */
+    /* [434] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9150,7 +9172,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(17),
   },
   {
-    /* [433] */
+    /* [435] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9161,7 +9183,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(19),
   },
   {
-    /* [434] */
+    /* [436] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9172,7 +9194,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(21),
   },
   {
-    /* [435] */
+    /* [437] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9183,7 +9205,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(22),
   },
   {
-    /* [436] */
+    /* [438] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9194,7 +9216,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(23),
   },
   {
-    /* [437] */
+    /* [439] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -9205,7 +9227,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(27),
   },
   {
-    /* [438] */
+    /* [440] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9216,7 +9238,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(44),
   },
   {
-    /* [439] */
+    /* [441] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9227,7 +9249,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(45),
   },
   {
-    /* [440] */
+    /* [442] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9238,7 +9260,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(46),
   },
   {
-    /* [441] */
+    /* [443] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9249,7 +9271,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(47),
   },
   {
-    /* [442] */
+    /* [444] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9260,7 +9282,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(48),
   },
   {
-    /* [443] */
+    /* [445] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9271,7 +9293,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(49),
   },
   {
-    /* [444] */
+    /* [446] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9282,7 +9304,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(50),
   },
   {
-    /* [445] */
+    /* [447] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9293,7 +9315,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(51),
   },
   {
-    /* [446] */
+    /* [448] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9304,7 +9326,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(52),
   },
   {
-    /* [447] */
+    /* [449] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9315,7 +9337,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(53),
   },
   {
-    /* [448] */
+    /* [450] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9326,7 +9348,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(57),
   },
   {
-    /* [449] */
+    /* [451] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -9337,7 +9359,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(58),
   },
   {
-    /* [450] */
+    /* [452] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -9348,7 +9370,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [451] */
+    /* [453] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9359,7 +9381,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(72),
   },
   {
-    /* [452] */
+    /* [454] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9370,7 +9392,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(74),
   },
   {
-    /* [453] */
+    /* [455] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9381,7 +9403,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(75),
   },
   {
-    /* [454] */
+    /* [456] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9392,7 +9414,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(76),
   },
   {
-    /* [455] */
+    /* [457] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9403,7 +9425,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(77),
   },
   {
-    /* [456] */
+    /* [458] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9414,7 +9436,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(78),
   },
   {
-    /* [457] */
+    /* [459] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9425,7 +9447,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(79),
   },
   {
-    /* [458] */
+    /* [460] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9436,7 +9458,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(80),
   },
   {
-    /* [459] */
+    /* [461] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9447,31 +9469,9 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [460] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(28),
-    /* parameters */ ParameterIndex(0),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [461] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(28),
-    /* parameters */ ParameterIndex(0),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
     /* [462] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
+    /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(28),
@@ -9482,6 +9482,28 @@
   {
     /* [463] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(28),
+    /* parameters */ ParameterIndex(0),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [464] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(28),
+    /* parameters */ ParameterIndex(0),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [465] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
@@ -9491,7 +9513,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [464] */
+    /* [466] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -9502,7 +9524,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [465] */
+    /* [467] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9513,7 +9535,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(95),
   },
   {
-    /* [466] */
+    /* [468] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -9568,7 +9590,7 @@
     /* [5] */
     /* fn arrayLength[T, A : access](ptr<storage, array<T>, A>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(431),
+    /* overloads */ OverloadIndex(433),
   },
   {
     /* [6] */
@@ -9658,7 +9680,7 @@
     /* [18] */
     /* fn cross[T : f32_f16](vec3<T>, vec3<T>) -> vec3<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(432),
+    /* overloads */ OverloadIndex(434),
   },
   {
     /* [19] */
@@ -9671,7 +9693,7 @@
     /* [20] */
     /* fn determinant[N : num, T : f32_f16](mat<N, N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(433),
+    /* overloads */ OverloadIndex(435),
   },
   {
     /* [21] */
@@ -9684,19 +9706,19 @@
     /* [22] */
     /* fn dot[N : num, T : fiu32_f16](vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(434),
+    /* overloads */ OverloadIndex(436),
   },
   {
     /* [23] */
     /* fn dot4I8Packed(u32, u32) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(435),
+    /* overloads */ OverloadIndex(437),
   },
   {
     /* [24] */
     /* fn dot4U8Packed(u32, u32) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(436),
+    /* overloads */ OverloadIndex(438),
   },
   {
     /* [25] */
@@ -9765,7 +9787,7 @@
     /* [34] */
     /* fn faceForward[N : num, T : f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(437),
+    /* overloads */ OverloadIndex(439),
   },
   {
     /* [35] */
@@ -9905,61 +9927,61 @@
     /* [54] */
     /* fn normalize[N : num, T : f32_f16](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(438),
+    /* overloads */ OverloadIndex(440),
   },
   {
     /* [55] */
     /* fn pack2x16float(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(439),
+    /* overloads */ OverloadIndex(441),
   },
   {
     /* [56] */
     /* fn pack2x16snorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(440),
+    /* overloads */ OverloadIndex(442),
   },
   {
     /* [57] */
     /* fn pack2x16unorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(441),
+    /* overloads */ OverloadIndex(443),
   },
   {
     /* [58] */
     /* fn pack4x8snorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(442),
+    /* overloads */ OverloadIndex(444),
   },
   {
     /* [59] */
     /* fn pack4x8unorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(443),
+    /* overloads */ OverloadIndex(445),
   },
   {
     /* [60] */
     /* fn pack4xI8(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(444),
+    /* overloads */ OverloadIndex(446),
   },
   {
     /* [61] */
     /* fn pack4xU8(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(445),
+    /* overloads */ OverloadIndex(447),
   },
   {
     /* [62] */
     /* fn pack4xI8Clamp(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(446),
+    /* overloads */ OverloadIndex(448),
   },
   {
     /* [63] */
     /* fn pack4xU8Clamp(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(447),
+    /* overloads */ OverloadIndex(449),
   },
   {
     /* [64] */
@@ -9986,13 +10008,13 @@
     /* [67] */
     /* fn reflect[N : num, T : f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(448),
+    /* overloads */ OverloadIndex(450),
   },
   {
     /* [68] */
     /* fn refract[N : num, T : f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(449),
+    /* overloads */ OverloadIndex(451),
   },
   {
     /* [69] */
@@ -10069,7 +10091,7 @@
     /* [79] */
     /* fn storageBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(450),
+    /* overloads */ OverloadIndex(452),
   },
   {
     /* [80] */
@@ -10089,7 +10111,7 @@
     /* [82] */
     /* fn transpose[M : num, N : num, T : f32_f16](mat<M, N, T>) -> mat<N, M, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(451),
+    /* overloads */ OverloadIndex(453),
   },
   {
     /* [83] */
@@ -10102,55 +10124,55 @@
     /* [84] */
     /* fn unpack2x16float(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(452),
+    /* overloads */ OverloadIndex(454),
   },
   {
     /* [85] */
     /* fn unpack2x16snorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(453),
+    /* overloads */ OverloadIndex(455),
   },
   {
     /* [86] */
     /* fn unpack2x16unorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(454),
+    /* overloads */ OverloadIndex(456),
   },
   {
     /* [87] */
     /* fn unpack4x8snorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(455),
+    /* overloads */ OverloadIndex(457),
   },
   {
     /* [88] */
     /* fn unpack4x8unorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(456),
+    /* overloads */ OverloadIndex(458),
   },
   {
     /* [89] */
     /* fn unpack4xI8(u32) -> vec4<i32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(457),
+    /* overloads */ OverloadIndex(459),
   },
   {
     /* [90] */
     /* fn unpack4xU8(u32) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(458),
+    /* overloads */ OverloadIndex(460),
   },
   {
     /* [91] */
     /* fn workgroupBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(450),
+    /* overloads */ OverloadIndex(452),
   },
   {
     /* [92] */
     /* fn textureBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(450),
+    /* overloads */ OverloadIndex(452),
   },
   {
     /* [93] */
@@ -10385,79 +10407,79 @@
     /* [108] */
     /* fn inputAttachmentLoad[T : fiu32](input_attachment: input_attachment<T>) -> vec4<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(459),
+    /* overloads */ OverloadIndex(461),
   },
   {
     /* [109] */
     /* fn atomicLoad[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(460),
+    /* overloads */ OverloadIndex(462),
   },
   {
     /* [110] */
     /* fn atomicStore[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(461),
+    /* overloads */ OverloadIndex(463),
   },
   {
     /* [111] */
     /* fn atomicAdd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [112] */
     /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [113] */
     /* fn atomicMax[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [114] */
     /* fn atomicMin[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [115] */
     /* fn atomicAnd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [116] */
     /* fn atomicOr[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [117] */
     /* fn atomicXor[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [118] */
     /* fn atomicExchange[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(462),
+    /* overloads */ OverloadIndex(464),
   },
   {
     /* [119] */
     /* fn atomicCompareExchangeWeak[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(463),
+    /* overloads */ OverloadIndex(465),
   },
   {
     /* [120] */
     /* fn subgroupBallot(bool) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(464),
+    /* overloads */ OverloadIndex(466),
   },
   {
     /* [121] */
@@ -10466,6 +10488,34 @@
     /* num overloads */ 2,
     /* overloads */ OverloadIndex(405),
   },
+  {
+    /* [122] */
+    /* fn subgroupAdd[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(407),
+  },
+  {
+    /* [123] */
+    /* fn subgroupExclusiveAdd[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupExclusiveAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(407),
+  },
+  {
+    /* [124] */
+    /* fn subgroupMul[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(407),
+  },
+  {
+    /* [125] */
+    /* fn subgroupExclusiveMul[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupExclusiveMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(407),
+  },
 };
 
 constexpr IntrinsicInfo kUnaryOperators[] = {
@@ -10474,21 +10524,21 @@
     /* op !(bool) -> bool */
     /* op ![N : num](vec<N, bool>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(407),
+    /* overloads */ OverloadIndex(409),
   },
   {
     /* [1] */
     /* op ~[T : iu32](T) -> T */
     /* op ~[T : iu32, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(409),
+    /* overloads */ OverloadIndex(411),
   },
   {
     /* [2] */
     /* op -[T : fi32_f16](T) -> T */
     /* op -[T : fi32_f16, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(411),
+    /* overloads */ OverloadIndex(413),
   },
 };
 constexpr uint8_t kUnaryOperatorNot = 0;
@@ -10553,7 +10603,7 @@
     /* op ^[T : iu32](T, T) -> T */
     /* op ^[T : iu32, N : num](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(413),
+    /* overloads */ OverloadIndex(415),
   },
   {
     /* [6] */
@@ -10577,69 +10627,69 @@
     /* [8] */
     /* op &&(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(465),
+    /* overloads */ OverloadIndex(467),
   },
   {
     /* [9] */
     /* op ||(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(466),
+    /* overloads */ OverloadIndex(468),
   },
   {
     /* [10] */
     /* op ==[T : scalar](T, T) -> bool */
     /* op ==[T : scalar, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(415),
+    /* overloads */ OverloadIndex(417),
   },
   {
     /* [11] */
     /* op !=[T : scalar](T, T) -> bool */
     /* op !=[T : scalar, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(417),
+    /* overloads */ OverloadIndex(419),
   },
   {
     /* [12] */
     /* op <[T : fiu32_f16](T, T) -> bool */
     /* op <[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(419),
+    /* overloads */ OverloadIndex(421),
   },
   {
     /* [13] */
     /* op >[T : fiu32_f16](T, T) -> bool */
     /* op >[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(421),
+    /* overloads */ OverloadIndex(423),
   },
   {
     /* [14] */
     /* op <=[T : fiu32_f16](T, T) -> bool */
     /* op <=[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(423),
+    /* overloads */ OverloadIndex(425),
   },
   {
     /* [15] */
     /* op >=[T : fiu32_f16](T, T) -> bool */
     /* op >=[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(425),
+    /* overloads */ OverloadIndex(427),
   },
   {
     /* [16] */
     /* op <<[T : iu32](T, u32) -> T */
     /* op <<[T : iu32, N : num](vec<N, T>, vec<N, u32>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(427),
+    /* overloads */ OverloadIndex(429),
   },
   {
     /* [17] */
     /* op >>[T : iu32](T, u32) -> T */
     /* op >>[T : iu32, N : num](vec<N, T>, vec<N, u32>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(429),
+    /* overloads */ OverloadIndex(431),
   },
 };
 constexpr uint8_t kBinaryOperatorPlus = 0;
diff --git a/src/tint/lang/core/ir/binary/decode.cc b/src/tint/lang/core/ir/binary/decode.cc
index 336bfdd..bc43946 100644
--- a/src/tint/lang/core/ir/binary/decode.cc
+++ b/src/tint/lang/core/ir/binary/decode.cc
@@ -1629,6 +1629,14 @@
                 return core::BuiltinFn::kSubgroupBroadcast;
             case pb::BuiltinFn::input_attachment_load:
                 return core::BuiltinFn::kInputAttachmentLoad;
+            case pb::BuiltinFn::subgroup_add:
+                return core::BuiltinFn::kSubgroupAdd;
+            case pb::BuiltinFn::subgroup_exclusive_add:
+                return core::BuiltinFn::kSubgroupExclusiveAdd;
+            case pb::BuiltinFn::subgroup_mul:
+                return core::BuiltinFn::kSubgroupMul;
+            case pb::BuiltinFn::subgroup_exclusive_mul:
+                return core::BuiltinFn::kSubgroupExclusiveMul;
 
             case pb::BuiltinFn::BuiltinFn_INT_MIN_SENTINEL_DO_NOT_USE_:
             case pb::BuiltinFn::BuiltinFn_INT_MAX_SENTINEL_DO_NOT_USE_:
diff --git a/src/tint/lang/core/ir/binary/encode.cc b/src/tint/lang/core/ir/binary/encode.cc
index b1dc1e4..e6ce605 100644
--- a/src/tint/lang/core/ir/binary/encode.cc
+++ b/src/tint/lang/core/ir/binary/encode.cc
@@ -1141,6 +1141,14 @@
                 return pb::BuiltinFn::subgroup_broadcast;
             case core::BuiltinFn::kInputAttachmentLoad:
                 return pb::BuiltinFn::input_attachment_load;
+            case core::BuiltinFn::kSubgroupAdd:
+                return pb::BuiltinFn::subgroup_add;
+            case core::BuiltinFn::kSubgroupExclusiveAdd:
+                return pb::BuiltinFn::subgroup_exclusive_add;
+            case core::BuiltinFn::kSubgroupMul:
+                return pb::BuiltinFn::subgroup_mul;
+            case core::BuiltinFn::kSubgroupExclusiveMul:
+                return pb::BuiltinFn::subgroup_exclusive_mul;
             case core::BuiltinFn::kNone:
                 break;
         }
diff --git a/src/tint/lang/spirv/writer/ast_printer/builder.cc b/src/tint/lang/spirv/writer/ast_printer/builder.cc
index 4c2c6fd..0b46db8 100644
--- a/src/tint/lang/spirv/writer/ast_printer/builder.cc
+++ b/src/tint/lang/spirv/writer/ast_printer/builder.cc
@@ -2565,6 +2565,14 @@
             }
             return result_id;
         }
+        case wgsl::BuiltinFn::kSubgroupAdd:
+        case wgsl::BuiltinFn::kSubgroupExclusiveAdd:
+        case wgsl::BuiltinFn::kSubgroupMul:
+        case wgsl::BuiltinFn::kSubgroupExclusiveMul: {
+            // TODO(crbug.com/354738715): Implement more subgroup builtins. Adding this explicit
+            // failure in the intermediary CL to avoid a new ICE that can get caught by the fuzzers.
+            return 0;
+        }
         default: {
             auto inst_id = builtin_to_glsl_method(builtin);
             if (inst_id == 0) {
diff --git a/src/tint/lang/spirv/writer/printer/printer.cc b/src/tint/lang/spirv/writer/printer/printer.cc
index ae54505..a728558 100644
--- a/src/tint/lang/spirv/writer/printer/printer.cc
+++ b/src/tint/lang/spirv/writer/printer/printer.cc
@@ -1648,6 +1648,34 @@
                     Constant(b_.ConstantValue(u32(spv::MemorySemanticsMask::UniformMemory |
                                                   spv::MemorySemanticsMask::AcquireRelease))));
                 break;
+            case core::BuiltinFn::kSubgroupAdd:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = result_ty->is_integer_scalar_or_vector() ? spv::Op::OpGroupNonUniformIAdd
+                                                              : spv::Op::OpGroupNonUniformFAdd;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::Reduce)));
+                break;
+            case core::BuiltinFn::kSubgroupExclusiveAdd:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = result_ty->is_integer_scalar_or_vector() ? spv::Op::OpGroupNonUniformIAdd
+                                                              : spv::Op::OpGroupNonUniformFAdd;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::ExclusiveScan)));
+                break;
+            case core::BuiltinFn::kSubgroupMul:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = result_ty->is_integer_scalar_or_vector() ? spv::Op::OpGroupNonUniformIMul
+                                                              : spv::Op::OpGroupNonUniformFMul;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::Reduce)));
+                break;
+            case core::BuiltinFn::kSubgroupExclusiveMul:
+                module_.PushCapability(SpvCapabilityGroupNonUniformArithmetic);
+                op = result_ty->is_integer_scalar_or_vector() ? spv::Op::OpGroupNonUniformIMul
+                                                              : spv::Op::OpGroupNonUniformFMul;
+                operands.push_back(Constant(ir_.constant_values.Get(u32(spv::Scope::Subgroup))));
+                operands.push_back(U32Operand(u32(spv::GroupOperation::ExclusiveScan)));
+                break;
             case core::BuiltinFn::kSubgroupBallot:
                 module_.PushCapability(SpvCapabilityGroupNonUniformBallot);
                 op = spv::Op::OpGroupNonUniformBallot;
diff --git a/src/tint/lang/wgsl/builtin_fn.cc b/src/tint/lang/wgsl/builtin_fn.cc
index f03fada..c331192 100644
--- a/src/tint/lang/wgsl/builtin_fn.cc
+++ b/src/tint/lang/wgsl/builtin_fn.cc
@@ -411,6 +411,18 @@
     if (name == "subgroupBroadcast") {
         return BuiltinFn::kSubgroupBroadcast;
     }
+    if (name == "subgroupAdd") {
+        return BuiltinFn::kSubgroupAdd;
+    }
+    if (name == "subgroupExclusiveAdd") {
+        return BuiltinFn::kSubgroupExclusiveAdd;
+    }
+    if (name == "subgroupMul") {
+        return BuiltinFn::kSubgroupMul;
+    }
+    if (name == "subgroupExclusiveMul") {
+        return BuiltinFn::kSubgroupExclusiveMul;
+    }
     if (name == "__tint_materialize") {
         return BuiltinFn::kTintMaterialize;
     }
@@ -669,6 +681,14 @@
             return "subgroupBallot";
         case BuiltinFn::kSubgroupBroadcast:
             return "subgroupBroadcast";
+        case BuiltinFn::kSubgroupAdd:
+            return "subgroupAdd";
+        case BuiltinFn::kSubgroupExclusiveAdd:
+            return "subgroupExclusiveAdd";
+        case BuiltinFn::kSubgroupMul:
+            return "subgroupMul";
+        case BuiltinFn::kSubgroupExclusiveMul:
+            return "subgroupExclusiveMul";
         case BuiltinFn::kTintMaterialize:
             return "__tint_materialize";
     }
diff --git a/src/tint/lang/wgsl/builtin_fn.h b/src/tint/lang/wgsl/builtin_fn.h
index 679e975..da9de21 100644
--- a/src/tint/lang/wgsl/builtin_fn.h
+++ b/src/tint/lang/wgsl/builtin_fn.h
@@ -171,6 +171,10 @@
     kAtomicCompareExchangeWeak,
     kSubgroupBallot,
     kSubgroupBroadcast,
+    kSubgroupAdd,
+    kSubgroupExclusiveAdd,
+    kSubgroupMul,
+    kSubgroupExclusiveMul,
     kTintMaterialize,
     kNone,
 };
@@ -318,6 +322,10 @@
     BuiltinFn::kAtomicCompareExchangeWeak,
     BuiltinFn::kSubgroupBallot,
     BuiltinFn::kSubgroupBroadcast,
+    BuiltinFn::kSubgroupAdd,
+    BuiltinFn::kSubgroupExclusiveAdd,
+    BuiltinFn::kSubgroupMul,
+    BuiltinFn::kSubgroupExclusiveMul,
     BuiltinFn::kTintMaterialize,
 };
 
@@ -447,6 +455,10 @@
     "atomicCompareExchangeWeak",
     "subgroupBallot",
     "subgroupBroadcast",
+    "subgroupAdd",
+    "subgroupExclusiveAdd",
+    "subgroupMul",
+    "subgroupExclusiveMul",
     "__tint_materialize",
 };
 
diff --git a/src/tint/lang/wgsl/intrinsic/data.cc b/src/tint/lang/wgsl/intrinsic/data.cc
index 3f4b09b..39121bc 100644
--- a/src/tint/lang/wgsl/intrinsic/data.cc
+++ b/src/tint/lang/wgsl/intrinsic/data.cc
@@ -10311,6 +10311,28 @@
   },
   {
     /* [483] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(86),
+    /* parameters */ ParameterIndex(323),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [484] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(85),
+    /* parameters */ ParameterIndex(325),
+    /* return_matcher_indices */ MatcherIndicesIndex(50),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [485] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10321,7 +10343,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(83),
   },
   {
-    /* [484] */
+    /* [486] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10332,37 +10354,15 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(83),
   },
   {
-    /* [485] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(99),
-    /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(84),
-  },
-  {
-    /* [486] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(99),
-    /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(56),
-    /* const_eval_fn */ ConstEvalFunctionIndex(84),
-  },
-  {
     /* [487] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(84),
+    /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(85),
+    /* const_eval_fn */ ConstEvalFunctionIndex(84),
   },
   {
     /* [488] */
@@ -10370,13 +10370,35 @@
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(221),
+    /* return_matcher_indices */ MatcherIndicesIndex(56),
+    /* const_eval_fn */ ConstEvalFunctionIndex(84),
+  },
+  {
+    /* [489] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(84),
+    /* parameters */ ParameterIndex(1),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(85),
+  },
+  {
+    /* [490] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 1,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
     /* templates */ TemplateIndex(84),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(56),
     /* const_eval_fn */ ConstEvalFunctionIndex(85),
   },
   {
-    /* [489] */
+    /* [491] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10387,7 +10409,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(94),
   },
   {
-    /* [490] */
+    /* [492] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10398,28 +10420,6 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(94),
   },
   {
-    /* [491] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 1,
-    /* templates */ TemplateIndex(82),
-    /* parameters */ ParameterIndex(1),
-    /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(99),
-  },
-  {
-    /* [492] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(82),
-    /* parameters */ ParameterIndex(221),
-    /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(99),
-  },
-  {
     /* [493] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
@@ -10428,7 +10428,7 @@
     /* templates */ TemplateIndex(82),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [494] */
@@ -10439,7 +10439,7 @@
     /* templates */ TemplateIndex(82),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(100),
+    /* const_eval_fn */ ConstEvalFunctionIndex(99),
   },
   {
     /* [495] */
@@ -10447,10 +10447,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(70),
+    /* templates */ TemplateIndex(82),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(101),
+    /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
     /* [496] */
@@ -10458,10 +10458,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(70),
+    /* templates */ TemplateIndex(82),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(101),
+    /* const_eval_fn */ ConstEvalFunctionIndex(100),
   },
   {
     /* [497] */
@@ -10472,7 +10472,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [498] */
@@ -10483,7 +10483,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(102),
+    /* const_eval_fn */ ConstEvalFunctionIndex(101),
   },
   {
     /* [499] */
@@ -10494,7 +10494,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(103),
+    /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
     /* [500] */
@@ -10505,7 +10505,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(103),
+    /* const_eval_fn */ ConstEvalFunctionIndex(102),
   },
   {
     /* [501] */
@@ -10516,7 +10516,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(1),
     /* return_matcher_indices */ MatcherIndicesIndex(55),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [502] */
@@ -10527,7 +10527,7 @@
     /* templates */ TemplateIndex(70),
     /* parameters */ ParameterIndex(221),
     /* return_matcher_indices */ MatcherIndicesIndex(113),
-    /* const_eval_fn */ ConstEvalFunctionIndex(104),
+    /* const_eval_fn */ ConstEvalFunctionIndex(103),
   },
   {
     /* [503] */
@@ -10535,10 +10535,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
-    /* templates */ TemplateIndex(99),
-    /* parameters */ ParameterIndex(16),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(105),
+    /* templates */ TemplateIndex(70),
+    /* parameters */ ParameterIndex(1),
+    /* return_matcher_indices */ MatcherIndicesIndex(55),
+    /* const_eval_fn */ ConstEvalFunctionIndex(104),
   },
   {
     /* [504] */
@@ -10546,10 +10546,10 @@
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
-    /* templates */ TemplateIndex(99),
-    /* parameters */ ParameterIndex(329),
-    /* return_matcher_indices */ MatcherIndicesIndex(56),
-    /* const_eval_fn */ ConstEvalFunctionIndex(105),
+    /* templates */ TemplateIndex(70),
+    /* parameters */ ParameterIndex(221),
+    /* return_matcher_indices */ MatcherIndicesIndex(113),
+    /* const_eval_fn */ ConstEvalFunctionIndex(104),
   },
   {
     /* [505] */
@@ -10560,7 +10560,7 @@
     /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(16),
     /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(106),
+    /* const_eval_fn */ ConstEvalFunctionIndex(105),
   },
   {
     /* [506] */
@@ -10571,10 +10571,32 @@
     /* templates */ TemplateIndex(99),
     /* parameters */ ParameterIndex(329),
     /* return_matcher_indices */ MatcherIndicesIndex(56),
-    /* const_eval_fn */ ConstEvalFunctionIndex(106),
+    /* const_eval_fn */ ConstEvalFunctionIndex(105),
   },
   {
     /* [507] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(16),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(106),
+  },
+  {
+    /* [508] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(99),
+    /* parameters */ ParameterIndex(329),
+    /* return_matcher_indices */ MatcherIndicesIndex(56),
+    /* const_eval_fn */ ConstEvalFunctionIndex(106),
+  },
+  {
+    /* [509] */
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 1,
@@ -10585,7 +10607,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
-    /* [508] */
+    /* [510] */
     /* flags */ OverloadFlags(OverloadFlag::kIsConverter, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10596,7 +10618,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(108),
   },
   {
-    /* [509] */
+    /* [511] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10607,7 +10629,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(18),
   },
   {
-    /* [510] */
+    /* [512] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10618,7 +10640,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(20),
   },
   {
-    /* [511] */
+    /* [513] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10629,7 +10651,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(22),
   },
   {
-    /* [512] */
+    /* [514] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10640,7 +10662,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(23),
   },
   {
-    /* [513] */
+    /* [515] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10651,7 +10673,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(24),
   },
   {
-    /* [514] */
+    /* [516] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -10662,7 +10684,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(28),
   },
   {
-    /* [515] */
+    /* [517] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10673,7 +10695,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(45),
   },
   {
-    /* [516] */
+    /* [518] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10684,7 +10706,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(46),
   },
   {
-    /* [517] */
+    /* [519] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10695,7 +10717,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(47),
   },
   {
-    /* [518] */
+    /* [520] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10706,7 +10728,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(48),
   },
   {
-    /* [519] */
+    /* [521] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10717,7 +10739,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(49),
   },
   {
-    /* [520] */
+    /* [522] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10728,7 +10750,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(50),
   },
   {
-    /* [521] */
+    /* [523] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10739,7 +10761,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(51),
   },
   {
-    /* [522] */
+    /* [524] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10750,7 +10772,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(52),
   },
   {
-    /* [523] */
+    /* [525] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10761,7 +10783,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(53),
   },
   {
-    /* [524] */
+    /* [526] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10772,7 +10794,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(54),
   },
   {
-    /* [525] */
+    /* [527] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -10783,7 +10805,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(58),
   },
   {
-    /* [526] */
+    /* [528] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -10794,7 +10816,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(59),
   },
   {
-    /* [527] */
+    /* [529] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -10805,7 +10827,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [528] */
+    /* [530] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10816,7 +10838,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(73),
   },
   {
-    /* [529] */
+    /* [531] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10827,7 +10849,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(75),
   },
   {
-    /* [530] */
+    /* [532] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10838,7 +10860,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(76),
   },
   {
-    /* [531] */
+    /* [533] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10849,7 +10871,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(77),
   },
   {
-    /* [532] */
+    /* [534] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10860,7 +10882,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(78),
   },
   {
-    /* [533] */
+    /* [535] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10871,7 +10893,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(79),
   },
   {
-    /* [534] */
+    /* [536] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10882,7 +10904,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(80),
   },
   {
-    /* [535] */
+    /* [537] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10893,7 +10915,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(81),
   },
   {
-    /* [536] */
+    /* [538] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10904,7 +10926,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [537] */
+    /* [539] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10915,31 +10937,9 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [538] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 1,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(0),
-    /* return_matcher_indices */ MatcherIndicesIndex(3),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
-    /* [539] */
-    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
-    /* num_explicit_templates */ 0,
-    /* num_templates   */ 2,
-    /* templates */ TemplateIndex(72),
-    /* parameters */ ParameterIndex(0),
-    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
-    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
-  },
-  {
     /* [540] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
-    /* num_parameters */ 2,
+    /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(72),
@@ -10950,6 +10950,28 @@
   {
     /* [541] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(72),
+    /* parameters */ ParameterIndex(0),
+    /* return_matcher_indices */ MatcherIndicesIndex(/* invalid */),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [542] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(72),
+    /* parameters */ ParameterIndex(0),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
+  },
+  {
+    /* [543] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
@@ -10959,7 +10981,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [542] */
+    /* [544] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10970,7 +10992,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [543] */
+    /* [545] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10981,7 +11003,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(82),
   },
   {
-    /* [544] */
+    /* [546] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -10992,7 +11014,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [545] */
+    /* [547] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
@@ -11003,7 +11025,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [546] */
+    /* [548] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -11014,7 +11036,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(97),
   },
   {
-    /* [547] */
+    /* [549] */
     /* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -11175,7 +11197,7 @@
     /* [19] */
     /* fn cross[T : fa_f32_f16](vec3<T>, vec3<T>) -> vec3<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(509),
+    /* overloads */ OverloadIndex(511),
   },
   {
     /* [20] */
@@ -11188,7 +11210,7 @@
     /* [21] */
     /* fn determinant[N : num, T : fa_f32_f16](mat<N, N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(510),
+    /* overloads */ OverloadIndex(512),
   },
   {
     /* [22] */
@@ -11201,19 +11223,19 @@
     /* [23] */
     /* fn dot[N : num, T : fia_fiu32_f16](vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(511),
+    /* overloads */ OverloadIndex(513),
   },
   {
     /* [24] */
     /* fn dot4I8Packed(u32, u32) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(512),
+    /* overloads */ OverloadIndex(514),
   },
   {
     /* [25] */
     /* fn dot4U8Packed(u32, u32) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(513),
+    /* overloads */ OverloadIndex(515),
   },
   {
     /* [26] */
@@ -11282,7 +11304,7 @@
     /* [35] */
     /* fn faceForward[N : num, T : fa_f32_f16](vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(514),
+    /* overloads */ OverloadIndex(516),
   },
   {
     /* [36] */
@@ -11422,61 +11444,61 @@
     /* [55] */
     /* fn normalize[N : num, T : fa_f32_f16](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(515),
+    /* overloads */ OverloadIndex(517),
   },
   {
     /* [56] */
     /* fn pack2x16float(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(516),
+    /* overloads */ OverloadIndex(518),
   },
   {
     /* [57] */
     /* fn pack2x16snorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(517),
+    /* overloads */ OverloadIndex(519),
   },
   {
     /* [58] */
     /* fn pack2x16unorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(518),
+    /* overloads */ OverloadIndex(520),
   },
   {
     /* [59] */
     /* fn pack4x8snorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(519),
+    /* overloads */ OverloadIndex(521),
   },
   {
     /* [60] */
     /* fn pack4x8unorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(520),
+    /* overloads */ OverloadIndex(522),
   },
   {
     /* [61] */
     /* fn pack4xI8(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(521),
+    /* overloads */ OverloadIndex(523),
   },
   {
     /* [62] */
     /* fn pack4xU8(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(522),
+    /* overloads */ OverloadIndex(524),
   },
   {
     /* [63] */
     /* fn pack4xI8Clamp(vec4<i32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(523),
+    /* overloads */ OverloadIndex(525),
   },
   {
     /* [64] */
     /* fn pack4xU8Clamp(vec4<u32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(524),
+    /* overloads */ OverloadIndex(526),
   },
   {
     /* [65] */
@@ -11503,13 +11525,13 @@
     /* [68] */
     /* fn reflect[N : num, T : fa_f32_f16](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(525),
+    /* overloads */ OverloadIndex(527),
   },
   {
     /* [69] */
     /* fn refract[N : num, T : fa_f32_f16](vec<N, T>, vec<N, T>, T) -> vec<N, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(526),
+    /* overloads */ OverloadIndex(528),
   },
   {
     /* [70] */
@@ -11586,7 +11608,7 @@
     /* [80] */
     /* fn storageBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(527),
+    /* overloads */ OverloadIndex(529),
   },
   {
     /* [81] */
@@ -11606,7 +11628,7 @@
     /* [83] */
     /* fn transpose[M : num, N : num, T : fa_f32_f16](mat<M, N, T>) -> mat<N, M, T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(528),
+    /* overloads */ OverloadIndex(530),
   },
   {
     /* [84] */
@@ -11619,61 +11641,61 @@
     /* [85] */
     /* fn unpack2x16float(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(529),
+    /* overloads */ OverloadIndex(531),
   },
   {
     /* [86] */
     /* fn unpack2x16snorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(530),
+    /* overloads */ OverloadIndex(532),
   },
   {
     /* [87] */
     /* fn unpack2x16unorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(531),
+    /* overloads */ OverloadIndex(533),
   },
   {
     /* [88] */
     /* fn unpack4x8snorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(532),
+    /* overloads */ OverloadIndex(534),
   },
   {
     /* [89] */
     /* fn unpack4x8unorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(533),
+    /* overloads */ OverloadIndex(535),
   },
   {
     /* [90] */
     /* fn unpack4xI8(u32) -> vec4<i32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(534),
+    /* overloads */ OverloadIndex(536),
   },
   {
     /* [91] */
     /* fn unpack4xU8(u32) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(535),
+    /* overloads */ OverloadIndex(537),
   },
   {
     /* [92] */
     /* fn workgroupBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(527),
+    /* overloads */ OverloadIndex(529),
   },
   {
     /* [93] */
     /* fn workgroupUniformLoad[T](ptr<workgroup, T, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(536),
+    /* overloads */ OverloadIndex(538),
   },
   {
     /* [94] */
     /* fn textureBarrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(527),
+    /* overloads */ OverloadIndex(529),
   },
   {
     /* [95] */
@@ -11925,79 +11947,79 @@
     /* [110] */
     /* fn inputAttachmentLoad[T : fiu32](input_attachment: input_attachment<T>) -> vec4<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(537),
+    /* overloads */ OverloadIndex(539),
   },
   {
     /* [111] */
     /* fn atomicLoad[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(538),
+    /* overloads */ OverloadIndex(540),
   },
   {
     /* [112] */
     /* fn atomicStore[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(539),
+    /* overloads */ OverloadIndex(541),
   },
   {
     /* [113] */
     /* fn atomicAdd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [114] */
     /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [115] */
     /* fn atomicMax[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [116] */
     /* fn atomicMin[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [117] */
     /* fn atomicAnd[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [118] */
     /* fn atomicOr[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [119] */
     /* fn atomicXor[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [120] */
     /* fn atomicExchange[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(540),
+    /* overloads */ OverloadIndex(542),
   },
   {
     /* [121] */
     /* fn atomicCompareExchangeWeak[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T, T) -> __atomic_compare_exchange_result<T> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(541),
+    /* overloads */ OverloadIndex(543),
   },
   {
     /* [122] */
     /* fn subgroupBallot(bool) -> vec4<u32> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(542),
+    /* overloads */ OverloadIndex(544),
   },
   {
     /* [123] */
@@ -12008,9 +12030,37 @@
   },
   {
     /* [124] */
+    /* fn subgroupAdd[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(483),
+  },
+  {
+    /* [125] */
+    /* fn subgroupExclusiveAdd[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupExclusiveAdd[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(483),
+  },
+  {
+    /* [126] */
+    /* fn subgroupMul[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(483),
+  },
+  {
+    /* [127] */
+    /* fn subgroupExclusiveMul[T : fiu32_f16](value: T) -> T */
+    /* fn subgroupExclusiveMul[N : num, T : fiu32_f16](value: vec<N, T>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(483),
+  },
+  {
+    /* [128] */
     /* fn __tint_materialize[T](T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(543),
+    /* overloads */ OverloadIndex(545),
   },
 };
 
@@ -12019,34 +12069,34 @@
     /* [0] */
     /* op &[S : address_space, T, A : access](ref<S, T, A>) -> ptr<S, T, A> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(544),
+    /* overloads */ OverloadIndex(546),
   },
   {
     /* [1] */
     /* op *[S : address_space, T, A : access](ptr<S, T, A>) -> ref<S, T, A> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(545),
+    /* overloads */ OverloadIndex(547),
   },
   {
     /* [2] */
     /* op !(bool) -> bool */
     /* op ![N : num](vec<N, bool>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(483),
+    /* overloads */ OverloadIndex(485),
   },
   {
     /* [3] */
     /* op ~[T : ia_iu32](T) -> T */
     /* op ~[T : ia_iu32, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(485),
+    /* overloads */ OverloadIndex(487),
   },
   {
     /* [4] */
     /* op -[T : fia_fi32_f16](T) -> T */
     /* op -[T : fia_fi32_f16, N : num](vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(487),
+    /* overloads */ OverloadIndex(489),
   },
 };
 constexpr uint8_t kUnaryOperatorAnd = 0;
@@ -12113,7 +12163,7 @@
     /* op ^[T : ia_iu32](T, T) -> T */
     /* op ^[T : ia_iu32, N : num](vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(489),
+    /* overloads */ OverloadIndex(491),
   },
   {
     /* [6] */
@@ -12137,69 +12187,69 @@
     /* [8] */
     /* op &&(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(546),
+    /* overloads */ OverloadIndex(548),
   },
   {
     /* [9] */
     /* op ||(bool, bool) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(547),
+    /* overloads */ OverloadIndex(549),
   },
   {
     /* [10] */
     /* op ==[T : scalar](T, T) -> bool */
     /* op ==[T : scalar, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(491),
+    /* overloads */ OverloadIndex(493),
   },
   {
     /* [11] */
     /* op !=[T : scalar](T, T) -> bool */
     /* op !=[T : scalar, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(493),
+    /* overloads */ OverloadIndex(495),
   },
   {
     /* [12] */
     /* op <[T : fia_fiu32_f16](T, T) -> bool */
     /* op <[T : fia_fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(495),
+    /* overloads */ OverloadIndex(497),
   },
   {
     /* [13] */
     /* op >[T : fia_fiu32_f16](T, T) -> bool */
     /* op >[T : fia_fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(497),
+    /* overloads */ OverloadIndex(499),
   },
   {
     /* [14] */
     /* op <=[T : fia_fiu32_f16](T, T) -> bool */
     /* op <=[T : fia_fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(499),
+    /* overloads */ OverloadIndex(501),
   },
   {
     /* [15] */
     /* op >=[T : fia_fiu32_f16](T, T) -> bool */
     /* op >=[T : fia_fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(501),
+    /* overloads */ OverloadIndex(503),
   },
   {
     /* [16] */
     /* op <<[T : ia_iu32](T, u32) -> T */
     /* op <<[T : ia_iu32, N : num](vec<N, T>, vec<N, u32>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(503),
+    /* overloads */ OverloadIndex(505),
   },
   {
     /* [17] */
     /* op >>[T : ia_iu32](T, u32) -> T */
     /* op >>[T : ia_iu32, N : num](vec<N, T>, vec<N, u32>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(505),
+    /* overloads */ OverloadIndex(507),
   },
 };
 constexpr uint8_t kBinaryOperatorPlus = 0;
@@ -12463,7 +12513,7 @@
     /* conv packedVec3<T : concrete_scalar>(vec3<T>) -> packedVec3<T> */
     /* conv packedVec3[T : concrete_scalar](vec3<T>) -> packedVec3<T> */
     /* num overloads */ 2,
-    /* overloads */ OverloadIndex(507),
+    /* overloads */ OverloadIndex(509),
   },
 };
 
diff --git a/src/tint/lang/wgsl/reader/lower/lower.cc b/src/tint/lang/wgsl/reader/lower/lower.cc
index 56d9fd3..223be6a 100644
--- a/src/tint/lang/wgsl/reader/lower/lower.cc
+++ b/src/tint/lang/wgsl/reader/lower/lower.cc
@@ -168,6 +168,10 @@
         CASE(kSubgroupBallot)
         CASE(kSubgroupBroadcast)
         CASE(kInputAttachmentLoad)
+        CASE(kSubgroupAdd)
+        CASE(kSubgroupExclusiveAdd)
+        CASE(kSubgroupMul)
+        CASE(kSubgroupExclusiveMul)
 
         case tint::wgsl::BuiltinFn::kBitcast:               // should lower to ir::Bitcast
         case tint::wgsl::BuiltinFn::kWorkgroupUniformLoad:  // should be handled in Lower()
diff --git a/src/tint/lang/wgsl/wgsl.def b/src/tint/lang/wgsl/wgsl.def
index 816724e..188fa03 100644
--- a/src/tint/lang/wgsl/wgsl.def
+++ b/src/tint/lang/wgsl/wgsl.def
@@ -622,6 +622,14 @@
 @must_use @stage("compute") fn subgroupBallot(bool) -> vec4<u32>
 @must_use @stage("compute") fn subgroupBroadcast[T: fiu32_f16](value: T, @const sourceLaneIndex: u32) -> T
 @must_use @stage("compute") fn subgroupBroadcast[N: num, T: fiu32_f16](value: vec<N, T>, @const sourceLaneIndex: u32) -> vec<N, T>
+@must_use @stage("compute") fn subgroupAdd[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupAdd[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("compute") fn subgroupExclusiveAdd[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupExclusiveAdd[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("compute") fn subgroupMul[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
+@must_use @stage("compute") fn subgroupExclusiveMul[T: fiu32_f16](value: T) -> T
+@must_use @stage("compute") fn subgroupExclusiveMul[N: num, T: fiu32_f16](value: vec<N, T>) -> vec<N, T>
 
 ////////////////////////////////////////////////////////////////////////////////
 // Value constructors                                                         //
diff --git a/src/tint/lang/wgsl/writer/raise/raise.cc b/src/tint/lang/wgsl/writer/raise/raise.cc
index 56e9fac..f58ddd8 100644
--- a/src/tint/lang/wgsl/writer/raise/raise.cc
+++ b/src/tint/lang/wgsl/writer/raise/raise.cc
@@ -171,6 +171,10 @@
         CASE(kAtomicCompareExchangeWeak)
         CASE(kSubgroupBallot)
         CASE(kSubgroupBroadcast)
+        CASE(kSubgroupAdd)
+        CASE(kSubgroupExclusiveAdd)
+        CASE(kSubgroupMul)
+        CASE(kSubgroupExclusiveMul)
         CASE(kInputAttachmentLoad)
         case core::BuiltinFn::kNone:
             break;
diff --git a/src/tint/utils/protos/ir/ir.proto b/src/tint/utils/protos/ir/ir.proto
index b50a5a2..5c81367 100644
--- a/src/tint/utils/protos/ir/ir.proto
+++ b/src/tint/utils/protos/ir/ir.proto
@@ -632,4 +632,8 @@
     subgroup_ballot = 119;
     subgroup_broadcast = 120;
     input_attachment_load = 121;
+    subgroup_add = 122;
+    subgroup_exclusive_add = 123;
+    subgroup_mul = 124;
+    subgroup_exclusive_mul = 125;
 }
diff --git a/test/tint/builtins/gen/gen.wgsl.tmpl b/test/tint/builtins/gen/gen.wgsl.tmpl
index bef377c..59c0e56 100644
--- a/test/tint/builtins/gen/gen.wgsl.tmpl
+++ b/test/tint/builtins/gen/gen.wgsl.tmpl
@@ -268,7 +268,7 @@
 {{-   $builtin_name := $permutation.Intrinsic.Name -}}
 
 {{- /* Emit 'enable subgroups' and 'enable subgroups_f16' if required */ -}}
-{{-   if or (eq "subgroupBallot" $builtin_name) (eq "subgroupBroadcast" $builtin_name)}}
+{{-   if or (HasPrefix $builtin_name "subgroup") }}
 enable subgroups;
 {{-     if OverloadUsesType $overload "f16"}}
 enable subgroups_f16;
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl
new file mode 100644
index 0000000..98faaa4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupAdd(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupAdd_0dd12a() -> vec3<f16>{
+  var res: vec3<f16> = subgroupAdd(vec3<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b38c420
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b38c420
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.glsl
new file mode 100644
index 0000000..3bec1d4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5560e98c4230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..59ef967
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_0dd12a "subgroupAdd_0dd12a"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_0dd12a = OpFunction %v3half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3half Function
+          %9 = OpGroupNonUniformFAdd %v3half %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3half %subgroupAdd_0dd12a
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl
new file mode 100644
index 0000000..06eaf1c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.spvasm
new file mode 100644
index 0000000..93f18a6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.wgsl
new file mode 100644
index 0000000..5bbcd98
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/0dd12a.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl
new file mode 100644
index 0000000..377d9e0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupAdd(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupAdd_1280c8() -> vec2<u32>{
+  var res: vec2<u32> = subgroupAdd(vec2<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cdd762d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cdd762d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.glsl
new file mode 100644
index 0000000..5e619c1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56119f75e230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6e09438
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_1280c8 "subgroupAdd_1280c8"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_1280c8 = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformIAdd %v2uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupAdd_1280c8
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl
new file mode 100644
index 0000000..c2da93d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.spvasm
new file mode 100644
index 0000000..db447d8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.wgsl
new file mode 100644
index 0000000..5ef4a61
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1280c8.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl
new file mode 100644
index 0000000..2ac3c2e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupAdd(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupAdd_1eb429() -> vec2<i32>{
+  var res: vec2<i32> = subgroupAdd(vec2<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..90ef829
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..90ef829
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.glsl
new file mode 100644
index 0000000..9199f28
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c8ea9d2230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..38060ad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_1eb429 "subgroupAdd_1eb429"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v2int %int_1 %int_1
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_1eb429 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformIAdd %v2int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupAdd_1eb429
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl
new file mode 100644
index 0000000..178f18b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.spvasm
new file mode 100644
index 0000000..6f159f2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.wgsl
new file mode 100644
index 0000000..da4bbf9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/1eb429.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl
new file mode 100644
index 0000000..e63a155
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupAdd(value: f16) -> f16
+fn subgroupAdd_225207() -> f16{
+  var res: f16 = subgroupAdd(1.h);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..83b5703
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupAdd_225207() -> f16 {
+  var res : f16 = subgroupAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..83b5703
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupAdd_225207() -> f16 {
+  var res : f16 = subgroupAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.glsl
new file mode 100644
index 0000000..d36c7ba
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupAdd_225207() -> f16 {
+  var res : f16 = subgroupAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ac4fb17f58
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..ab5b126
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_225207 "subgroupAdd_225207"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%_ptr_Function_half = OpTypePointer Function %half
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_225207 = OpFunction %half None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_half Function
+          %8 = OpGroupNonUniformFAdd %half %uint_3 Reduce %half_0x1p_0
+               OpStore %res %8
+         %14 = OpLoad %half %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %half %subgroupAdd_225207
+         %20 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl
new file mode 100644
index 0000000..c131b6c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupAdd_225207() -> f16 {
+  var res : f16 = subgroupAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.spvasm
new file mode 100644
index 0000000..92cd5fc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupAdd_225207() -> f16 {
+  var res : f16 = subgroupAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.wgsl
new file mode 100644
index 0000000..35771a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/225207.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupAdd_225207() -> f16 {
+  var res : f16 = subgroupAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl
new file mode 100644
index 0000000..715d216
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupAdd(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupAdd_22d041() -> vec3<i32>{
+  var res: vec3<i32> = subgroupAdd(vec3<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..24dc168
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..24dc168
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.glsl
new file mode 100644
index 0000000..400c138
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c8e21d6230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..3dd37f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_22d041 "subgroupAdd_22d041"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_22d041 = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformIAdd %v3int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupAdd_22d041
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl
new file mode 100644
index 0000000..3e6533d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.spvasm
new file mode 100644
index 0000000..88eb604aa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.wgsl
new file mode 100644
index 0000000..c5b43a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/22d041.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl
new file mode 100644
index 0000000..d124f28
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupAdd(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupAdd_28db2c() -> vec4<i32>{
+  var res: vec4<i32> = subgroupAdd(vec4<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3b41039
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3b41039
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.glsl
new file mode 100644
index 0000000..4f3b853
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown builtin method: 0x560e1b56d230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..7147074
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_28db2c "subgroupAdd_28db2c"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_28db2c = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformIAdd %v4int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupAdd_28db2c
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl
new file mode 100644
index 0000000..43b1b80
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.spvasm
new file mode 100644
index 0000000..f38164a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.wgsl
new file mode 100644
index 0000000..7e49b9d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/28db2c.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl
new file mode 100644
index 0000000..c5e6c35
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupAdd(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupAdd_2ab40a() -> vec4<f16>{
+  var res: vec4<f16> = subgroupAdd(vec4<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e2d2043
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e2d2043
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.glsl
new file mode 100644
index 0000000..dbebf5a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558870aff230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1426d98
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_2ab40a "subgroupAdd_2ab40a"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_2ab40a = OpFunction %v4half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4half Function
+          %9 = OpGroupNonUniformFAdd %v4half %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4half %subgroupAdd_2ab40a
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl
new file mode 100644
index 0000000..377a8c8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.spvasm
new file mode 100644
index 0000000..d3dee0c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.wgsl
new file mode 100644
index 0000000..e9ffade
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/2ab40a.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl
new file mode 100644
index 0000000..9eae358
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupAdd(value: f32) -> f32
+fn subgroupAdd_3854ae() -> f32{
+  var res: f32 = subgroupAdd(1.f);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ce3e297
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupAdd_3854ae() -> f32 {
+  var res : f32 = subgroupAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ce3e297
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupAdd_3854ae() -> f32 {
+  var res : f32 = subgroupAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.glsl
new file mode 100644
index 0000000..1aac3e2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupAdd_3854ae() -> f32 {
+  var res : f32 = subgroupAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c7fc6f1f58
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..021e8f4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_3854ae "subgroupAdd_3854ae"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_3854ae = OpFunction %float None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_float Function
+          %8 = OpGroupNonUniformFAdd %float %uint_3 Reduce %float_1
+               OpStore %res %8
+         %14 = OpLoad %float %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %float %subgroupAdd_3854ae
+         %20 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl
new file mode 100644
index 0000000..dbdbb0b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupAdd_3854ae() -> f32 {
+  var res : f32 = subgroupAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.spvasm
new file mode 100644
index 0000000..fe8c291
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupAdd_3854ae() -> f32 {
+  var res : f32 = subgroupAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.wgsl
new file mode 100644
index 0000000..f04d77c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/3854ae.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupAdd_3854ae() -> f32 {
+  var res : f32 = subgroupAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl
new file mode 100644
index 0000000..7f139f6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupAdd(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupAdd_6587ff() -> vec3<u32>{
+  var res: vec3<u32> = subgroupAdd(vec3<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..25b821e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..25b821e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.glsl
new file mode 100644
index 0000000..b1c3031
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ea4ffe5230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5450cc2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_6587ff "subgroupAdd_6587ff"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_6587ff = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformIAdd %v3uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupAdd_6587ff
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl
new file mode 100644
index 0000000..bede1d9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.spvasm
new file mode 100644
index 0000000..5682df1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.wgsl
new file mode 100644
index 0000000..e3da669
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/6587ff.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl
new file mode 100644
index 0000000..be84829
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupAdd(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupAdd_7d1215() -> vec3<f32>{
+  var res: vec3<f32> = subgroupAdd(vec3<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..df3be16
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..df3be16
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.glsl
new file mode 100644
index 0000000..22e3e5a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5623692c1230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b53e24d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_7d1215 "subgroupAdd_7d1215"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_7d1215 = OpFunction %v3float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3float Function
+          %9 = OpGroupNonUniformFAdd %v3float %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3float %subgroupAdd_7d1215
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl
new file mode 100644
index 0000000..3f535fa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.spvasm
new file mode 100644
index 0000000..d718935
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.wgsl
new file mode 100644
index 0000000..d6ee0da
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/7d1215.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl
new file mode 100644
index 0000000..898b0a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupAdd(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupAdd_8f4c15() -> vec4<f32>{
+  var res: vec4<f32> = subgroupAdd(vec4<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..71da983
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..71da983
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.glsl
new file mode 100644
index 0000000..e140e10
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown builtin method: 0x560a73a9b230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..3beaf85
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_8f4c15 "subgroupAdd_8f4c15"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_8f4c15 = OpFunction %v4float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+          %9 = OpGroupNonUniformFAdd %v4float %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4float %subgroupAdd_8f4c15
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl
new file mode 100644
index 0000000..ac5875c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.spvasm
new file mode 100644
index 0000000..dfea6d7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.wgsl
new file mode 100644
index 0000000..0ea467b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/8f4c15.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl
new file mode 100644
index 0000000..4811cd3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupAdd(value: u32) -> u32
+fn subgroupAdd_b61df7() -> u32{
+  var res: u32 = subgroupAdd(1u);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8fb5174
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAdd_b61df7() -> u32 {
+  var res : u32 = subgroupAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8fb5174
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAdd_b61df7() -> u32 {
+  var res : u32 = subgroupAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.glsl
new file mode 100644
index 0000000..ef14ddf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAdd_b61df7() -> u32 {
+  var res : u32 = subgroupAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5572ff816f58
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4fb5dbc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.ir.spvasm
@@ -0,0 +1,46 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 22
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_b61df7 "subgroupAdd_b61df7"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_b61df7 = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformIAdd %uint %uint_3 Reduce %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupAdd_b61df7
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl
new file mode 100644
index 0000000..889d329
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAdd_b61df7() -> u32 {
+  var res : u32 = subgroupAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.spvasm
new file mode 100644
index 0000000..df88d4f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAdd_b61df7() -> u32 {
+  var res : u32 = subgroupAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.wgsl
new file mode 100644
index 0000000..5aa8d57
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/b61df7.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupAdd_b61df7() -> u32 {
+  var res : u32 = subgroupAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl
new file mode 100644
index 0000000..93c668b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupAdd(value: i32) -> i32
+fn subgroupAdd_ba53f9() -> i32{
+  var res: i32 = subgroupAdd(1i);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..24d4993
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAdd_ba53f9() -> i32 {
+  var res : i32 = subgroupAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..24d4993
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAdd_ba53f9() -> i32 {
+  var res : i32 = subgroupAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.glsl
new file mode 100644
index 0000000..76c730e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAdd_ba53f9() -> i32 {
+  var res : i32 = subgroupAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55b32209af58
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d850f85
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_ba53f9 "subgroupAdd_ba53f9"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_ba53f9 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformIAdd %int %uint_3 Reduce %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupAdd_ba53f9
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl
new file mode 100644
index 0000000..810b372
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAdd_ba53f9() -> i32 {
+  var res : i32 = subgroupAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.spvasm
new file mode 100644
index 0000000..70dffe8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAdd_ba53f9() -> i32 {
+  var res : i32 = subgroupAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.wgsl
new file mode 100644
index 0000000..784f6b9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/ba53f9.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupAdd_ba53f9() -> i32 {
+  var res : i32 = subgroupAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl
new file mode 100644
index 0000000..687aa19
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupAdd(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupAdd_cae1ed() -> vec2<f16>{
+  var res: vec2<f16> = subgroupAdd(vec2<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2093186
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2093186
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.glsl
new file mode 100644
index 0000000..10e14b6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5559ed5b3230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5e6f982
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_cae1ed "subgroupAdd_cae1ed"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_cae1ed = OpFunction %v2half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2half Function
+          %9 = OpGroupNonUniformFAdd %v2half %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2half %subgroupAdd_cae1ed
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl
new file mode 100644
index 0000000..9576828
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.spvasm
new file mode 100644
index 0000000..6fc734d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.wgsl
new file mode 100644
index 0000000..23fb0f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/cae1ed.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl
new file mode 100644
index 0000000..442123f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupAdd(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupAdd_dcf73f() -> vec2<f32>{
+  var res: vec2<f32> = subgroupAdd(vec2<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..40b6330
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..40b6330
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.glsl
new file mode 100644
index 0000000..aca6371
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55b9be662230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..029eeb2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_dcf73f "subgroupAdd_dcf73f"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_dcf73f = OpFunction %v2float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2float Function
+          %9 = OpGroupNonUniformFAdd %v2float %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2float %subgroupAdd_dcf73f
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl
new file mode 100644
index 0000000..cee484a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.spvasm
new file mode 100644
index 0000000..a5a865c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.wgsl
new file mode 100644
index 0000000..17ee001
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/dcf73f.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl
new file mode 100644
index 0000000..2afcf71
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupAdd(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupAdd_fbc357() -> vec4<u32>{
+  var res: vec4<u32> = subgroupAdd(vec4<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e5473db
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e5473db
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.glsl
new file mode 100644
index 0000000..95d1143
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c5105db230
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..66302ba
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_fbc357 "subgroupAdd_fbc357"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_fbc357 = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformIAdd %v4uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupAdd_fbc357
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl
new file mode 100644
index 0000000..b07b13d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.spvasm
new file mode 100644
index 0000000..fa7bcbd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.wgsl
new file mode 100644
index 0000000..8379b0f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupAdd/fbc357.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl
new file mode 100644
index 0000000..44060f7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupExclusiveAdd_01de08() -> vec2<f16>{
+  var res: vec2<f16> = subgroupExclusiveAdd(vec2<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9367036
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9367036
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.glsl
new file mode 100644
index 0000000..7422bbf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5616d463a230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..501063e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_01de08 "subgroupExclusiveAdd_01de08"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_01de08 = OpFunction %v2half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2half Function
+          %9 = OpGroupNonUniformFAdd %v2half %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v2half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2half %subgroupExclusiveAdd_01de08
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl
new file mode 100644
index 0000000..b9a56ed
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.spvasm
new file mode 100644
index 0000000..59ef4cd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.wgsl
new file mode 100644
index 0000000..60c3604
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/01de08.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl
new file mode 100644
index 0000000..cbac30d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupExclusiveAdd_0ff95a() -> vec3<u32>{
+  var res: vec3<u32> = subgroupExclusiveAdd(vec3<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2597572
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2597572
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.glsl
new file mode 100644
index 0000000..dacd2f4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55bc8779a230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..543e607
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_0ff95a "subgroupExclusiveAdd_0ff95a"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_0ff95a = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformIAdd %v3uint %uint_3 ExclusiveScan %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupExclusiveAdd_0ff95a
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
new file mode 100644
index 0000000..10f14a5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.spvasm
new file mode 100644
index 0000000..628240f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.wgsl
new file mode 100644
index 0000000..6b34700
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/0ff95a.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl
new file mode 100644
index 0000000..c9d43bb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupExclusiveAdd_406ab4() -> vec4<i32>{
+  var res: vec4<i32> = subgroupExclusiveAdd(vec4<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9ead944
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9ead944
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.glsl
new file mode 100644
index 0000000..ba04c73
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56172edaf230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2921553
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_406ab4 "subgroupExclusiveAdd_406ab4"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_406ab4 = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformIAdd %v4int %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupExclusiveAdd_406ab4
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
new file mode 100644
index 0000000..79a957a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.spvasm
new file mode 100644
index 0000000..45d6c81
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.wgsl
new file mode 100644
index 0000000..43a2d07
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/406ab4.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl
new file mode 100644
index 0000000..e867a86
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupExclusiveAdd_41cfde() -> vec3<f32>{
+  var res: vec3<f32> = subgroupExclusiveAdd(vec3<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a9a8212
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a9a8212
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.glsl
new file mode 100644
index 0000000..692c5e3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5584f4fb8230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..58cf836
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_41cfde "subgroupExclusiveAdd_41cfde"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_41cfde = OpFunction %v3float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3float Function
+          %9 = OpGroupNonUniformFAdd %v3float %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v3float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3float %subgroupExclusiveAdd_41cfde
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
new file mode 100644
index 0000000..e5d015d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.spvasm
new file mode 100644
index 0000000..3a07a3a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.wgsl
new file mode 100644
index 0000000..6c7ace8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/41cfde.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl
new file mode 100644
index 0000000..d7ac089
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupExclusiveAdd(value: u32) -> u32
+fn subgroupExclusiveAdd_42684c() -> u32{
+  var res: u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..17c184dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveAdd_42684c() -> u32 {
+  var res : u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..17c184dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveAdd_42684c() -> u32 {
+  var res : u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.glsl
new file mode 100644
index 0000000..9342b09
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveAdd_42684c() -> u32 {
+  var res : u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55cadd930f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1bc2976
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.ir.spvasm
@@ -0,0 +1,46 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 22
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_42684c "subgroupExclusiveAdd_42684c"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_42684c = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformIAdd %uint %uint_3 ExclusiveScan %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupExclusiveAdd_42684c
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl
new file mode 100644
index 0000000..84a26b7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveAdd_42684c() -> u32 {
+  var res : u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.spvasm
new file mode 100644
index 0000000..4f9388f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveAdd_42684c() -> u32 {
+  var res : u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.wgsl
new file mode 100644
index 0000000..738d3de
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/42684c.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveAdd_42684c() -> u32 {
+  var res : u32 = subgroupExclusiveAdd(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl
new file mode 100644
index 0000000..e8f8ebb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupExclusiveAdd_48acea() -> vec2<u32>{
+  var res: vec2<u32> = subgroupExclusiveAdd(vec2<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b1db044
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b1db044
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.glsl
new file mode 100644
index 0000000..a8b48f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55cb7c0f3230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..95a44c7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_48acea "subgroupExclusiveAdd_48acea"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_48acea = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformIAdd %v2uint %uint_3 ExclusiveScan %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupExclusiveAdd_48acea
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl
new file mode 100644
index 0000000..e981a67
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.spvasm
new file mode 100644
index 0000000..e2b3209
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.wgsl
new file mode 100644
index 0000000..d8ceb8f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/48acea.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl
new file mode 100644
index 0000000..d67c74d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupExclusiveAdd(value: f16) -> f16
+fn subgroupExclusiveAdd_4a1568() -> f16{
+  var res: f16 = subgroupExclusiveAdd(1.h);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b6b7732
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveAdd_4a1568() -> f16 {
+  var res : f16 = subgroupExclusiveAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b6b7732
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveAdd_4a1568() -> f16 {
+  var res : f16 = subgroupExclusiveAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.glsl
new file mode 100644
index 0000000..fa5db62
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveAdd_4a1568() -> f16 {
+  var res : f16 = subgroupExclusiveAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561d89ec2f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2975207
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_4a1568 "subgroupExclusiveAdd_4a1568"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%_ptr_Function_half = OpTypePointer Function %half
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_4a1568 = OpFunction %half None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_half Function
+          %8 = OpGroupNonUniformFAdd %half %uint_3 ExclusiveScan %half_0x1p_0
+               OpStore %res %8
+         %14 = OpLoad %half %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %half %subgroupExclusiveAdd_4a1568
+         %20 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
new file mode 100644
index 0000000..6d99143
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveAdd_4a1568() -> f16 {
+  var res : f16 = subgroupExclusiveAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.spvasm
new file mode 100644
index 0000000..db08c5f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveAdd_4a1568() -> f16 {
+  var res : f16 = subgroupExclusiveAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.wgsl
new file mode 100644
index 0000000..93f8015
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4a1568.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveAdd_4a1568() -> f16 {
+  var res : f16 = subgroupExclusiveAdd(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl
new file mode 100644
index 0000000..3aa24b0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupExclusiveAdd_4c8024() -> vec2<f32>{
+  var res: vec2<f32> = subgroupExclusiveAdd(vec2<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..341c439
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..341c439
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.glsl
new file mode 100644
index 0000000..7e0efb0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55fe91648230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..75ae109
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_4c8024 "subgroupExclusiveAdd_4c8024"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_4c8024 = OpFunction %v2float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2float Function
+          %9 = OpGroupNonUniformFAdd %v2float %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v2float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2float %subgroupExclusiveAdd_4c8024
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
new file mode 100644
index 0000000..738ce30
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.spvasm
new file mode 100644
index 0000000..e1947bf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.wgsl
new file mode 100644
index 0000000..aa10d1f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/4c8024.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl
new file mode 100644
index 0000000..36b2599
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupExclusiveAdd_71ad0f() -> vec4<f32>{
+  var res: vec4<f32> = subgroupExclusiveAdd(vec4<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..753e3a5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..753e3a5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.glsl
new file mode 100644
index 0000000..76907a3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55f312d57230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..cd930ad
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_71ad0f "subgroupExclusiveAdd_71ad0f"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_71ad0f = OpFunction %v4float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+          %9 = OpGroupNonUniformFAdd %v4float %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v4float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4float %subgroupExclusiveAdd_71ad0f
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
new file mode 100644
index 0000000..186a08e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.spvasm
new file mode 100644
index 0000000..4e253d5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.wgsl
new file mode 100644
index 0000000..5101a67
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/71ad0f.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl
new file mode 100644
index 0000000..1757a2a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupExclusiveAdd_95e984() -> vec4<f16>{
+  var res: vec4<f16> = subgroupExclusiveAdd(vec4<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cb6585a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cb6585a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.glsl
new file mode 100644
index 0000000..46ffb13
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55e4dbb39230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..93982c9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_95e984 "subgroupExclusiveAdd_95e984"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_95e984 = OpFunction %v4half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4half Function
+          %9 = OpGroupNonUniformFAdd %v4half %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v4half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4half %subgroupExclusiveAdd_95e984
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl
new file mode 100644
index 0000000..ec6b47d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.spvasm
new file mode 100644
index 0000000..ee1f5a0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.wgsl
new file mode 100644
index 0000000..a5976af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/95e984.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl
new file mode 100644
index 0000000..9972262
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupExclusiveAdd(value: f32) -> f32
+fn subgroupExclusiveAdd_967e38() -> f32{
+  var res: f32 = subgroupExclusiveAdd(1.f);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f14c628
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveAdd_967e38() -> f32 {
+  var res : f32 = subgroupExclusiveAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f14c628
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveAdd_967e38() -> f32 {
+  var res : f32 = subgroupExclusiveAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.glsl
new file mode 100644
index 0000000..17d7402
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveAdd_967e38() -> f32 {
+  var res : f32 = subgroupExclusiveAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown builtin method: 0x557874a96f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..959fe4d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_967e38 "subgroupExclusiveAdd_967e38"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_967e38 = OpFunction %float None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_float Function
+          %8 = OpGroupNonUniformFAdd %float %uint_3 ExclusiveScan %float_1
+               OpStore %res %8
+         %14 = OpLoad %float %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %float %subgroupExclusiveAdd_967e38
+         %20 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl
new file mode 100644
index 0000000..2024c8e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveAdd_967e38() -> f32 {
+  var res : f32 = subgroupExclusiveAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.spvasm
new file mode 100644
index 0000000..8b3eb5a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveAdd_967e38() -> f32 {
+  var res : f32 = subgroupExclusiveAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.wgsl
new file mode 100644
index 0000000..9501cb8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/967e38.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveAdd_967e38() -> f32 {
+  var res : f32 = subgroupExclusiveAdd(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl
new file mode 100644
index 0000000..fabbb2d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupExclusiveAdd(value: i32) -> i32
+fn subgroupExclusiveAdd_b0c261() -> i32{
+  var res: i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..73fa73c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveAdd_b0c261() -> i32 {
+  var res : i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..73fa73c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveAdd_b0c261() -> i32 {
+  var res : i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.glsl
new file mode 100644
index 0000000..4595cb5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveAdd_b0c261() -> i32 {
+  var res : i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown builtin method: 0x564c03b60f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..82dd8f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_b0c261 "subgroupExclusiveAdd_b0c261"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_b0c261 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformIAdd %int %uint_3 ExclusiveScan %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupExclusiveAdd_b0c261
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
new file mode 100644
index 0000000..625491b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveAdd_b0c261() -> i32 {
+  var res : i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.spvasm
new file mode 100644
index 0000000..8272ebe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveAdd_b0c261() -> i32 {
+  var res : i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.wgsl
new file mode 100644
index 0000000..5d3c496
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/b0c261.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveAdd_b0c261() -> i32 {
+  var res : i32 = subgroupExclusiveAdd(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl
new file mode 100644
index 0000000..f249b46
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupExclusiveAdd_c08160() -> vec3<i32>{
+  var res: vec3<i32> = subgroupExclusiveAdd(vec3<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c101a50
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c101a50
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.glsl
new file mode 100644
index 0000000..dc8fcbd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55d88c4a4230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2d52523
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_c08160 "subgroupExclusiveAdd_c08160"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_c08160 = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformIAdd %v3int %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupExclusiveAdd_c08160
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl
new file mode 100644
index 0000000..9429d91
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.spvasm
new file mode 100644
index 0000000..000de42
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.wgsl
new file mode 100644
index 0000000..71694ef
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/c08160.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl
new file mode 100644
index 0000000..1060a80
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupExclusiveAdd_e58e23() -> vec3<f16>{
+  var res: vec3<f16> = subgroupExclusiveAdd(vec3<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5af1606
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..5af1606
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.glsl
new file mode 100644
index 0000000..eb20c03
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561287866230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6fbab60
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_e58e23 "subgroupExclusiveAdd_e58e23"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_e58e23 = OpFunction %v3half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3half Function
+          %9 = OpGroupNonUniformFAdd %v3half %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v3half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3half %subgroupExclusiveAdd_e58e23
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
new file mode 100644
index 0000000..e8fbd40
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.spvasm
new file mode 100644
index 0000000..f988f8c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.wgsl
new file mode 100644
index 0000000..2f04512
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/e58e23.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl
new file mode 100644
index 0000000..a1e0c54
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupExclusiveAdd_ec300f() -> vec4<u32>{
+  var res: vec4<u32> = subgroupExclusiveAdd(vec4<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0995edf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0995edf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.glsl
new file mode 100644
index 0000000..6ab9280
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown builtin method: 0x563aab9db230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c37d727
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_ec300f "subgroupExclusiveAdd_ec300f"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_ec300f = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformIAdd %v4uint %uint_3 ExclusiveScan %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupExclusiveAdd_ec300f
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
new file mode 100644
index 0000000..6ec76fb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.spvasm
new file mode 100644
index 0000000..8b8268f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.wgsl
new file mode 100644
index 0000000..6788744
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/ec300f.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl
new file mode 100644
index 0000000..95229e4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupExclusiveAdd_f0f712() -> vec2<i32>{
+  var res: vec2<i32> = subgroupExclusiveAdd(vec2<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..20a1dff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..20a1dff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.glsl
new file mode 100644
index 0000000..d4b1754
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55d564794230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..defd206
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_f0f712 "subgroupExclusiveAdd_f0f712"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v2int %int_1 %int_1
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_f0f712 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformIAdd %v2int %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupExclusiveAdd_f0f712
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
new file mode 100644
index 0000000..7f44aa1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.spvasm
new file mode 100644
index 0000000..941b886
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.wgsl
new file mode 100644
index 0000000..b31d68d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveAdd/f0f712.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl
new file mode 100644
index 0000000..b63fa18
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupExclusiveMul_000b92() -> vec4<u32>{
+  var res: vec4<u32> = subgroupExclusiveMul(vec4<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..80c717e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..80c717e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.glsl
new file mode 100644
index 0000000..d0ddcc0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown builtin method: 0x564749dbe230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..55becf4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_000b92 "subgroupExclusiveMul_000b92"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_000b92 = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformIMul %v4uint %uint_3 ExclusiveScan %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupExclusiveMul_000b92
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl
new file mode 100644
index 0000000..27162ab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.spvasm
new file mode 100644
index 0000000..df7b1f2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.wgsl
new file mode 100644
index 0000000..6886bc4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/000b92.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl
new file mode 100644
index 0000000..eabeb3e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupExclusiveMul_019660() -> vec4<i32>{
+  var res: vec4<i32> = subgroupExclusiveMul(vec4<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..dd8c4cb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..dd8c4cb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.glsl
new file mode 100644
index 0000000..539b2bf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown builtin method: 0x560050cab230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4991987
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_019660 "subgroupExclusiveMul_019660"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_019660 = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformIMul %v4int %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupExclusiveMul_019660
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl
new file mode 100644
index 0000000..5f1f7ee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.spvasm
new file mode 100644
index 0000000..20b6ef3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.wgsl
new file mode 100644
index 0000000..8dff29d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/019660.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl
new file mode 100644
index 0000000..8c37ca5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupExclusiveMul_0a04d5() -> vec3<f32>{
+  var res: vec3<f32> = subgroupExclusiveMul(vec3<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d82e527
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d82e527
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.glsl
new file mode 100644
index 0000000..03091e5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55718f403230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b97ef30
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_0a04d5 "subgroupExclusiveMul_0a04d5"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_0a04d5 = OpFunction %v3float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3float Function
+          %9 = OpGroupNonUniformFMul %v3float %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v3float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3float %subgroupExclusiveMul_0a04d5
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
new file mode 100644
index 0000000..e50e55f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.spvasm
new file mode 100644
index 0000000..cb395d3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.wgsl
new file mode 100644
index 0000000..ab6ccd0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/0a04d5.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl
new file mode 100644
index 0000000..ff3272d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupExclusiveMul_13ba26() -> vec3<f16>{
+  var res: vec3<f16> = subgroupExclusiveMul(vec3<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..fb00194
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..fb00194
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.glsl
new file mode 100644
index 0000000..6fadce4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown builtin method: 0x564d1f8be230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..14cccdb
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_13ba26 "subgroupExclusiveMul_13ba26"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_13ba26 = OpFunction %v3half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3half Function
+          %9 = OpGroupNonUniformFMul %v3half %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v3half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3half %subgroupExclusiveMul_13ba26
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl
new file mode 100644
index 0000000..31a1ff5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.spvasm
new file mode 100644
index 0000000..0195367
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.wgsl
new file mode 100644
index 0000000..662845d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/13ba26.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl
new file mode 100644
index 0000000..8a0cc7c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupExclusiveMul_25d1b9() -> vec2<f32>{
+  var res: vec2<f32> = subgroupExclusiveMul(vec2<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6b150a1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6b150a1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.glsl
new file mode 100644
index 0000000..16d9a6a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55cd11cac230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c615bc6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_25d1b9 "subgroupExclusiveMul_25d1b9"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_25d1b9 = OpFunction %v2float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2float Function
+          %9 = OpGroupNonUniformFMul %v2float %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v2float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2float %subgroupExclusiveMul_25d1b9
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
new file mode 100644
index 0000000..6f6293b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.spvasm
new file mode 100644
index 0000000..490d44f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.wgsl
new file mode 100644
index 0000000..7ec6b85
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/25d1b9.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl
new file mode 100644
index 0000000..9253a80
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupExclusiveMul_4525a3() -> vec2<i32>{
+  var res: vec2<i32> = subgroupExclusiveMul(vec2<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9f3caae
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9f3caae
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.glsl
new file mode 100644
index 0000000..6b91678
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown builtin method: 0x564d514bc230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..0e28e8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_4525a3 "subgroupExclusiveMul_4525a3"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v2int %int_1 %int_1
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_4525a3 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformIMul %v2int %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupExclusiveMul_4525a3
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl
new file mode 100644
index 0000000..f9f0124
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.spvasm
new file mode 100644
index 0000000..e47360e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.wgsl
new file mode 100644
index 0000000..f5f74e3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/4525a3.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl
new file mode 100644
index 0000000..fc90738
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupExclusiveMul(value: f16) -> f16
+fn subgroupExclusiveMul_6f431e() -> f16{
+  var res: f16 = subgroupExclusiveMul(1.h);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a398280
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveMul_6f431e() -> f16 {
+  var res : f16 = subgroupExclusiveMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a398280
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveMul_6f431e() -> f16 {
+  var res : f16 = subgroupExclusiveMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.glsl
new file mode 100644
index 0000000..b2e4b84
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveMul_6f431e() -> f16 {
+  var res : f16 = subgroupExclusiveMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5582b26f2f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6a64ec0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_6f431e "subgroupExclusiveMul_6f431e"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%_ptr_Function_half = OpTypePointer Function %half
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_6f431e = OpFunction %half None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_half Function
+          %8 = OpGroupNonUniformFMul %half %uint_3 ExclusiveScan %half_0x1p_0
+               OpStore %res %8
+         %14 = OpLoad %half %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %half %subgroupExclusiveMul_6f431e
+         %20 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl
new file mode 100644
index 0000000..2d8cabe
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveMul_6f431e() -> f16 {
+  var res : f16 = subgroupExclusiveMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.spvasm
new file mode 100644
index 0000000..8a7a380
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveMul_6f431e() -> f16 {
+  var res : f16 = subgroupExclusiveMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.wgsl
new file mode 100644
index 0000000..ac7984a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/6f431e.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupExclusiveMul_6f431e() -> f16 {
+  var res : f16 = subgroupExclusiveMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl
new file mode 100644
index 0000000..37c68d1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupExclusiveMul_7b5f57() -> vec4<f32>{
+  var res: vec4<f32> = subgroupExclusiveMul(vec4<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5a8ec25
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..5a8ec25
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.glsl
new file mode 100644
index 0000000..ec181ca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56269c636230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..0b30683
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_7b5f57 "subgroupExclusiveMul_7b5f57"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_7b5f57 = OpFunction %v4float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+          %9 = OpGroupNonUniformFMul %v4float %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v4float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4float %subgroupExclusiveMul_7b5f57
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
new file mode 100644
index 0000000..d6e2984
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.spvasm
new file mode 100644
index 0000000..e2129bc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.wgsl
new file mode 100644
index 0000000..e641f1a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/7b5f57.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl
new file mode 100644
index 0000000..a7e7769
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupExclusiveMul_87f23e() -> vec3<i32>{
+  var res: vec3<i32> = subgroupExclusiveMul(vec3<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f50364d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f50364d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.glsl
new file mode 100644
index 0000000..a6bacac
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55e0b80c2230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6adecee
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_87f23e "subgroupExclusiveMul_87f23e"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_87f23e = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformIMul %v3int %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupExclusiveMul_87f23e
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl
new file mode 100644
index 0000000..68c7a9d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.spvasm
new file mode 100644
index 0000000..e633e6a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.wgsl
new file mode 100644
index 0000000..3ac2e2f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/87f23e.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl
new file mode 100644
index 0000000..b713af5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupExclusiveMul(value: f32) -> f32
+fn subgroupExclusiveMul_98b2e4() -> f32{
+  var res: f32 = subgroupExclusiveMul(1.f);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f9b1971
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveMul_98b2e4() -> f32 {
+  var res : f32 = subgroupExclusiveMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f9b1971
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveMul_98b2e4() -> f32 {
+  var res : f32 = subgroupExclusiveMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.glsl
new file mode 100644
index 0000000..ed0e725
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveMul_98b2e4() -> f32 {
+  var res : f32 = subgroupExclusiveMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown builtin method: 0x563500566f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..903118b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_98b2e4 "subgroupExclusiveMul_98b2e4"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_98b2e4 = OpFunction %float None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_float Function
+          %8 = OpGroupNonUniformFMul %float %uint_3 ExclusiveScan %float_1
+               OpStore %res %8
+         %14 = OpLoad %float %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %float %subgroupExclusiveMul_98b2e4
+         %20 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
new file mode 100644
index 0000000..0637e61
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveMul_98b2e4() -> f32 {
+  var res : f32 = subgroupExclusiveMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.spvasm
new file mode 100644
index 0000000..ec55819
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveMul_98b2e4() -> f32 {
+  var res : f32 = subgroupExclusiveMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.wgsl
new file mode 100644
index 0000000..b402fa3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/98b2e4.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupExclusiveMul_98b2e4() -> f32 {
+  var res : f32 = subgroupExclusiveMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl
new file mode 100644
index 0000000..38880dc
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupExclusiveMul_a07956() -> vec4<f16>{
+  var res: vec4<f16> = subgroupExclusiveMul(vec4<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f07de8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f07de8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.glsl
new file mode 100644
index 0000000..02f5908
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ecad0f7230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..ec01276
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_a07956 "subgroupExclusiveMul_a07956"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_a07956 = OpFunction %v4half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4half Function
+          %9 = OpGroupNonUniformFMul %v4half %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v4half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4half %subgroupExclusiveMul_a07956
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl
new file mode 100644
index 0000000..df73ff3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.spvasm
new file mode 100644
index 0000000..4cbb86b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.wgsl
new file mode 100644
index 0000000..b758165
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a07956.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl
new file mode 100644
index 0000000..60ac86a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupExclusiveMul(value: i32) -> i32
+fn subgroupExclusiveMul_a23002() -> i32{
+  var res: i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bac1e2b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveMul_a23002() -> i32 {
+  var res : i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..bac1e2b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveMul_a23002() -> i32 {
+  var res : i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.glsl
new file mode 100644
index 0000000..b968685
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveMul_a23002() -> i32 {
+  var res : i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558723964f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4c3381b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_a23002 "subgroupExclusiveMul_a23002"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_a23002 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformIMul %int %uint_3 ExclusiveScan %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupExclusiveMul_a23002
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl
new file mode 100644
index 0000000..6ea7898
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveMul_a23002() -> i32 {
+  var res : i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.spvasm
new file mode 100644
index 0000000..c117538
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveMul_a23002() -> i32 {
+  var res : i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.wgsl
new file mode 100644
index 0000000..67f1e0c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/a23002.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupExclusiveMul_a23002() -> i32 {
+  var res : i32 = subgroupExclusiveMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl
new file mode 100644
index 0000000..fbd42ec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupExclusiveMul_d1d490() -> vec2<u32>{
+  var res: vec2<u32> = subgroupExclusiveMul(vec2<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ddbb5d4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ddbb5d4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.glsl
new file mode 100644
index 0000000..6ac660d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown builtin method: 0x559274ec6230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..914f851
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_d1d490 "subgroupExclusiveMul_d1d490"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_d1d490 = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformIMul %v2uint %uint_3 ExclusiveScan %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupExclusiveMul_d1d490
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl
new file mode 100644
index 0000000..4516b64
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.spvasm
new file mode 100644
index 0000000..44b4444
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.wgsl
new file mode 100644
index 0000000..6700b0f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/d1d490.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl
new file mode 100644
index 0000000..dad4127
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupExclusiveMul(value: u32) -> u32
+fn subgroupExclusiveMul_dc51f8() -> u32{
+  var res: u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..26c2244
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveMul_dc51f8() -> u32 {
+  var res : u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..26c2244
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveMul_dc51f8() -> u32 {
+  var res : u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.glsl
new file mode 100644
index 0000000..9568e02
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveMul_dc51f8() -> u32 {
+  var res : u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561132389f58
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..60ef545
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.spvasm
@@ -0,0 +1,46 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 22
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_dc51f8 "subgroupExclusiveMul_dc51f8"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_dc51f8 = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformIMul %uint %uint_3 ExclusiveScan %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupExclusiveMul_dc51f8
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
new file mode 100644
index 0000000..e0c5ca7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveMul_dc51f8() -> u32 {
+  var res : u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.spvasm
new file mode 100644
index 0000000..cbc2c67
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveMul_dc51f8() -> u32 {
+  var res : u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.wgsl
new file mode 100644
index 0000000..007644c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/dc51f8.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupExclusiveMul_dc51f8() -> u32 {
+  var res : u32 = subgroupExclusiveMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl
new file mode 100644
index 0000000..9c12fa3
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupExclusiveMul_e88d1c() -> vec2<f16>{
+  var res: vec2<f16> = subgroupExclusiveMul(vec2<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..71a0ef2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..71a0ef2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.glsl
new file mode 100644
index 0000000..b474549
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55b923040230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4a65136
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_e88d1c "subgroupExclusiveMul_e88d1c"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_e88d1c = OpFunction %v2half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2half Function
+          %9 = OpGroupNonUniformFMul %v2half %uint_3 ExclusiveScan %12
+               OpStore %res %9
+         %16 = OpLoad %v2half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2half %subgroupExclusiveMul_e88d1c
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
new file mode 100644
index 0000000..5d6e10a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.spvasm
new file mode 100644
index 0000000..9e2f46a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.wgsl
new file mode 100644
index 0000000..3829ce7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/e88d1c.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl
new file mode 100644
index 0000000..7a19af1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupExclusiveMul_f039f4() -> vec3<u32>{
+  var res: vec3<u32> = subgroupExclusiveMul(vec3<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4dfa9b1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4dfa9b1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.glsl
new file mode 100644
index 0000000..d3f21af
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55a0d6edf230
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6315525
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_f039f4 "subgroupExclusiveMul_f039f4"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_f039f4 = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformIMul %v3uint %uint_3 ExclusiveScan %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupExclusiveMul_f039f4
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl
new file mode 100644
index 0000000..23f5857
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.spvasm
new file mode 100644
index 0000000..831a772
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.wgsl
new file mode 100644
index 0000000..345bb00
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupExclusiveMul/f039f4.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl
new file mode 100644
index 0000000..93a37a2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupMul(value: f32) -> f32
+fn subgroupMul_0de9d3() -> f32{
+  var res: f32 = subgroupMul(1.f);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0bf1362
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupMul_0de9d3() -> f32 {
+  var res : f32 = subgroupMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0bf1362
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupMul_0de9d3() -> f32 {
+  var res : f32 = subgroupMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.glsl
new file mode 100644
index 0000000..6a92993
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupMul_0de9d3() -> f32 {
+  var res : f32 = subgroupMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55802f025f58
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..07bec15
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_0de9d3 "subgroupMul_0de9d3"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+%_ptr_Function_float = OpTypePointer Function %float
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_0de9d3 = OpFunction %float None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_float Function
+          %8 = OpGroupNonUniformFMul %float %uint_3 Reduce %float_1
+               OpStore %res %8
+         %14 = OpLoad %float %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %float %subgroupMul_0de9d3
+         %20 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl
new file mode 100644
index 0000000..6b40369
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupMul_0de9d3() -> f32 {
+  var res : f32 = subgroupMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.spvasm
new file mode 100644
index 0000000..0b4b10e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupMul_0de9d3() -> f32 {
+  var res : f32 = subgroupMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.wgsl
new file mode 100644
index 0000000..acb918e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/0de9d3.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+fn subgroupMul_0de9d3() -> f32 {
+  var res : f32 = subgroupMul(1.0f);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl
new file mode 100644
index 0000000..4b59b68
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupMul(value: f16) -> f16
+fn subgroupMul_2941a2() -> f16{
+  var res: f16 = subgroupMul(1.h);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0f2ab75
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupMul_2941a2() -> f16 {
+  var res : f16 = subgroupMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0f2ab75
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupMul_2941a2() -> f16 {
+  var res : f16 = subgroupMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.glsl
new file mode 100644
index 0000000..0138d09
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupMul_2941a2() -> f16 {
+  var res : f16 = subgroupMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ec5f3bbf58
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1ebe7f1
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_2941a2 "subgroupMul_2941a2"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+%_ptr_Function_half = OpTypePointer Function %half
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_2941a2 = OpFunction %half None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_half Function
+          %8 = OpGroupNonUniformFMul %half %uint_3 Reduce %half_0x1p_0
+               OpStore %res %8
+         %14 = OpLoad %half %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %half %subgroupMul_2941a2
+         %20 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl
new file mode 100644
index 0000000..e6525f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupMul_2941a2() -> f16 {
+  var res : f16 = subgroupMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.spvasm
new file mode 100644
index 0000000..751b6d4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupMul_2941a2() -> f16 {
+  var res : f16 = subgroupMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.wgsl
new file mode 100644
index 0000000..dc9a9cd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/2941a2.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+fn subgroupMul_2941a2() -> f16 {
+  var res : f16 = subgroupMul(1.0h);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl
new file mode 100644
index 0000000..80edcd8
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupMul(value: i32) -> i32
+fn subgroupMul_3fe886() -> i32{
+  var res: i32 = subgroupMul(1i);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..71a6c54
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupMul_3fe886() -> i32 {
+  var res : i32 = subgroupMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..71a6c54
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupMul_3fe886() -> i32 {
+  var res : i32 = subgroupMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.glsl
new file mode 100644
index 0000000..963024c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupMul_3fe886() -> i32 {
+  var res : i32 = subgroupMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ff04857f58
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..8a42c88
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.ir.spvasm
@@ -0,0 +1,47 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 23
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_3fe886 "subgroupMul_3fe886"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+%_ptr_Function_int = OpTypePointer Function %int
+       %void = OpTypeVoid
+         %17 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_3fe886 = OpFunction %int None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_int Function
+          %8 = OpGroupNonUniformIMul %int %uint_3 Reduce %int_1
+               OpStore %res %8
+         %14 = OpLoad %int %res
+               OpReturnValue %14
+               OpFunctionEnd
+%compute_main = OpFunction %void None %17
+         %18 = OpLabel
+         %19 = OpFunctionCall %int %subgroupMul_3fe886
+         %20 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %20 %19
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl
new file mode 100644
index 0000000..dcb5c61
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupMul_3fe886() -> i32 {
+  var res : i32 = subgroupMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.spvasm
new file mode 100644
index 0000000..5a9457a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupMul_3fe886() -> i32 {
+  var res : i32 = subgroupMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.wgsl
new file mode 100644
index 0000000..879ea2a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/3fe886.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+fn subgroupMul_3fe886() -> i32 {
+  var res : i32 = subgroupMul(1i);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl
new file mode 100644
index 0000000..79762cf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupMul(value: u32) -> u32
+fn subgroupMul_4f8ee6() -> u32{
+  var res: u32 = subgroupMul(1u);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c830d75
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupMul_4f8ee6() -> u32 {
+  var res : u32 = subgroupMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c830d75
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupMul_4f8ee6() -> u32 {
+  var res : u32 = subgroupMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.glsl
new file mode 100644
index 0000000..82f51ec
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupMul_4f8ee6() -> u32 {
+  var res : u32 = subgroupMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown builtin method: 0x560b3b8daf58
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c393eab
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.ir.spvasm
@@ -0,0 +1,46 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 22
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_4f8ee6 "subgroupMul_4f8ee6"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+%_ptr_Function_uint = OpTypePointer Function %uint
+       %void = OpTypeVoid
+         %16 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_4f8ee6 = OpFunction %uint None %6
+          %7 = OpLabel
+        %res = OpVariable %_ptr_Function_uint Function
+          %8 = OpGroupNonUniformIMul %uint %uint_3 Reduce %uint_1
+               OpStore %res %8
+         %13 = OpLoad %uint %res
+               OpReturnValue %13
+               OpFunctionEnd
+%compute_main = OpFunction %void None %16
+         %17 = OpLabel
+         %18 = OpFunctionCall %uint %subgroupMul_4f8ee6
+         %19 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %19 %18
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl
new file mode 100644
index 0000000..f98a558
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupMul_4f8ee6() -> u32 {
+  var res : u32 = subgroupMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.spvasm
new file mode 100644
index 0000000..6423690
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupMul_4f8ee6() -> u32 {
+  var res : u32 = subgroupMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.wgsl
new file mode 100644
index 0000000..3138bf0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/4f8ee6.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+fn subgroupMul_4f8ee6() -> u32 {
+  var res : u32 = subgroupMul(1u);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl
new file mode 100644
index 0000000..bd2925e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupMul(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupMul_53aee2() -> vec3<f16>{
+  var res: vec3<f16> = subgroupMul(vec3<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3cc2754
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3cc2754
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.glsl
new file mode 100644
index 0000000..d37dc33
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5624f24e6230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c97b97f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_53aee2 "subgroupMul_53aee2"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_53aee2 = OpFunction %v3half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3half Function
+          %9 = OpGroupNonUniformFMul %v3half %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3half %subgroupMul_53aee2
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl
new file mode 100644
index 0000000..94ace2f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.spvasm
new file mode 100644
index 0000000..363505d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.wgsl
new file mode 100644
index 0000000..7efcf73
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/53aee2.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl
new file mode 100644
index 0000000..e0d3f17
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupMul(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupMul_5a8c86() -> vec3<i32>{
+  var res: vec3<i32> = subgroupMul(vec3<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d191760
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d191760
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.glsl
new file mode 100644
index 0000000..fcca71b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55d485901230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d9ccb57
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_5a8c86 "subgroupMul_5a8c86"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_5a8c86 = OpFunction %v3int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3int Function
+          %9 = OpGroupNonUniformIMul %v3int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3int %subgroupMul_5a8c86
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl
new file mode 100644
index 0000000..05e01c9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.spvasm
new file mode 100644
index 0000000..49cc1a4
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.wgsl
new file mode 100644
index 0000000..01c6996
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/5a8c86.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl
new file mode 100644
index 0000000..65cd400
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupMul(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupMul_66c813() -> vec4<f32>{
+  var res: vec4<f32> = subgroupMul(vec4<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c2d606e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c2d606e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.glsl
new file mode 100644
index 0000000..e9f8a02
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55d55b683230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..7b7c50f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_66c813 "subgroupMul_66c813"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_66c813 = OpFunction %v4float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4float Function
+          %9 = OpGroupNonUniformFMul %v4float %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4float %subgroupMul_66c813
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl
new file mode 100644
index 0000000..144c23b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.spvasm
new file mode 100644
index 0000000..6b7b6d9
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.wgsl
new file mode 100644
index 0000000..00e7764
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/66c813.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl
new file mode 100644
index 0000000..6965f30
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupMul(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupMul_6aaaf3() -> vec2<f16>{
+  var res: vec2<f16> = subgroupMul(vec2<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3a8b145
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3a8b145
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.glsl
new file mode 100644
index 0000000..2ecf478
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown builtin method: 0x563692c08230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..a3df835
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_6aaaf3 "subgroupMul_6aaaf3"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_6aaaf3 = OpFunction %v2half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2half Function
+          %9 = OpGroupNonUniformFMul %v2half %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2half %subgroupMul_6aaaf3
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl
new file mode 100644
index 0000000..23d4166
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.spvasm
new file mode 100644
index 0000000..d1a7d4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.wgsl
new file mode 100644
index 0000000..0bcbc60
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/6aaaf3.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl
new file mode 100644
index 0000000..b886da0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupMul(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupMul_93eccd() -> vec3<f32>{
+  var res: vec3<f32> = subgroupMul(vec3<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e3fb6f2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e3fb6f2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.glsl
new file mode 100644
index 0000000..da185c7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56032392e230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d721296
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_93eccd "subgroupMul_93eccd"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_93eccd = OpFunction %v3float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3float Function
+          %9 = OpGroupNonUniformFMul %v3float %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v3float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v3float %subgroupMul_93eccd
+         %22 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl
new file mode 100644
index 0000000..47d6184
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.spvasm
new file mode 100644
index 0000000..69a879f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.wgsl
new file mode 100644
index 0000000..b75180d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/93eccd.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl
new file mode 100644
index 0000000..da94aff
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupMul(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupMul_d584a2() -> vec2<i32>{
+  var res: vec2<i32> = subgroupMul(vec2<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..31d04e5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..31d04e5
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.glsl
new file mode 100644
index 0000000..f3c1b94
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55f27a9e7230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..61fa992
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_d584a2 "subgroupMul_d584a2"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v2int %int_1 %int_1
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_d584a2 = OpFunction %v2int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2int Function
+          %9 = OpGroupNonUniformIMul %v2int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2int %subgroupMul_d584a2
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl
new file mode 100644
index 0000000..dd071f0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.spvasm
new file mode 100644
index 0000000..4e71280
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.wgsl
new file mode 100644
index 0000000..9555042
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/d584a2.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl
new file mode 100644
index 0000000..7d0f661
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupMul(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupMul_dc672a() -> vec2<u32>{
+  var res: vec2<u32> = subgroupMul(vec2<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a29a867
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a29a867
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.glsl
new file mode 100644
index 0000000..9344d26
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5598fc2f7230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..68fbd6c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_dc672a "subgroupMul_dc672a"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_dc672a = OpFunction %v2uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2uint Function
+          %9 = OpGroupNonUniformIMul %v2uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v2uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v2uint %subgroupMul_dc672a
+         %21 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl
new file mode 100644
index 0000000..e14a785
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.spvasm
new file mode 100644
index 0000000..723ce79
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.wgsl
new file mode 100644
index 0000000..d71b937
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dc672a.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl
new file mode 100644
index 0000000..fa8936a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupMul(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupMul_dd1333() -> vec4<u32>{
+  var res: vec4<u32> = subgroupMul(vec4<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1adfcaa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1adfcaa
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.glsl
new file mode 100644
index 0000000..be200de
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown builtin method: 0x559e4ef60230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2244b8a
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_dd1333 "subgroupMul_dd1333"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_dd1333 = OpFunction %v4uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4uint Function
+          %9 = OpGroupNonUniformIMul %v4uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v4uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v4uint %subgroupMul_dd1333
+         %21 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl
new file mode 100644
index 0000000..cfcf008
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.spvasm
new file mode 100644
index 0000000..8b32adf
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.wgsl
new file mode 100644
index 0000000..f0df27d
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/dd1333.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl
new file mode 100644
index 0000000..69ccbae
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl
@@ -0,0 +1,57 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupMul(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupMul_f2ac5b() -> vec4<f16>{
+  var res: vec4<f16> = subgroupMul(vec4<f16>(1.h));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..746e8bd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..746e8bd
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.glsl
new file mode 100644
index 0000000..224f72b
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.glsl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5573551d6230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d169a02
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_f2ac5b "subgroupMul_f2ac5b"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %12 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_f2ac5b = OpFunction %v4half None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4half Function
+          %9 = OpGroupNonUniformFMul %v4half %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4half %subgroupMul_f2ac5b
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl
new file mode 100644
index 0000000..ca31b4e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.msl
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.spvasm
new file mode 100644
index 0000000..8c4d090
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.spvasm
@@ -0,0 +1,18 @@
+SKIP: FAILED
+
+
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.wgsl
new file mode 100644
index 0000000..92516a7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f2ac5b.wgsl.expected.wgsl
@@ -0,0 +1,15 @@
+enable subgroups;
+enable subgroups_f16;
+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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl
new file mode 100644
index 0000000..02e3822
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupMul(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupMul_f78398() -> vec2<f32>{
+  var res: vec2<f32> = subgroupMul(vec2<f32>(1.f));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..72c4d6e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..72c4d6e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.glsl
new file mode 100644
index 0000000..3e56db2
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5602e75bf230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e74bf52
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_f78398 "subgroupMul_f78398"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+    %float_1 = OpConstant %float 1
+         %12 = OpConstantComposite %v2float %float_1 %float_1
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_f78398 = OpFunction %v2float None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v2float Function
+          %9 = OpGroupNonUniformFMul %v2float %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v2float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v2float %subgroupMul_f78398
+         %22 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl
new file mode 100644
index 0000000..74d265c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.spvasm
new file mode 100644
index 0000000..ef5ad25
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.wgsl
new file mode 100644
index 0000000..e2fbcb7
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/f78398.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl
new file mode 100644
index 0000000..01e1e5f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupMul(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupMul_fa781b() -> vec3<u32>{
+  var res: vec3<u32> = subgroupMul(vec3<u32>(1u));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..396f278
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..396f278
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.glsl
new file mode 100644
index 0000000..a3e126c
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561707d10230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b069441
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.ir.spvasm
@@ -0,0 +1,48 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_fa781b "subgroupMul_fa781b"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+     %uint_3 = OpConstant %uint 3
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_fa781b = OpFunction %v3uint None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v3uint Function
+          %9 = OpGroupNonUniformIMul %v3uint %uint_3 Reduce %11
+               OpStore %res %9
+         %15 = OpLoad %v3uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %v3uint %subgroupMul_fa781b
+         %21 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl
new file mode 100644
index 0000000..59c2e0e
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.spvasm
new file mode 100644
index 0000000..bcea504
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.wgsl
new file mode 100644
index 0000000..5ba0cd0
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fa781b.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl
new file mode 100644
index 0000000..de3b1ca
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl
@@ -0,0 +1,50 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupMul(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupMul_fab258() -> vec4<i32>{
+  var res: vec4<i32> = subgroupMul(vec4<i32>(1i));
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d244cf6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.dxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d244cf6
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.fxc.hlsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.glsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.glsl
new file mode 100644
index 0000000..95f557f
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.glsl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c8d4965230
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e368728
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.ir.spvasm
@@ -0,0 +1,49 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_fab258 "subgroupMul_fab258"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+      %int_1 = OpConstant %int 1
+         %12 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_fab258 = OpFunction %v4int None %7
+          %8 = OpLabel
+        %res = OpVariable %_ptr_Function_v4int Function
+          %9 = OpGroupNonUniformIMul %v4int %uint_3 Reduce %12
+               OpStore %res %9
+         %16 = OpLoad %v4int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %v4int %subgroupMul_fab258
+         %22 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl
new file mode 100644
index 0000000..14338ac
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.msl
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.spvasm b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.spvasm
new file mode 100644
index 0000000..f6a8324
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.spvasm
@@ -0,0 +1,16 @@
+SKIP: FAILED
+
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.wgsl b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.wgsl
new file mode 100644
index 0000000..6265261
--- /dev/null
+++ b/test/tint/builtins/gen/literal/subgroupMul/fab258.wgsl.expected.wgsl
@@ -0,0 +1,13 @@
+enable subgroups;
+
+@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));
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl
new file mode 100644
index 0000000..44abdc7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupAdd(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupAdd_0dd12a() -> vec3<f16>{
+  var arg_0 = vec3<f16>(1.h);
+  var res: vec3<f16> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..67c5e1a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..67c5e1a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.glsl
new file mode 100644
index 0000000..bec78f5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55f37e46e498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..09d5a07
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_0dd12a "subgroupAdd_0dd12a"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_0dd12a = OpFunction %v3half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3half Function
+        %res = OpVariable %_ptr_Function_v3half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3half %arg_0
+         %14 = OpGroupNonUniformFAdd %v3half %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3half %subgroupAdd_0dd12a
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl
new file mode 100644
index 0000000..63f8572
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.spvasm
new file mode 100644
index 0000000..1df66f8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.wgsl
new file mode 100644
index 0000000..866c6ff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/0dd12a.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_0dd12a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl
new file mode 100644
index 0000000..f6a86b9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupAdd(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupAdd_1280c8() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8ceea8f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8ceea8f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.glsl
new file mode 100644
index 0000000..161ff59
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55b45ab07498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6454991
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_1280c8 "subgroupAdd_1280c8"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_1280c8 = OpFunction %v2uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2uint Function
+        %res = OpVariable %_ptr_Function_v2uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2uint %arg_0
+         %14 = OpGroupNonUniformIAdd %v2uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupAdd_1280c8
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl
new file mode 100644
index 0000000..eb7fe05
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.spvasm
new file mode 100644
index 0000000..fa214e3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.wgsl
new file mode 100644
index 0000000..5965c9a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1280c8.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1280c8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl
new file mode 100644
index 0000000..7e4c4df
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupAdd(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupAdd_1eb429() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..010b8d5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..010b8d5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.glsl
new file mode 100644
index 0000000..22f4fc4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55946b0af498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..99a1652
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_1eb429 "subgroupAdd_1eb429"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_1eb429 = OpFunction %v2int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2int Function
+        %res = OpVariable %_ptr_Function_v2int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2int %arg_0
+         %14 = OpGroupNonUniformIAdd %v2int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupAdd_1eb429
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl
new file mode 100644
index 0000000..89fc8e0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.spvasm
new file mode 100644
index 0000000..b4ed161
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.wgsl
new file mode 100644
index 0000000..24bf129
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/1eb429.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_1eb429();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl
new file mode 100644
index 0000000..35dc012
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupAdd(value: f16) -> f16
+fn subgroupAdd_225207() -> f16{
+  var arg_0 = 1.h;
+  var res: f16 = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a03cfe5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a03cfe5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.glsl
new file mode 100644
index 0000000..a1bdb20
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561b5474e1c0
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..bb09c70
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.ir.spvasm
@@ -0,0 +1,54 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_225207 "subgroupAdd_225207"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+%_ptr_Function_half = OpTypePointer Function %half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_225207 = OpFunction %half None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_half Function
+        %res = OpVariable %_ptr_Function_half Function
+               OpStore %arg_0 %half_0x1p_0
+         %11 = OpLoad %half %arg_0
+         %12 = OpGroupNonUniformFAdd %half %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %half %subgroupAdd_225207
+         %22 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl
new file mode 100644
index 0000000..e32e38c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.spvasm
new file mode 100644
index 0000000..f4708df
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.wgsl
new file mode 100644
index 0000000..6f9cafa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/225207.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_225207();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl
new file mode 100644
index 0000000..703ce46
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupAdd(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupAdd_22d041() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c2863c1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c2863c1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.glsl
new file mode 100644
index 0000000..e472af3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55fb1e161498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..a0cc82d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_22d041 "subgroupAdd_22d041"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_22d041 = OpFunction %v3int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3int Function
+        %res = OpVariable %_ptr_Function_v3int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3int %arg_0
+         %14 = OpGroupNonUniformIAdd %v3int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupAdd_22d041
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl
new file mode 100644
index 0000000..22c1efe
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.spvasm
new file mode 100644
index 0000000..483ef4d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.wgsl
new file mode 100644
index 0000000..ec35a9b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/22d041.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_22d041();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl
new file mode 100644
index 0000000..2450d74
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupAdd(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupAdd_28db2c() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2b140e3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2b140e3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.glsl
new file mode 100644
index 0000000..12c7c20
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55d6fa3e3498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9973971
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_28db2c "subgroupAdd_28db2c"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_28db2c = OpFunction %v4int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4int Function
+        %res = OpVariable %_ptr_Function_v4int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4int %arg_0
+         %14 = OpGroupNonUniformIAdd %v4int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupAdd_28db2c
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl
new file mode 100644
index 0000000..2291caf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.spvasm
new file mode 100644
index 0000000..2d9e663
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.wgsl
new file mode 100644
index 0000000..ddeadb3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/28db2c.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_28db2c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl
new file mode 100644
index 0000000..4cb689b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupAdd(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupAdd_2ab40a() -> vec4<f16>{
+  var arg_0 = vec4<f16>(1.h);
+  var res: vec4<f16> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c3c98c2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c3c98c2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.glsl
new file mode 100644
index 0000000..6916b3f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5555f4340498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..62aa04e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_2ab40a "subgroupAdd_2ab40a"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_2ab40a = OpFunction %v4half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4half Function
+        %res = OpVariable %_ptr_Function_v4half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4half %arg_0
+         %14 = OpGroupNonUniformFAdd %v4half %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4half %subgroupAdd_2ab40a
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl
new file mode 100644
index 0000000..32da36d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.spvasm
new file mode 100644
index 0000000..3b60e2f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.wgsl
new file mode 100644
index 0000000..3f02f03
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/2ab40a.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_2ab40a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl
new file mode 100644
index 0000000..3fe8521
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupAdd(value: f32) -> f32
+fn subgroupAdd_3854ae() -> f32{
+  var arg_0 = 1.f;
+  var res: f32 = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..18ebba9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..18ebba9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.glsl
new file mode 100644
index 0000000..b74e790
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown builtin method: 0x555aee42c1c0
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..96e316e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_3854ae "subgroupAdd_3854ae"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_3854ae = OpFunction %float None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_float Function
+        %res = OpVariable %_ptr_Function_float Function
+               OpStore %arg_0 %float_1
+         %11 = OpLoad %float %arg_0
+         %12 = OpGroupNonUniformFAdd %float %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %float %subgroupAdd_3854ae
+         %22 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl
new file mode 100644
index 0000000..c514cf2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.spvasm
new file mode 100644
index 0000000..4bf0eed
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.wgsl
new file mode 100644
index 0000000..e734b1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/3854ae.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_3854ae();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl
new file mode 100644
index 0000000..9092817
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupAdd(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupAdd_6587ff() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e990a7a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e990a7a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.glsl
new file mode 100644
index 0000000..36b1cf1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown builtin method: 0x564b566c2498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2d8cca7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_6587ff "subgroupAdd_6587ff"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_6587ff = OpFunction %v3uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3uint Function
+        %res = OpVariable %_ptr_Function_v3uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3uint %arg_0
+         %14 = OpGroupNonUniformIAdd %v3uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupAdd_6587ff
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl
new file mode 100644
index 0000000..ebe62fd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.spvasm
new file mode 100644
index 0000000..8ccd432
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.wgsl
new file mode 100644
index 0000000..05e6427
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/6587ff.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_6587ff();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl
new file mode 100644
index 0000000..8f9a254
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupAdd(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupAdd_7d1215() -> vec3<f32>{
+  var arg_0 = vec3<f32>(1.f);
+  var res: vec3<f32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0e48d2f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0e48d2f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.glsl
new file mode 100644
index 0000000..a52d5df
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55bf8e8e2498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1a7857b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_7d1215 "subgroupAdd_7d1215"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_7d1215 = OpFunction %v3float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3float Function
+        %res = OpVariable %_ptr_Function_v3float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3float %arg_0
+         %14 = OpGroupNonUniformFAdd %v3float %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3float %subgroupAdd_7d1215
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl
new file mode 100644
index 0000000..fe19d42
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.spvasm
new file mode 100644
index 0000000..64d19e5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.wgsl
new file mode 100644
index 0000000..185a86a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/7d1215.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_7d1215();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl
new file mode 100644
index 0000000..d6bcd62
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupAdd(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupAdd_8f4c15() -> vec4<f32>{
+  var arg_0 = vec4<f32>(1.f);
+  var res: vec4<f32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5c30b6b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..5c30b6b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.glsl
new file mode 100644
index 0000000..220d2a9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56522e4cc498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..f6c4bd6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_8f4c15 "subgroupAdd_8f4c15"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_8f4c15 = OpFunction %v4float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4float Function
+        %res = OpVariable %_ptr_Function_v4float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4float %arg_0
+         %14 = OpGroupNonUniformFAdd %v4float %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4float %subgroupAdd_8f4c15
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl
new file mode 100644
index 0000000..91d85c7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.spvasm
new file mode 100644
index 0000000..921a70b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.wgsl
new file mode 100644
index 0000000..4d4007c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/8f4c15.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_8f4c15();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl
new file mode 100644
index 0000000..3273f11
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupAdd(value: u32) -> u32
+fn subgroupAdd_b61df7() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2f31034
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2f31034
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.glsl
new file mode 100644
index 0000000..52fd510
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55af5f0241c0
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..efef906
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_b61df7 "subgroupAdd_b61df7"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_b61df7 = OpFunction %uint None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_uint Function
+        %res = OpVariable %_ptr_Function_uint Function
+               OpStore %arg_0 %uint_1
+         %11 = OpLoad %uint %arg_0
+         %12 = OpGroupNonUniformIAdd %uint %uint_3 Reduce %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupAdd_b61df7
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl
new file mode 100644
index 0000000..8f92832
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.spvasm
new file mode 100644
index 0000000..0bfb152
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.wgsl
new file mode 100644
index 0000000..500321d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/b61df7.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_b61df7();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl
new file mode 100644
index 0000000..7b54bc7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupAdd(value: i32) -> i32
+fn subgroupAdd_ba53f9() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..4fba320
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..4fba320
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.glsl
new file mode 100644
index 0000000..c4ee40c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55aba00661c0
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..ef98369
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_ba53f9 "subgroupAdd_ba53f9"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_ba53f9 = OpFunction %int None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_int Function
+        %res = OpVariable %_ptr_Function_int Function
+               OpStore %arg_0 %int_1
+         %11 = OpLoad %int %arg_0
+         %12 = OpGroupNonUniformIAdd %int %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupAdd_ba53f9
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl
new file mode 100644
index 0000000..7b5d0f8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.spvasm
new file mode 100644
index 0000000..9052c8d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.wgsl
new file mode 100644
index 0000000..e16a0bb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/ba53f9.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_ba53f9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl
new file mode 100644
index 0000000..cb7089f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupAdd(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupAdd_cae1ed() -> vec2<f16>{
+  var arg_0 = vec2<f16>(1.h);
+  var res: vec2<f16> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..e318190
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..e318190
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.glsl
new file mode 100644
index 0000000..babbdae
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5566b1a32498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..296d362
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_cae1ed "subgroupAdd_cae1ed"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_cae1ed = OpFunction %v2half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2half Function
+        %res = OpVariable %_ptr_Function_v2half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2half %arg_0
+         %14 = OpGroupNonUniformFAdd %v2half %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2half %subgroupAdd_cae1ed
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl
new file mode 100644
index 0000000..db4dc6f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.spvasm
new file mode 100644
index 0000000..abb00d7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.wgsl
new file mode 100644
index 0000000..35ea3e3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/cae1ed.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_cae1ed();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl
new file mode 100644
index 0000000..a016310
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupAdd(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupAdd_dcf73f() -> vec2<f32>{
+  var arg_0 = vec2<f32>(1.f);
+  var res: vec2<f32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..ef58a9c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..ef58a9c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.glsl
new file mode 100644
index 0000000..af8c0b0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5602751cd498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d633250
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_dcf73f "subgroupAdd_dcf73f"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_dcf73f = OpFunction %v2float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2float Function
+        %res = OpVariable %_ptr_Function_v2float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2float %arg_0
+         %14 = OpGroupNonUniformFAdd %v2float %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2float %subgroupAdd_dcf73f
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl
new file mode 100644
index 0000000..74a2d5a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.spvasm
new file mode 100644
index 0000000..307a053
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.wgsl
new file mode 100644
index 0000000..57e4751
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/dcf73f.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_dcf73f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl
new file mode 100644
index 0000000..68d2266
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupAdd(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupAdd_fbc357() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bd40244
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..bd40244
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.glsl
new file mode 100644
index 0000000..b35e5f25
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558d35130498
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b2b92c7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupAdd_fbc357 "subgroupAdd_fbc357"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupAdd_fbc357 = OpFunction %v4uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4uint Function
+        %res = OpVariable %_ptr_Function_v4uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4uint %arg_0
+         %14 = OpGroupNonUniformIAdd %v4uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupAdd_fbc357
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl
new file mode 100644
index 0000000..f2915ee
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: error: Unknown import method: subgroupAdd
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.spvasm
new file mode 100644
index 0000000..b45755e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.wgsl
new file mode 100644
index 0000000..c2aef0d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupAdd/fbc357.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupAdd_fbc357();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl
new file mode 100644
index 0000000..004ec07
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupExclusiveAdd_01de08() -> vec2<f16>{
+  var arg_0 = vec2<f16>(1.h);
+  var res: vec2<f16> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..23357a9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..23357a9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.glsl
new file mode 100644
index 0000000..7f8f116
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56285a826498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c77e8eb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_01de08 "subgroupExclusiveAdd_01de08"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_01de08 = OpFunction %v2half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2half Function
+        %res = OpVariable %_ptr_Function_v2half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2half %arg_0
+         %14 = OpGroupNonUniformFAdd %v2half %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v2half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2half %subgroupExclusiveAdd_01de08
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl
new file mode 100644
index 0000000..8465ca0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.spvasm
new file mode 100644
index 0000000..b9fd364
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.wgsl
new file mode 100644
index 0000000..2c7b2a4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/01de08.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_01de08();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl
new file mode 100644
index 0000000..89da969
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupExclusiveAdd_0ff95a() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2c38a5d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2c38a5d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.glsl
new file mode 100644
index 0000000..0eeca42
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55a06c1ae498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4707d54
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_0ff95a "subgroupExclusiveAdd_0ff95a"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_0ff95a = OpFunction %v3uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3uint Function
+        %res = OpVariable %_ptr_Function_v3uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3uint %arg_0
+         %14 = OpGroupNonUniformIAdd %v3uint %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupExclusiveAdd_0ff95a
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
new file mode 100644
index 0000000..a3d2cc1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.spvasm
new file mode 100644
index 0000000..0ad2889
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.wgsl
new file mode 100644
index 0000000..1b2db54
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/0ff95a.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_0ff95a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl
new file mode 100644
index 0000000..8e504cb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupExclusiveAdd_406ab4() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..960112b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..960112b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.glsl
new file mode 100644
index 0000000..d7d5776
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55719630d498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..b82b0b1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_406ab4 "subgroupExclusiveAdd_406ab4"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_406ab4 = OpFunction %v4int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4int Function
+        %res = OpVariable %_ptr_Function_v4int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4int %arg_0
+         %14 = OpGroupNonUniformIAdd %v4int %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupExclusiveAdd_406ab4
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
new file mode 100644
index 0000000..3abc1a2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.spvasm
new file mode 100644
index 0000000..bfdb00c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.wgsl
new file mode 100644
index 0000000..e0dadd9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/406ab4.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_406ab4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl
new file mode 100644
index 0000000..670475c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupExclusiveAdd_41cfde() -> vec3<f32>{
+  var arg_0 = vec3<f32>(1.f);
+  var res: vec3<f32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c871f46
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c871f46
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.glsl
new file mode 100644
index 0000000..ad2ca51
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown builtin method: 0x559892947498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..dfa9503
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_41cfde "subgroupExclusiveAdd_41cfde"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_41cfde = OpFunction %v3float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3float Function
+        %res = OpVariable %_ptr_Function_v3float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3float %arg_0
+         %14 = OpGroupNonUniformFAdd %v3float %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v3float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3float %subgroupExclusiveAdd_41cfde
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
new file mode 100644
index 0000000..be32974
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.spvasm
new file mode 100644
index 0000000..6aab45e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.wgsl
new file mode 100644
index 0000000..4d60979
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/41cfde.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_41cfde();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl
new file mode 100644
index 0000000..7aa6753
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupExclusiveAdd(value: u32) -> u32
+fn subgroupExclusiveAdd_42684c() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8899c08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8899c08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.glsl
new file mode 100644
index 0000000..21dad03
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ac6c5a21c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2c0c3b6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_42684c "subgroupExclusiveAdd_42684c"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_42684c = OpFunction %uint None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_uint Function
+        %res = OpVariable %_ptr_Function_uint Function
+               OpStore %arg_0 %uint_1
+         %11 = OpLoad %uint %arg_0
+         %12 = OpGroupNonUniformIAdd %uint %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupExclusiveAdd_42684c
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl
new file mode 100644
index 0000000..3fe11de
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.spvasm
new file mode 100644
index 0000000..1d06a32
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.wgsl
new file mode 100644
index 0000000..22763e2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/42684c.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_42684c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl
new file mode 100644
index 0000000..21cbc54
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupExclusiveAdd_48acea() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d87599c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d87599c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.glsl
new file mode 100644
index 0000000..da873ec
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561a7c779498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..900d532
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_48acea "subgroupExclusiveAdd_48acea"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_48acea = OpFunction %v2uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2uint Function
+        %res = OpVariable %_ptr_Function_v2uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2uint %arg_0
+         %14 = OpGroupNonUniformIAdd %v2uint %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupExclusiveAdd_48acea
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl
new file mode 100644
index 0000000..26eab9d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.spvasm
new file mode 100644
index 0000000..92557df
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.wgsl
new file mode 100644
index 0000000..6666825
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/48acea.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_48acea();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl
new file mode 100644
index 0000000..6aa312a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupExclusiveAdd(value: f16) -> f16
+fn subgroupExclusiveAdd_4a1568() -> f16{
+  var arg_0 = 1.h;
+  var res: f16 = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..668d020
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..668d020
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.glsl
new file mode 100644
index 0000000..5bd9574
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5562d2ee61c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5b77ea1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.ir.spvasm
@@ -0,0 +1,54 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_4a1568 "subgroupExclusiveAdd_4a1568"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+%_ptr_Function_half = OpTypePointer Function %half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_4a1568 = OpFunction %half None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_half Function
+        %res = OpVariable %_ptr_Function_half Function
+               OpStore %arg_0 %half_0x1p_0
+         %11 = OpLoad %half %arg_0
+         %12 = OpGroupNonUniformFAdd %half %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %16 = OpLoad %half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %half %subgroupExclusiveAdd_4a1568
+         %22 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
new file mode 100644
index 0000000..bd94553
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.spvasm
new file mode 100644
index 0000000..214dd22
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.wgsl
new file mode 100644
index 0000000..c545af7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4a1568.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4a1568();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl
new file mode 100644
index 0000000..24eab59
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupExclusiveAdd_4c8024() -> vec2<f32>{
+  var arg_0 = vec2<f32>(1.f);
+  var res: vec2<f32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..d185b85
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..d185b85
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.glsl
new file mode 100644
index 0000000..f18aee8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5557cf2e8498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..268b0c1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_4c8024 "subgroupExclusiveAdd_4c8024"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_4c8024 = OpFunction %v2float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2float Function
+        %res = OpVariable %_ptr_Function_v2float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2float %arg_0
+         %14 = OpGroupNonUniformFAdd %v2float %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v2float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2float %subgroupExclusiveAdd_4c8024
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
new file mode 100644
index 0000000..f2f27f8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.spvasm
new file mode 100644
index 0000000..8a393de
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.wgsl
new file mode 100644
index 0000000..31fb327
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/4c8024.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_4c8024();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl
new file mode 100644
index 0000000..bf42d39
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupExclusiveAdd_71ad0f() -> vec4<f32>{
+  var arg_0 = vec4<f32>(1.f);
+  var res: vec4<f32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2e815e7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2e815e7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.glsl
new file mode 100644
index 0000000..d80085c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558ce57b7498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..17268f3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_71ad0f "subgroupExclusiveAdd_71ad0f"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_71ad0f = OpFunction %v4float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4float Function
+        %res = OpVariable %_ptr_Function_v4float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4float %arg_0
+         %14 = OpGroupNonUniformFAdd %v4float %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v4float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4float %subgroupExclusiveAdd_71ad0f
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
new file mode 100644
index 0000000..3b41db4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.spvasm
new file mode 100644
index 0000000..2d47642
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.wgsl
new file mode 100644
index 0000000..c56ce34
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/71ad0f.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_71ad0f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl
new file mode 100644
index 0000000..e9f6325
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupExclusiveAdd_95e984() -> vec4<f16>{
+  var arg_0 = vec4<f16>(1.h);
+  var res: vec4<f16> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f369a10
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f369a10
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.glsl
new file mode 100644
index 0000000..99b2bbf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55aefb5c8498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..101cedb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_95e984 "subgroupExclusiveAdd_95e984"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_95e984 = OpFunction %v4half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4half Function
+        %res = OpVariable %_ptr_Function_v4half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4half %arg_0
+         %14 = OpGroupNonUniformFAdd %v4half %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v4half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4half %subgroupExclusiveAdd_95e984
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl
new file mode 100644
index 0000000..03f0913
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.spvasm
new file mode 100644
index 0000000..6353f24
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.wgsl
new file mode 100644
index 0000000..c2137ba
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/95e984.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_95e984();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl
new file mode 100644
index 0000000..f8a412d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupExclusiveAdd(value: f32) -> f32
+fn subgroupExclusiveAdd_967e38() -> f32{
+  var arg_0 = 1.f;
+  var res: f32 = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..765bafd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..765bafd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.glsl
new file mode 100644
index 0000000..869a7e5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55e4355c61c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..64e26e5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_967e38 "subgroupExclusiveAdd_967e38"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_967e38 = OpFunction %float None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_float Function
+        %res = OpVariable %_ptr_Function_float Function
+               OpStore %arg_0 %float_1
+         %11 = OpLoad %float %arg_0
+         %12 = OpGroupNonUniformFAdd %float %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %16 = OpLoad %float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %float %subgroupExclusiveAdd_967e38
+         %22 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl
new file mode 100644
index 0000000..f1eaf40
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.spvasm
new file mode 100644
index 0000000..49e5f61
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.wgsl
new file mode 100644
index 0000000..2268fcc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/967e38.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_967e38();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl
new file mode 100644
index 0000000..47f5f56
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupExclusiveAdd(value: i32) -> i32
+fn subgroupExclusiveAdd_b0c261() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..bbcfeb7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..bbcfeb7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.glsl
new file mode 100644
index 0000000..0b73cc9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55cff0f391c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..0acd590
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_b0c261 "subgroupExclusiveAdd_b0c261"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_b0c261 = OpFunction %int None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_int Function
+        %res = OpVariable %_ptr_Function_int Function
+               OpStore %arg_0 %int_1
+         %11 = OpLoad %int %arg_0
+         %12 = OpGroupNonUniformIAdd %int %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupExclusiveAdd_b0c261
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
new file mode 100644
index 0000000..5abe3d9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.spvasm
new file mode 100644
index 0000000..86e2147
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.wgsl
new file mode 100644
index 0000000..7bd9a71
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/b0c261.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_b0c261();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl
new file mode 100644
index 0000000..ef2cbb6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupExclusiveAdd_c08160() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..461164a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..461164a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.glsl
new file mode 100644
index 0000000..fbcc083
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown builtin method: 0x563e505b2498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d164307
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_c08160 "subgroupExclusiveAdd_c08160"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_c08160 = OpFunction %v3int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3int Function
+        %res = OpVariable %_ptr_Function_v3int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3int %arg_0
+         %14 = OpGroupNonUniformIAdd %v3int %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupExclusiveAdd_c08160
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl
new file mode 100644
index 0000000..be2ef8a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.spvasm
new file mode 100644
index 0000000..19bc7f0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.wgsl
new file mode 100644
index 0000000..03bb9b0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/c08160.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_c08160();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl
new file mode 100644
index 0000000..615b2be
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupExclusiveAdd(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupExclusiveAdd_e58e23() -> vec3<f16>{
+  var arg_0 = vec3<f16>(1.h);
+  var res: vec3<f16> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6f17795
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6f17795
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.glsl
new file mode 100644
index 0000000..973c065
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558ff6290498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..31be3ad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_e58e23 "subgroupExclusiveAdd_e58e23"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_e58e23 = OpFunction %v3half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3half Function
+        %res = OpVariable %_ptr_Function_v3half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3half %arg_0
+         %14 = OpGroupNonUniformFAdd %v3half %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v3half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3half %subgroupExclusiveAdd_e58e23
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
new file mode 100644
index 0000000..7ab69fc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.spvasm
new file mode 100644
index 0000000..fcf8833
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.wgsl
new file mode 100644
index 0000000..f721dfa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/e58e23.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_e58e23();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl
new file mode 100644
index 0000000..69ea42c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupExclusiveAdd_ec300f() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..3bd8fda
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..3bd8fda
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.glsl
new file mode 100644
index 0000000..e07cfba
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown builtin method: 0x559ae072e498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d994ed5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_ec300f "subgroupExclusiveAdd_ec300f"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_ec300f = OpFunction %v4uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4uint Function
+        %res = OpVariable %_ptr_Function_v4uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4uint %arg_0
+         %14 = OpGroupNonUniformIAdd %v4uint %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupExclusiveAdd_ec300f
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
new file mode 100644
index 0000000..3566b44
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.spvasm
new file mode 100644
index 0000000..f8f5204
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.wgsl
new file mode 100644
index 0000000..5be5e9d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/ec300f.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_ec300f();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl
new file mode 100644
index 0000000..9dceb5b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupExclusiveAdd(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupExclusiveAdd_f0f712() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupExclusiveAdd(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..65d99ca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..65d99ca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.glsl
new file mode 100644
index 0000000..f47dbb1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ea4fc49498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..835ab8e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveAdd_f0f712 "subgroupExclusiveAdd_f0f712"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveAdd_f0f712 = OpFunction %v2int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2int Function
+        %res = OpVariable %_ptr_Function_v2int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2int %arg_0
+         %14 = OpGroupNonUniformIAdd %v2int %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupExclusiveAdd_f0f712
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
new file mode 100644
index 0000000..c09fb2e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveAdd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.spvasm
new file mode 100644
index 0000000..d2d1644
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.wgsl
new file mode 100644
index 0000000..7638459
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveAdd/f0f712.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveAdd_f0f712();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl
new file mode 100644
index 0000000..edc81eb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupExclusiveMul_000b92() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..8077fe1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..8077fe1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.glsl
new file mode 100644
index 0000000..7e8ca25
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ad0f807498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..13241ac
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_000b92 "subgroupExclusiveMul_000b92"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_000b92 = OpFunction %v4uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4uint Function
+        %res = OpVariable %_ptr_Function_v4uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4uint %arg_0
+         %14 = OpGroupNonUniformIMul %v4uint %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupExclusiveMul_000b92
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl
new file mode 100644
index 0000000..61bfb7f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.spvasm
new file mode 100644
index 0000000..46df7a8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.wgsl
new file mode 100644
index 0000000..52ac098
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/000b92.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_000b92();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl
new file mode 100644
index 0000000..6935c6f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupExclusiveMul_019660() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..903fc46
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..903fc46
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.glsl
new file mode 100644
index 0000000..9b9823c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55a5e9c4d498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..bfec245
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_019660 "subgroupExclusiveMul_019660"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_019660 = OpFunction %v4int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4int Function
+        %res = OpVariable %_ptr_Function_v4int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4int %arg_0
+         %14 = OpGroupNonUniformIMul %v4int %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupExclusiveMul_019660
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl
new file mode 100644
index 0000000..f5b82ff
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.spvasm
new file mode 100644
index 0000000..9a347c8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.wgsl
new file mode 100644
index 0000000..3f9d6f6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/019660.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_019660();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl
new file mode 100644
index 0000000..a6efd4a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupExclusiveMul_0a04d5() -> vec3<f32>{
+  var arg_0 = vec3<f32>(1.f);
+  var res: vec3<f32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f555773
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f555773
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.glsl
new file mode 100644
index 0000000..ea74266
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown builtin method: 0x556f4f9bb498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..90c0079
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_0a04d5 "subgroupExclusiveMul_0a04d5"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_0a04d5 = OpFunction %v3float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3float Function
+        %res = OpVariable %_ptr_Function_v3float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3float %arg_0
+         %14 = OpGroupNonUniformFMul %v3float %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v3float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3float %subgroupExclusiveMul_0a04d5
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
new file mode 100644
index 0000000..312b6ac
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.spvasm
new file mode 100644
index 0000000..05b3b38
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.wgsl
new file mode 100644
index 0000000..fac07aa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/0a04d5.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_0a04d5();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl
new file mode 100644
index 0000000..f69e7e1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupExclusiveMul_13ba26() -> vec3<f16>{
+  var arg_0 = vec3<f16>(1.h);
+  var res: vec3<f16> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2113d1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2113d1c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.glsl
new file mode 100644
index 0000000..6046b8a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561956f6a498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..ab1a320
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_13ba26 "subgroupExclusiveMul_13ba26"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_13ba26 = OpFunction %v3half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3half Function
+        %res = OpVariable %_ptr_Function_v3half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3half %arg_0
+         %14 = OpGroupNonUniformFMul %v3half %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v3half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3half %subgroupExclusiveMul_13ba26
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl
new file mode 100644
index 0000000..8e249c8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.spvasm
new file mode 100644
index 0000000..ba603b3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.wgsl
new file mode 100644
index 0000000..e578d2e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/13ba26.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_13ba26();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl
new file mode 100644
index 0000000..086f855
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupExclusiveMul_25d1b9() -> vec2<f32>{
+  var arg_0 = vec2<f32>(1.f);
+  var res: vec2<f32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..a24737c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..a24737c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.glsl
new file mode 100644
index 0000000..22aa42b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558e0d30e498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..19841fe
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_25d1b9 "subgroupExclusiveMul_25d1b9"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_25d1b9 = OpFunction %v2float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2float Function
+        %res = OpVariable %_ptr_Function_v2float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2float %arg_0
+         %14 = OpGroupNonUniformFMul %v2float %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v2float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2float %subgroupExclusiveMul_25d1b9
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
new file mode 100644
index 0000000..9de1725
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.spvasm
new file mode 100644
index 0000000..e39ebc5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.wgsl
new file mode 100644
index 0000000..94c2622
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/25d1b9.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_25d1b9();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl
new file mode 100644
index 0000000..a55c613
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupExclusiveMul_4525a3() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..59aeba3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..59aeba3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.glsl
new file mode 100644
index 0000000..8af1063
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown builtin method: 0x557707c4d498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..75282e9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_4525a3 "subgroupExclusiveMul_4525a3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_4525a3 = OpFunction %v2int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2int Function
+        %res = OpVariable %_ptr_Function_v2int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2int %arg_0
+         %14 = OpGroupNonUniformIMul %v2int %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupExclusiveMul_4525a3
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl
new file mode 100644
index 0000000..ddf8812
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.spvasm
new file mode 100644
index 0000000..43fa5b7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.wgsl
new file mode 100644
index 0000000..7478681
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/4525a3.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_4525a3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl
new file mode 100644
index 0000000..100e4c3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupExclusiveMul(value: f16) -> f16
+fn subgroupExclusiveMul_6f431e() -> f16{
+  var arg_0 = 1.h;
+  var res: f16 = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..834420a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..834420a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.glsl
new file mode 100644
index 0000000..e346be2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ff1110e1c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..54d81b8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.ir.spvasm
@@ -0,0 +1,54 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_6f431e "subgroupExclusiveMul_6f431e"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+%_ptr_Function_half = OpTypePointer Function %half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_6f431e = OpFunction %half None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_half Function
+        %res = OpVariable %_ptr_Function_half Function
+               OpStore %arg_0 %half_0x1p_0
+         %11 = OpLoad %half %arg_0
+         %12 = OpGroupNonUniformFMul %half %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %16 = OpLoad %half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %half %subgroupExclusiveMul_6f431e
+         %22 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl
new file mode 100644
index 0000000..c968d5c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.spvasm
new file mode 100644
index 0000000..35f5216
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.wgsl
new file mode 100644
index 0000000..44f49b0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/6f431e.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_6f431e();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl
new file mode 100644
index 0000000..2170ef6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupExclusiveMul_7b5f57() -> vec4<f32>{
+  var arg_0 = vec4<f32>(1.f);
+  var res: vec4<f32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b76dca3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b76dca3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.glsl
new file mode 100644
index 0000000..5022e47
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56405c4ee498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..505754f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_7b5f57 "subgroupExclusiveMul_7b5f57"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_7b5f57 = OpFunction %v4float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4float Function
+        %res = OpVariable %_ptr_Function_v4float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4float %arg_0
+         %14 = OpGroupNonUniformFMul %v4float %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v4float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4float %subgroupExclusiveMul_7b5f57
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
new file mode 100644
index 0000000..411d1eb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.spvasm
new file mode 100644
index 0000000..ff10e3e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.wgsl
new file mode 100644
index 0000000..adbfaa9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/7b5f57.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_7b5f57();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl
new file mode 100644
index 0000000..74f856f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupExclusiveMul_87f23e() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..0a07cd1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..0a07cd1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.glsl
new file mode 100644
index 0000000..8abf126
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown builtin method: 0x559158a7b498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..c3930f8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_87f23e "subgroupExclusiveMul_87f23e"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_87f23e = OpFunction %v3int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3int Function
+        %res = OpVariable %_ptr_Function_v3int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3int %arg_0
+         %14 = OpGroupNonUniformIMul %v3int %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupExclusiveMul_87f23e
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl
new file mode 100644
index 0000000..2625eeb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.spvasm
new file mode 100644
index 0000000..27a82c3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.wgsl
new file mode 100644
index 0000000..283dc48
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/87f23e.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_87f23e();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl
new file mode 100644
index 0000000..0af0217
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupExclusiveMul(value: f32) -> f32
+fn subgroupExclusiveMul_98b2e4() -> f32{
+  var arg_0 = 1.f;
+  var res: f32 = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9225c29
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9225c29
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.glsl
new file mode 100644
index 0000000..8664630
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55e68cc5f1c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..9a6aab1
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_98b2e4 "subgroupExclusiveMul_98b2e4"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_98b2e4 = OpFunction %float None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_float Function
+        %res = OpVariable %_ptr_Function_float Function
+               OpStore %arg_0 %float_1
+         %11 = OpLoad %float %arg_0
+         %12 = OpGroupNonUniformFMul %float %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %16 = OpLoad %float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %float %subgroupExclusiveMul_98b2e4
+         %22 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
new file mode 100644
index 0000000..6f57f57
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.spvasm
new file mode 100644
index 0000000..1176d69
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.wgsl
new file mode 100644
index 0000000..fcff88d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/98b2e4.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_98b2e4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl
new file mode 100644
index 0000000..1d4161f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupExclusiveMul(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupExclusiveMul_a07956() -> vec4<f16>{
+  var arg_0 = vec4<f16>(1.h);
+  var res: vec4<f16> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..415e1c8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..415e1c8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.glsl
new file mode 100644
index 0000000..46724e7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown builtin method: 0x562a65679498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..8578f53
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_a07956 "subgroupExclusiveMul_a07956"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_a07956 = OpFunction %v4half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4half Function
+        %res = OpVariable %_ptr_Function_v4half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4half %arg_0
+         %14 = OpGroupNonUniformFMul %v4half %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v4half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4half %subgroupExclusiveMul_a07956
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl
new file mode 100644
index 0000000..e854a59
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.spvasm
new file mode 100644
index 0000000..eaea123
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.wgsl
new file mode 100644
index 0000000..3863fba
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a07956.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a07956();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl
new file mode 100644
index 0000000..cde0de0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupExclusiveMul(value: i32) -> i32
+fn subgroupExclusiveMul_a23002() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..f5e56c7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..f5e56c7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.glsl
new file mode 100644
index 0000000..0a64c93
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55f26f1e01c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5171785
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_a23002 "subgroupExclusiveMul_a23002"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_a23002 = OpFunction %int None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_int Function
+        %res = OpVariable %_ptr_Function_int Function
+               OpStore %arg_0 %int_1
+         %11 = OpLoad %int %arg_0
+         %12 = OpGroupNonUniformIMul %int %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupExclusiveMul_a23002
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl
new file mode 100644
index 0000000..f426a9f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.spvasm
new file mode 100644
index 0000000..5406dca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.wgsl
new file mode 100644
index 0000000..3fe8ce7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/a23002.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_a23002();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl
new file mode 100644
index 0000000..a715ab2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupExclusiveMul_d1d490() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..09b7cad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..09b7cad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.glsl
new file mode 100644
index 0000000..498c555
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown builtin method: 0x560cebc18498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..cb16d42
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_d1d490 "subgroupExclusiveMul_d1d490"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_d1d490 = OpFunction %v2uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2uint Function
+        %res = OpVariable %_ptr_Function_v2uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2uint %arg_0
+         %14 = OpGroupNonUniformIMul %v2uint %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupExclusiveMul_d1d490
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl
new file mode 100644
index 0000000..6910712
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.spvasm
new file mode 100644
index 0000000..d028baa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.wgsl
new file mode 100644
index 0000000..deae988
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/d1d490.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_d1d490();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl
new file mode 100644
index 0000000..2a9c561
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupExclusiveMul(value: u32) -> u32
+fn subgroupExclusiveMul_dc51f8() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..943b22d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..943b22d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.glsl
new file mode 100644
index 0000000..95e8d56
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown builtin method: 0x555e0184a1c0
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..4371ff8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_dc51f8 "subgroupExclusiveMul_dc51f8"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_dc51f8 = OpFunction %uint None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_uint Function
+        %res = OpVariable %_ptr_Function_uint Function
+               OpStore %arg_0 %uint_1
+         %11 = OpLoad %uint %arg_0
+         %12 = OpGroupNonUniformIMul %uint %uint_3 ExclusiveScan %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupExclusiveMul_dc51f8
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
new file mode 100644
index 0000000..2b41b7d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.spvasm
new file mode 100644
index 0000000..37bb095
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.wgsl
new file mode 100644
index 0000000..9b1e24b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/dc51f8.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_dc51f8();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl
new file mode 100644
index 0000000..b7eef93
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupExclusiveMul(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupExclusiveMul_e88d1c() -> vec2<f16>{
+  var arg_0 = vec2<f16>(1.h);
+  var res: vec2<f16> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..5af7543
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..5af7543
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.glsl
new file mode 100644
index 0000000..365ebd7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55b7c2e97498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..60ddc02
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_e88d1c "subgroupExclusiveMul_e88d1c"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_e88d1c = OpFunction %v2half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2half Function
+        %res = OpVariable %_ptr_Function_v2half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2half %arg_0
+         %14 = OpGroupNonUniformFMul %v2half %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %18 = OpLoad %v2half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2half %subgroupExclusiveMul_e88d1c
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
new file mode 100644
index 0000000..3e97a2f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.spvasm
new file mode 100644
index 0000000..878c15f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.wgsl
new file mode 100644
index 0000000..6854af4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/e88d1c.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_e88d1c();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl
new file mode 100644
index 0000000..c3f8f80
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupExclusiveMul(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupExclusiveMul_f039f4() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupExclusiveMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..356cf8c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..356cf8c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.glsl
new file mode 100644
index 0000000..21425e2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55a89b4c4498
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..870fbbc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupExclusiveMul_f039f4 "subgroupExclusiveMul_f039f4"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupExclusiveMul_f039f4 = OpFunction %v3uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3uint Function
+        %res = OpVariable %_ptr_Function_v3uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3uint %arg_0
+         %14 = OpGroupNonUniformIMul %v3uint %uint_3 ExclusiveScan %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupExclusiveMul_f039f4
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl
new file mode 100644
index 0000000..fff2956
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: error: Unknown import method: subgroupExclusiveMul
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.spvasm
new file mode 100644
index 0000000..fb69a0d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.wgsl
new file mode 100644
index 0000000..0f8a49f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupExclusiveMul/f039f4.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupExclusiveMul_f039f4();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl
new file mode 100644
index 0000000..116be2c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f32;
+
+
+// fn subgroupMul(value: f32) -> f32
+fn subgroupMul_0de9d3() -> f32{
+  var arg_0 = 1.f;
+  var res: f32 = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..186db08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..186db08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.glsl
new file mode 100644
index 0000000..776a290
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5652d5c8e1c0
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5b5dd5d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_0de9d3 "subgroupMul_0de9d3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+%tint_symbol_1 = OpTypeStruct %float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %float
+%_ptr_Function_float = OpTypePointer Function %float
+    %float_1 = OpConstant %float 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_0de9d3 = OpFunction %float None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_float Function
+        %res = OpVariable %_ptr_Function_float Function
+               OpStore %arg_0 %float_1
+         %11 = OpLoad %float %arg_0
+         %12 = OpGroupNonUniformFMul %float %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %float %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %float %subgroupMul_0de9d3
+         %22 = OpAccessChain %_ptr_StorageBuffer_float %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl
new file mode 100644
index 0000000..9f88e9f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.spvasm
new file mode 100644
index 0000000..f680508
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.wgsl
new file mode 100644
index 0000000..de750ce
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/0de9d3.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_0de9d3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl
new file mode 100644
index 0000000..c295e47
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : f16;
+
+
+// fn subgroupMul(value: f16) -> f16
+fn subgroupMul_2941a2() -> f16{
+  var arg_0 = 1.h;
+  var res: f16 = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c2279ea
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c2279ea
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.glsl
new file mode 100644
index 0000000..2cbfd33
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5589c34621c0
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1db82c2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.ir.spvasm
@@ -0,0 +1,54 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_2941a2 "subgroupMul_2941a2"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+%tint_symbol_1 = OpTypeStruct %half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %half
+%_ptr_Function_half = OpTypePointer Function %half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_half = OpTypePointer StorageBuffer %half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_2941a2 = OpFunction %half None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_half Function
+        %res = OpVariable %_ptr_Function_half Function
+               OpStore %arg_0 %half_0x1p_0
+         %11 = OpLoad %half %arg_0
+         %12 = OpGroupNonUniformFMul %half %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %half %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %half %subgroupMul_2941a2
+         %22 = OpAccessChain %_ptr_StorageBuffer_half %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl
new file mode 100644
index 0000000..d552977
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.spvasm
new file mode 100644
index 0000000..6840707
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.wgsl
new file mode 100644
index 0000000..f37a7f7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/2941a2.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_2941a2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl
new file mode 100644
index 0000000..c2cebd3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : i32;
+
+
+// fn subgroupMul(value: i32) -> i32
+fn subgroupMul_3fe886() -> i32{
+  var arg_0 = 1i;
+  var res: i32 = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..85f489c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..85f489c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.glsl
new file mode 100644
index 0000000..3bffb0a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown builtin method: 0x56028c5131c0
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..397ec3a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.ir.spvasm
@@ -0,0 +1,51 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 25
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_3fe886 "subgroupMul_3fe886"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+%tint_symbol_1 = OpTypeStruct %int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %int
+%_ptr_Function_int = OpTypePointer Function %int
+      %int_1 = OpConstant %int 1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %19 = OpTypeFunction %void
+%_ptr_StorageBuffer_int = OpTypePointer StorageBuffer %int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_3fe886 = OpFunction %int None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_int Function
+        %res = OpVariable %_ptr_Function_int Function
+               OpStore %arg_0 %int_1
+         %11 = OpLoad %int %arg_0
+         %12 = OpGroupNonUniformIMul %int %uint_3 Reduce %11
+               OpStore %res %12
+         %16 = OpLoad %int %res
+               OpReturnValue %16
+               OpFunctionEnd
+%compute_main = OpFunction %void None %19
+         %20 = OpLabel
+         %21 = OpFunctionCall %int %subgroupMul_3fe886
+         %22 = OpAccessChain %_ptr_StorageBuffer_int %1 %uint_0
+               OpStore %22 %21
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl
new file mode 100644
index 0000000..65b222f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.spvasm
new file mode 100644
index 0000000..489a9a3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.wgsl
new file mode 100644
index 0000000..c06f0b8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/3fe886.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_3fe886();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl
new file mode 100644
index 0000000..8e682e9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : u32;
+
+
+// fn subgroupMul(value: u32) -> u32
+fn subgroupMul_4f8ee6() -> u32{
+  var arg_0 = 1u;
+  var res: u32 = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1e59b2d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1e59b2d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.glsl
new file mode 100644
index 0000000..1355671
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown builtin method: 0x563a0811d1c0
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5708853
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.ir.spvasm
@@ -0,0 +1,50 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 24
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_4f8ee6 "subgroupMul_4f8ee6"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+%tint_symbol_1 = OpTypeStruct %uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %6 = OpTypeFunction %uint
+%_ptr_Function_uint = OpTypePointer Function %uint
+     %uint_1 = OpConstant %uint 1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %18 = OpTypeFunction %void
+%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_4f8ee6 = OpFunction %uint None %6
+          %7 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_uint Function
+        %res = OpVariable %_ptr_Function_uint Function
+               OpStore %arg_0 %uint_1
+         %11 = OpLoad %uint %arg_0
+         %12 = OpGroupNonUniformIMul %uint %uint_3 Reduce %11
+               OpStore %res %12
+         %15 = OpLoad %uint %res
+               OpReturnValue %15
+               OpFunctionEnd
+%compute_main = OpFunction %void None %18
+         %19 = OpLabel
+         %20 = OpFunctionCall %uint %subgroupMul_4f8ee6
+         %21 = OpAccessChain %_ptr_StorageBuffer_uint %1 %uint_0
+               OpStore %21 %20
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl
new file mode 100644
index 0000000..b5fbc62
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.spvasm
new file mode 100644
index 0000000..5310a1f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.wgsl
new file mode 100644
index 0000000..0ec9f44
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/4f8ee6.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_4f8ee6();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl
new file mode 100644
index 0000000..e21be2a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f16>;
+
+
+// fn subgroupMul(value: vec<3, f16>) -> vec<3, f16>
+fn subgroupMul_53aee2() -> vec3<f16>{
+  var arg_0 = vec3<f16>(1.h);
+  var res: vec3<f16> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..966c32c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..966c32c
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.glsl
new file mode 100644
index 0000000..b66f499
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown builtin method: 0x555836574498
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..6d15028
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_53aee2 "subgroupMul_53aee2"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v3half = OpTypeVector %half 3
+%tint_symbol_1 = OpTypeStruct %v3half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3half
+%_ptr_Function_v3half = OpTypePointer Function %v3half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v3half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3half = OpTypePointer StorageBuffer %v3half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_53aee2 = OpFunction %v3half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3half Function
+        %res = OpVariable %_ptr_Function_v3half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3half %arg_0
+         %14 = OpGroupNonUniformFMul %v3half %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3half %subgroupMul_53aee2
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl
new file mode 100644
index 0000000..e557cd2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.spvasm
new file mode 100644
index 0000000..15846deb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.wgsl
new file mode 100644
index 0000000..3a3b549
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/53aee2.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_53aee2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl
new file mode 100644
index 0000000..1f9dece
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<i32>;
+
+
+// fn subgroupMul(value: vec<3, i32>) -> vec<3, i32>
+fn subgroupMul_5a8c86() -> vec3<i32>{
+  var arg_0 = vec3<i32>(1i);
+  var res: vec3<i32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..004d4a7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..004d4a7
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.glsl
new file mode 100644
index 0000000..3122f6b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55ece80b8498
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..eb63ab5
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_5a8c86 "subgroupMul_5a8c86"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%tint_symbol_1 = OpTypeStruct %v3int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3int
+%_ptr_Function_v3int = OpTypePointer Function %v3int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v3int %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3int = OpTypePointer StorageBuffer %v3int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_5a8c86 = OpFunction %v3int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3int Function
+        %res = OpVariable %_ptr_Function_v3int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3int %arg_0
+         %14 = OpGroupNonUniformIMul %v3int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3int %subgroupMul_5a8c86
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl
new file mode 100644
index 0000000..bbbeffa
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.spvasm
new file mode 100644
index 0000000..248cde4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.wgsl
new file mode 100644
index 0000000..1ac3e08
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/5a8c86.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_5a8c86();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl
new file mode 100644
index 0000000..0ddf3cc
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f32>;
+
+
+// fn subgroupMul(value: vec<4, f32>) -> vec<4, f32>
+fn subgroupMul_66c813() -> vec4<f32>{
+  var arg_0 = vec4<f32>(1.f);
+  var res: vec4<f32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..6eb5b59
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..6eb5b59
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.glsl
new file mode 100644
index 0000000..0d19e59
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c0b5031498
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..1efcf37
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_66c813 "subgroupMul_66c813"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v4float = OpTypeVector %float 4
+%tint_symbol_1 = OpTypeStruct %v4float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4float
+%_ptr_Function_v4float = OpTypePointer Function %v4float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4float = OpTypePointer StorageBuffer %v4float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_66c813 = OpFunction %v4float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4float Function
+        %res = OpVariable %_ptr_Function_v4float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4float %arg_0
+         %14 = OpGroupNonUniformFMul %v4float %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4float %subgroupMul_66c813
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl
new file mode 100644
index 0000000..a8affac
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.spvasm
new file mode 100644
index 0000000..24e75ba
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.wgsl
new file mode 100644
index 0000000..c0131ca
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/66c813.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_66c813();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl
new file mode 100644
index 0000000..dabbad9
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f16>;
+
+
+// fn subgroupMul(value: vec<2, f16>) -> vec<2, f16>
+fn subgroupMul_6aaaf3() -> vec2<f16>{
+  var arg_0 = vec2<f16>(1.h);
+  var res: vec2<f16> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..14c275e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..14c275e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.glsl
new file mode 100644
index 0000000..90909c6
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown builtin method: 0x561f79118498
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..2ed763a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_6aaaf3 "subgroupMul_6aaaf3"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v2half = OpTypeVector %half 2
+%tint_symbol_1 = OpTypeStruct %v2half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2half
+%_ptr_Function_v2half = OpTypePointer Function %v2half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v2half %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2half = OpTypePointer StorageBuffer %v2half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_6aaaf3 = OpFunction %v2half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2half Function
+        %res = OpVariable %_ptr_Function_v2half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2half %arg_0
+         %14 = OpGroupNonUniformFMul %v2half %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2half %subgroupMul_6aaaf3
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl
new file mode 100644
index 0000000..29fa3bd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.spvasm
new file mode 100644
index 0000000..e075ecf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.wgsl
new file mode 100644
index 0000000..ff04f0e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/6aaaf3.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_6aaaf3();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl
new file mode 100644
index 0000000..7bf11a4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<f32>;
+
+
+// fn subgroupMul(value: vec<3, f32>) -> vec<3, f32>
+fn subgroupMul_93eccd() -> vec3<f32>{
+  var arg_0 = vec3<f32>(1.f);
+  var res: vec3<f32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..060f40f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..060f40f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.glsl
new file mode 100644
index 0000000..20fec53
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55fc01367498
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..376c3ba
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_93eccd "subgroupMul_93eccd"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v3float = OpTypeVector %float 3
+%tint_symbol_1 = OpTypeStruct %v3float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3float
+%_ptr_Function_v3float = OpTypePointer Function %v3float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v3float %float_1 %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3float = OpTypePointer StorageBuffer %v3float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_93eccd = OpFunction %v3float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3float Function
+        %res = OpVariable %_ptr_Function_v3float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3float %arg_0
+         %14 = OpGroupNonUniformFMul %v3float %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v3float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v3float %subgroupMul_93eccd
+         %24 = OpAccessChain %_ptr_StorageBuffer_v3float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl
new file mode 100644
index 0000000..3d6217f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.spvasm
new file mode 100644
index 0000000..c68ce95
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.wgsl
new file mode 100644
index 0000000..f6c42d8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/93eccd.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_93eccd();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl
new file mode 100644
index 0000000..caa487a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<i32>;
+
+
+// fn subgroupMul(value: vec<2, i32>) -> vec<2, i32>
+fn subgroupMul_d584a2() -> vec2<i32>{
+  var arg_0 = vec2<i32>(1i);
+  var res: vec2<i32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..1043c32
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..1043c32
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.glsl
new file mode 100644
index 0000000..d659d82
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown builtin method: 0x563ccb18e498
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..ee512ad
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_d584a2 "subgroupMul_d584a2"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%tint_symbol_1 = OpTypeStruct %v2int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2int
+%_ptr_Function_v2int = OpTypePointer Function %v2int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v2int %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2int = OpTypePointer StorageBuffer %v2int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_d584a2 = OpFunction %v2int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2int Function
+        %res = OpVariable %_ptr_Function_v2int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2int %arg_0
+         %14 = OpGroupNonUniformIMul %v2int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2int %subgroupMul_d584a2
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl
new file mode 100644
index 0000000..dcc93b4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.spvasm
new file mode 100644
index 0000000..f0bc6d8
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.wgsl
new file mode 100644
index 0000000..2f5f836
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/d584a2.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_d584a2();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl
new file mode 100644
index 0000000..7599523
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<u32>;
+
+
+// fn subgroupMul(value: vec<2, u32>) -> vec<2, u32>
+fn subgroupMul_dc672a() -> vec2<u32>{
+  var arg_0 = vec2<u32>(1u);
+  var res: vec2<u32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..48a080e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..48a080e
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.glsl
new file mode 100644
index 0000000..bd00261
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c7f9845498
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..d639042
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_dc672a "subgroupMul_dc672a"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v2uint = OpTypeVector %uint 2
+%tint_symbol_1 = OpTypeStruct %v2uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2uint
+%_ptr_Function_v2uint = OpTypePointer Function %v2uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v2uint %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2uint = OpTypePointer StorageBuffer %v2uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_dc672a = OpFunction %v2uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2uint Function
+        %res = OpVariable %_ptr_Function_v2uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2uint %arg_0
+         %14 = OpGroupNonUniformIMul %v2uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v2uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v2uint %subgroupMul_dc672a
+         %23 = OpAccessChain %_ptr_StorageBuffer_v2uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl
new file mode 100644
index 0000000..abd0f5d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.spvasm
new file mode 100644
index 0000000..703dc6d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.wgsl
new file mode 100644
index 0000000..30e8d6f
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dc672a.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dc672a();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl
new file mode 100644
index 0000000..ed91483
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
+
+
+// fn subgroupMul(value: vec<4, u32>) -> vec<4, u32>
+fn subgroupMul_dd1333() -> vec4<u32>{
+  var arg_0 = vec4<u32>(1u);
+  var res: vec4<u32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..cb314f0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..cb314f0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.glsl
new file mode 100644
index 0000000..84ecb95
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55c63ee3b498
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..687cf9b
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_dd1333 "subgroupMul_dd1333"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v4uint = OpTypeVector %uint 4
+%tint_symbol_1 = OpTypeStruct %v4uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4uint
+%_ptr_Function_v4uint = OpTypePointer Function %v4uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v4uint %uint_1 %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4uint = OpTypePointer StorageBuffer %v4uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_dd1333 = OpFunction %v4uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4uint Function
+        %res = OpVariable %_ptr_Function_v4uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4uint %arg_0
+         %14 = OpGroupNonUniformIMul %v4uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v4uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v4uint %subgroupMul_dd1333
+         %23 = OpAccessChain %_ptr_StorageBuffer_v4uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl
new file mode 100644
index 0000000..f716ad0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.spvasm
new file mode 100644
index 0000000..4387baf
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.wgsl
new file mode 100644
index 0000000..0775e48
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/dd1333.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_dd1333();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl
new file mode 100644
index 0000000..3466241
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl
@@ -0,0 +1,58 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// flags: --hlsl_shader_model 62
+
+
+enable subgroups;
+enable subgroups_f16;
+
+enable f16;
+
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<f16>;
+
+
+// fn subgroupMul(value: vec<4, f16>) -> vec<4, f16>
+fn subgroupMul_f2ac5b() -> vec4<f16>{
+  var arg_0 = vec4<f16>(1.h);
+  var res: vec4<f16> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..c63f071
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..c63f071
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.glsl
new file mode 100644
index 0000000..2ce277a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.glsl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown builtin method: 0x5624f8e9d498
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5ce9e45
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.ir.spvasm
@@ -0,0 +1,56 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability Float16
+               OpCapability UniformAndStorageBuffer16BitAccess
+               OpCapability StorageBuffer16BitAccess
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_f2ac5b "subgroupMul_f2ac5b"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %half = OpTypeFloat 16
+     %v4half = OpTypeVector %half 4
+%tint_symbol_1 = OpTypeStruct %v4half
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4half
+%_ptr_Function_v4half = OpTypePointer Function %v4half
+%half_0x1p_0 = OpConstant %half 0x1p+0
+         %11 = OpConstantComposite %v4half %half_0x1p_0 %half_0x1p_0 %half_0x1p_0 %half_0x1p_0
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4half = OpTypePointer StorageBuffer %v4half
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_f2ac5b = OpFunction %v4half None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4half Function
+        %res = OpVariable %_ptr_Function_v4half Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4half %arg_0
+         %14 = OpGroupNonUniformFMul %v4half %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4half %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4half %subgroupMul_f2ac5b
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4half %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl
new file mode 100644
index 0000000..ea66a94
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.msl
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.spvasm
new file mode 100644
index 0000000..d85f116
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.spvasm
@@ -0,0 +1,19 @@
+SKIP: FAILED
+
+
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.wgsl
new file mode 100644
index 0000000..4a26ccd
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f2ac5b.wgsl.expected.wgsl
@@ -0,0 +1,16 @@
+enable subgroups;
+enable subgroups_f16;
+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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f2ac5b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl
new file mode 100644
index 0000000..884ed87
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec2<f32>;
+
+
+// fn subgroupMul(value: vec<2, f32>) -> vec<2, f32>
+fn subgroupMul_f78398() -> vec2<f32>{
+  var arg_0 = vec2<f32>(1.f);
+  var res: vec2<f32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..b126694
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..b126694
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.glsl
new file mode 100644
index 0000000..23fee8a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown builtin method: 0x558c86103498
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..e9df1f5e4
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_f78398 "subgroupMul_f78398"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+      %float = OpTypeFloat 32
+    %v2float = OpTypeVector %float 2
+%tint_symbol_1 = OpTypeStruct %v2float
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v2float
+%_ptr_Function_v2float = OpTypePointer Function %v2float
+    %float_1 = OpConstant %float 1
+         %11 = OpConstantComposite %v2float %float_1 %float_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v2float = OpTypePointer StorageBuffer %v2float
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_f78398 = OpFunction %v2float None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v2float Function
+        %res = OpVariable %_ptr_Function_v2float Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v2float %arg_0
+         %14 = OpGroupNonUniformFMul %v2float %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v2float %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v2float %subgroupMul_f78398
+         %24 = OpAccessChain %_ptr_StorageBuffer_v2float %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl
new file mode 100644
index 0000000..6e8b845
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.spvasm
new file mode 100644
index 0000000..5a1fc58
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.wgsl
new file mode 100644
index 0000000..ea86df2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/f78398.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_f78398();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl
new file mode 100644
index 0000000..c092801
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec3<u32>;
+
+
+// fn subgroupMul(value: vec<3, u32>) -> vec<3, u32>
+fn subgroupMul_fa781b() -> vec3<u32>{
+  var arg_0 = vec3<u32>(1u);
+  var res: vec3<u32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..2e1da41
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..2e1da41
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.glsl
new file mode 100644
index 0000000..dc918b2
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown builtin method: 0x562286129498
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..5f2e953
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.ir.spvasm
@@ -0,0 +1,52 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 26
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_fa781b "subgroupMul_fa781b"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+       %uint = OpTypeInt 32 0
+     %v3uint = OpTypeVector %uint 3
+%tint_symbol_1 = OpTypeStruct %v3uint
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v3uint
+%_ptr_Function_v3uint = OpTypePointer Function %v3uint
+     %uint_1 = OpConstant %uint 1
+         %11 = OpConstantComposite %v3uint %uint_1 %uint_1 %uint_1
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %20 = OpTypeFunction %void
+%_ptr_StorageBuffer_v3uint = OpTypePointer StorageBuffer %v3uint
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_fa781b = OpFunction %v3uint None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v3uint Function
+        %res = OpVariable %_ptr_Function_v3uint Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v3uint %arg_0
+         %14 = OpGroupNonUniformIMul %v3uint %uint_3 Reduce %13
+               OpStore %res %14
+         %17 = OpLoad %v3uint %res
+               OpReturnValue %17
+               OpFunctionEnd
+%compute_main = OpFunction %void None %20
+         %21 = OpLabel
+         %22 = OpFunctionCall %v3uint %subgroupMul_fa781b
+         %23 = OpAccessChain %_ptr_StorageBuffer_v3uint %1 %uint_0
+               OpStore %23 %22
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl
new file mode 100644
index 0000000..bf91419
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.spvasm
new file mode 100644
index 0000000..f48340a
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.wgsl
new file mode 100644
index 0000000..5c55d4d
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fa781b.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fa781b();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl
new file mode 100644
index 0000000..fa90908
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl
@@ -0,0 +1,51 @@
+// Copyright 2024 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+//    contributors may be used to endorse or promote products derived from
+//    this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by 'tools/src/cmd/gen' using the template:
+//   test/tint/builtins/gen/gen.wgsl.tmpl
+//
+// To regenerate run: './tools/run gen'
+//
+//                       Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+enable subgroups;
+@group(0) @binding(0) var<storage, read_write> prevent_dce : vec4<i32>;
+
+
+// fn subgroupMul(value: vec<4, i32>) -> vec<4, i32>
+fn subgroupMul_fab258() -> vec4<i32>{
+  var arg_0 = vec4<i32>(1i);
+  var res: vec4<i32> = subgroupMul(arg_0);
+  return res;
+}
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.dxc.hlsl
new file mode 100644
index 0000000..9552fa0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.dxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl
new file mode 100644
index 0000000..9552fa0
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.fxc.hlsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown builtin method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.glsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.glsl
new file mode 100644
index 0000000..83d5dbe
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.glsl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown builtin method: 0x55f7efd1d498
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.spvasm b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.spvasm
new file mode 100644
index 0000000..ba500bb
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.ir.spvasm
@@ -0,0 +1,53 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 1
+; Bound: 27
+; Schema: 0
+               OpCapability Shader
+               OpCapability GroupNonUniformArithmetic
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpMemberName %tint_symbol_1 0 "tint_symbol"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %subgroupMul_fab258 "subgroupMul_fab258"
+               OpName %arg_0 "arg_0"
+               OpName %res "res"
+               OpName %compute_main "compute_main"
+               OpMemberDecorate %tint_symbol_1 0 Offset 0
+               OpDecorate %tint_symbol_1 Block
+               OpDecorate %1 DescriptorSet 0
+               OpDecorate %1 Binding 0
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%tint_symbol_1 = OpTypeStruct %v4int
+%_ptr_StorageBuffer_tint_symbol_1 = OpTypePointer StorageBuffer %tint_symbol_1
+          %1 = OpVariable %_ptr_StorageBuffer_tint_symbol_1 StorageBuffer
+          %7 = OpTypeFunction %v4int
+%_ptr_Function_v4int = OpTypePointer Function %v4int
+      %int_1 = OpConstant %int 1
+         %11 = OpConstantComposite %v4int %int_1 %int_1 %int_1 %int_1
+       %uint = OpTypeInt 32 0
+     %uint_3 = OpConstant %uint 3
+       %void = OpTypeVoid
+         %21 = OpTypeFunction %void
+%_ptr_StorageBuffer_v4int = OpTypePointer StorageBuffer %v4int
+     %uint_0 = OpConstant %uint 0
+%subgroupMul_fab258 = OpFunction %v4int None %7
+          %8 = OpLabel
+      %arg_0 = OpVariable %_ptr_Function_v4int Function
+        %res = OpVariable %_ptr_Function_v4int Function
+               OpStore %arg_0 %11
+         %13 = OpLoad %v4int %arg_0
+         %14 = OpGroupNonUniformIMul %v4int %uint_3 Reduce %13
+               OpStore %res %14
+         %18 = OpLoad %v4int %res
+               OpReturnValue %18
+               OpFunctionEnd
+%compute_main = OpFunction %void None %21
+         %22 = OpLabel
+         %23 = OpFunctionCall %v4int %subgroupMul_fab258
+         %24 = OpAccessChain %_ptr_StorageBuffer_v4int %1 %uint_0
+               OpStore %24 %23
+               OpReturn
+               OpFunctionEnd
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl
new file mode 100644
index 0000000..aefb640
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.msl
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: error: Unknown import method: subgroupMul
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.spvasm b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.spvasm
new file mode 100644
index 0000000..dab8a39
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.spvasm
@@ -0,0 +1,17 @@
+SKIP: FAILED
+
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}
+
+Failed to generate: 
diff --git a/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.wgsl b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.wgsl
new file mode 100644
index 0000000..154a2f3
--- /dev/null
+++ b/test/tint/builtins/gen/var/subgroupMul/fab258.wgsl.expected.wgsl
@@ -0,0 +1,14 @@
+enable subgroups;
+
+@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);
+  return res;
+}
+
+@compute @workgroup_size(1)
+fn compute_main() {
+  prevent_dce = subgroupMul_fab258();
+}